lsekfe 发表于 2020-8-5 12:02:03

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

环境配置


  使用工具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文件
<?xml version="1.0" encoding="UTF-8"?>

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

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

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

  <test name="Test1">

  <classes>

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

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

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

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

  </classes>

  </test>

  <test name="Test2">

  <classes>

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

  </classes>

  </test>

  </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应该使用断言去比较期望值和实际值,就和单元测试差不多。
  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(步骤):

package web.testcases.protal;

  import org.openqa.selenium.WebDriver;

  import io.cucumber.java.en.Given;

  import io.cucumber.java.en.Then;

  import io.cucumber.java.en.When;

  import web.autotest.untils.BrowserDriver;

  import web.page.base.HomeBasePage;

  import web.step.base.protal.LoginDefinition;

  public class LoginTestCase{

  public static WebDriver driver;

  private LoginDefinition loginDef;

  private HomeBasePage homeBasePage;

  public LoginTestCase() {

  driver = new BrowserDriver().setUp();

  loginDef = new LoginDefinition(driver);

  homeBasePage = new HomeBasePage(driver);

  }

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

  public void toLoginPage(){

  loginDef.toFunction("登录");

  }

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

  public void ClickBtnToHome(String username, String password){

  loginDef.LoginFunction(username, password);

  }

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

  public void VerifyRight (String message){

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

  }

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

  public void VerifyError(String message){

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

  }

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


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


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




Miss_love 发表于 2020-12-25 13:55:18

支持分享
页: [1]
查看完整版本: Selenium + TestNG + Cucumber + Maven 行为驱动测试框架