51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 11080|回复: 2
打印 上一主题 下一主题

Selenium + TestNG + Cucumber + Maven 行为驱动测试框架

[复制链接]
  • TA的每日心情
    擦汗
    昨天 08:59
  • 签到天数: 1021 天

    连续签到: 2 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2020-8-5 12:02:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    环境配置


      使用工具Selenium、testng、cucumber、maven


      工具介绍:


      TestNG:


      TestNG是一个开源自动化测试框架,TestNG类似于JUnit(特别是JUnit 4),但它不是JUnit框架的扩展。它的灵感来源于JUnit。它的目的是优于JUnit,尤其是在用于测试集成多类时。


      TestNG中使用的注解

     注解之间存在执行顺序
      BeforeSuite -> BeforeTest -> BeforeClass -> BeforeMethod -> Test-> AfterMethod -> AfterClass -> AfterTest -> AfterSuite
      TestNG 中的xml文件
      使用ide或eclipse执行引用了testng标签类的话会自动生成一个default.xml文件,当然我们也可以通过新建配置文件的方式来执行我们的测试类。
      下面是一个简略的tesng.xml文件
    1. <?xml version="1.0" encoding="UTF-8"?>

    2.   <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">

    3.   <suite name="Suite" parallel="tests" thread-count="2" preserve-order="true">

    4.   <parameter name="runip" value="http://10.168.1.191:4444"/>

    5.   <test name="Test1">

    6.   <classes>

    7.   <class name="web.runner.service.AddStaffRunner" />

    8.   <class name="web.runner.service.UpdateStaffRunner" />

    9.   <class name="web.runner.service.DisableStaffRunnner" />

    10.   <class name="web.runner.service.SearchStaffRunner" />

    11.   </classes>

    12.   </test>

    13.   <test name="Test2">

    14.   <classes>

    15.   <class name="web.runner.protal.LoginRunner"/>

    16.   </classes>

    17.   </test>

    18.   </suite>
    复制代码
    说明:


      suite定义一个测试套件,可以设置是否使用多线程,可包含多个测试用例或者测试group。


      parallel = classes  在相同线程中相同类中的运行所有的方法,但是每个类都会用不同的线程运行。


      thread-count =2  可同时执行2个case。


      preserve-order = true   classes和methods按照配置中的顺序执行,false为乱序执行。


      parameter 标签传递参数。


      Cucumber介绍


      Cucumber可以让人们用近似自然的语言去描述Feature和场景,根据Feature驱动开发。用作软件技术人员和非技术之间验收测试的桥梁。它是一个命令行工具。运行后,会执行features中的内容。feature中的step会调用stepdefinitions,stepdefinitions就是用代码来描述的场景与步骤,我们将Cucumber这个框架和Selenium结合起来实现自动化测试,就可以让我们的自动化过程体现出行为驱动的特性。


    feature文件的基本构成
      Given: Given一般用于在Scenario中描述系统的初始状态。它的目的是使系统在使用前处于一个已知的状态,要避免在Given中谈论交互上的事情。
      When: When描述一个事件或者动作。他可以是与系统间的交互,也可以是由另一个系统触发的事件。cucumber强烈推荐每个Scenario只有一个When,当你觉得需要加更多的When的时候,通常就是需要拆分成多个Scenario的信号。
      Then: Then描述期望的输出或者结果。对Then的step definition应该使用断言去比较期望值和实际值,就和[url=]单元测试[/url]差不多。
      But和And: 当有几个Given,When,Then的时候,可以用And和But增加其可读性(不推荐使用and和but)。
      Background :当在同一个Feature里有多个Scenario有相同Given的时候,可以使用Background将这些Given抽到一起。这样这个Feature的每个Scenario在运行的时候,都会先运行一次Background。(不要设置复杂的状态、尽量简短、一个feature只能有一个background)。
      Scenario :表示一个测试场景。
      Scenario Outline :表示参数化的测试场景,与Examples配合使用,每次运行feature文件时都会去逐行读取Examples中的参数运行该场景。
      对应传统测试工具:
      Feature (功能)-------------test suite (测试用例集)
      Scenario(情景)-----------test case (测试用例)
      Given(给定)-------------setup(创建测试所需环境)
      When(当)----------------test(触发被测事件)
      Then(则)-----------------assert(断言,验证结果)
      创建Maven工程
      在pom文件中配置相关jar包
      cucumber-java
      cucumber-core
      cucumber-testng
      gherkin
      selenium-java
      testng


    配置完成后,maven会从maven中央仓库自动下载相关的jar包文件,并自动导入。
      创建feature文件:


    这是一个简单的登录场景,大概流程为进入到登录页面,然后输入用户名和密码,最后点击提交按钮,再验证登录是否成功,参数化每次运行逐行读取Examples中的参数,所以这个场景会以不同的参数运行四次。
      可以看出这个常用是用简单的描述性语言写的,具有很高的可读性,不需要懂代码也可以看明白这个用例测试的内容。
      定义并关联测试Step(步骤):

    1.   package web.testcases.protal;

    2.   import org.openqa.selenium.WebDriver;

    3.   import io.cucumber.java.en.Given;

    4.   import io.cucumber.java.en.Then;

    5.   import io.cucumber.java.en.When;

    6.   import web.autotest.untils.BrowserDriver;

    7.   import web.page.base.HomeBasePage;

    8.   import web.step.base.protal.LoginDefinition;

    9.   public class LoginTestCase{

    10.   public static WebDriver driver;

    11.   private LoginDefinition loginDef;

    12.   private HomeBasePage homeBasePage;

    13.   public LoginTestCase() {

    14.   driver = new BrowserDriver().setUp();

    15.   loginDef = new LoginDefinition(driver);

    16.   homeBasePage = new HomeBasePage(driver);

    17.   }

    18.   @Given("^进入到登录页面$")

    19.   public void toLoginPage(){

    20.   loginDef.toFunction("登录");

    21.   }

    22.   @When("^登录界面输入用户名(.*)密码(.*)点击登录按钮$")

    23.   public void ClickBtnToHome(String username, String password){

    24.   loginDef.LoginFunction(username, password);

    25.   }

    26.   @Then("^判断正确登录情况是否正确(.*)$")

    27.   public void VerifyRight (String message){

    28.   loginDef.verifyEquals(homeBasePage.getText(homeBasePage.userinfometion), message);

    29.   }

    30.   @Then("^判断错误登录情况是否正确(.*)$")

    31.   public void VerifyError(String message){

    32.   loginDef.verifyEquals(loginDef.isTextPresent(message));

    33.   }

    34.   }
    复制代码
    在步骤类中通过注解来关联feature文件中的步骤,“(.*)”表示匹配所有传过来的参数,也可使用正则表达式进行匹配,而步骤方法中则是你需要调用的方法
      创建Runner类
      使用runner类的主要目的是可使用testng来调用feature文件,并生成测试结果。也可以把feature文件所要执行的内容看成一个@Test方法,在Runner中可以自由使用testng中的注解,比如每次运行结束后在@AfterMethod注解方法中关闭[url=]浏览器[/url]。


    说明:
      该类必须继承AbstractTestNGCucumberTests类,否则使用testng调用该类时会找不到feature文件。
      features:feature文件所在路径,该路径必须是项目全路径去掉项目名的路径。
      glue:步骤类所在包名,只需要写包名成即可,包名中的“.”使用“/”代替。
      pulgin:插件,这里使用的是指定html与json结果存放路径。
      monochrome:表示在控制台输出时,输出的信息是否可读,ture表示可读,false表示非可读。
      配置TestNG文件


    配置完成以后可以通过运行该xml文件来执行我们的测试用。
      执行完成以后得到执行结果




    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏1
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-9-20 00:04 , Processed in 0.064493 second(s), 24 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表