51Testing软件测试论坛

标题: Selenium + TestNG + Cucumber + Maven 行为驱动测试框架 [打印本页]

作者: lsekfe    时间: 2020-8-5 12:02
标题: Selenium + TestNG + Cucumber + Maven 行为驱动测试框架
环境配置


  使用工具Selenium、testng、cucumber、maven


  工具介绍:


  TestNG:


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


  TestNG中使用的注解
[attach]129166[/attach]
 注解之间存在执行顺序
  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结合起来实现自动化测试,就可以让我们的自动化过程体现出行为驱动的特性。

[attach]129167[/attach]
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

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

[attach]129169[/attach]
这是一个简单的登录场景,大概流程为进入到登录页面,然后输入用户名和密码,最后点击提交按钮,再验证登录是否成功,参数化每次运行逐行读取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]。

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

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

[attach]129172[/attach]



作者: Miss_love    时间: 2020-12-25 13:55
支持分享




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2