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

环境配置

  使用工具Selenium、testng、cucumber、maven

工具介绍:

TestNG:

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

TestNG中使用的注解

 

注解

描述

@BeforeSuite

在该套件的所有测试都运行在注解的方法之前,仅运行一次。

@AfterSuite

在该套件的所有测试都运行在注解方法之后,仅运行一次。

@BeforeClass

在调用当前类的第一个测试方法之前运行,注解方法仅运行一次。

@AfterClass

在调用当前类的第一个测试方法之后运行,注解方法仅运行一次。

@BeforeTest 注解的方法将在属于test标签内的类的所有测试方法运行之前运行(xml文件的test标签)。

@AfterTest

注解的方法将在属于test标签内的类的所有测试方法运行之后运行(xml文件的test标签)。

@BeforeGroups 注解方法将在之前运行组列表。 此方法保证在调用属于这些组中的任何一个的第一个测试方法之前不久运行。
@AfterGroups 注解方法将在之后运行组列表。该方法保证在调用属于任何这些组的最后一个测试方法之后不久运行。
@BeforeMethod 注解方法将在每个测试方法之前运行。
@AfterMethod 注解方法将在每个测试方法之后运行。
@DataProvider

标记一种方法来提供测试方法的数据。 注解方法必须返回一个Object [] [],其中每个Object []可以被分配给测试方法的参数列表。 要从该DataProvider接收数据的@Test方法需要使用与此注释名称相等的dataProvider名称。

@Factory

将一个方法标记为工厂,返回TestNG将被用作测试类的对象。 该方法必须返回Object []。

@Listeners

定义测试类上的侦听器。

@Parameters

描述如何将参数传递给@Test方法。

@Test

将类或方法标记为测试的一部分,此标记若放在类上,则该类所有公共方法都将被作为测试方法。

 

注解之间存在执行顺序

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包

  1. cucumber-java

  2. cucumber-core
  3. cucumber-testng

  4. gherkin

  5. selenium-java

  6. 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文件来执行我们的测试用。

执行完成以后得到执行结果

posted @ 2019-07-03 09:55  運命の出会い  阅读(1544)  评论(1编辑  收藏  举报