美文网首页接口自动化测试单元测试Unit Test
(二)TestNG学习之路—注解及属性概览

(二)TestNG学习之路—注解及属性概览

作者: Tomandy | 来源:发表于2018-08-29 17:56 被阅读52次

    前言

    TestNG提供了诸多注解,允许开发/测试人员灵活地组织强大的测试用例。

    注解概览

    注解/属性 描述
    @BeforeSuite 带@BeforeSuite注释的方法将在本套件中所有测试运行之前运行。
    @AfterSuite 带@AfterSuite注释的方法将在本套件中所有测试运行之后运行。
    @BeforeTest @BeforeTest注解的方法将在testNG.xml文件test标签内的所有类方法运行前执行。
    @AfterTest @AfterTest注解的方法将在testNG.xml文件test标签内的所有类方法运行后执行。
    @BeforeGroups 被@BeforeGroups注解的方法会在组列表中之前被调用。
    @AfterGroups 被@AfterGroups注解的方法会在组列表中之后被调用。
    @BeforeClass 在调用当前类中的第一个测试方法之前,将运行带@BeforeClass注释的方法。
    @AfterClass 在运行当前类中的所有测试方法之后,将运行带@AfterClass注释的方法。
    @BeforeMethod @BeforeMethod注释的方法将在每个测试方法之前运行。
    @AfterMethod @AfterMethod注释的方法将在每个测试方法之后运行。
    alwaysRun 对于在方法之前的调用(BeforeSuite,...除了beforeGroups),若为true,这个配置方法无视其所属的组而运行.对于在方法之后的调用(afterSuite, afterClass, ...),若为true, 这个配置方法会运行,即使其之前一个或者多个被调用的方法失败或者被跳过。
    dependsOnGroups 方法依赖的组列表。
    dependsOnMethods 方法依赖的方法列表。
    enabled 是否执行注解的测试。
    groups 类/方法所属的组列表。
    inheritGroups 默认是true,则此方法会从属于在类级由@Test注解中所指定的组。举例如下:
    @Test(groups = "Tomandy")
    public class TestNGHelloWorld {
    @BeforeClass(inheritGroups = false) //如果xml文件配置按Tomandy组执行的话,@BeforeClass注解的方法不会被执行
    public void setUp(){
    System.out.println("setUp!");
    }
    @Test(groups = "Tom")
    public void helloWorld(){
    System.out.println("My first TestNG testCase!");
    }
    }
    onlyForGroups 只适用于@BeforeMethod和@AfterMethod。如果指定了,那么只有当相应的测试方法属于所列的组之一时,才会调用这个setup/teardown方法。
    @DataProvider 将方法标记为测试方法提供数据。带@DataProvider注释的方法必须返回一个对象[][]。想要从这个DataProvider接收数据的@Test方法需要使用dataProvider属性,此属性值必须与@DataProvider注解中的名字相同。
    @DataProvider(name = "casesProvider")
    @Test(dataProvider = "casesProvider")
    name dataProvider的名称。如果没有提供,默认为@DataProvider标注方法的名称。
    parallel 默认为false,如果为true,将并行执行测试,可大大提高用例执行效率。
    @Factory 将方法标记为工厂,该工厂返回将被TestNG用作测试类的对象。方法必须返回对象[]。
    @Listeners 定义监听器。
    value 继承org.testng.ITestNGListener的classe数组。继承IAnnotationTransformer和IAnnotationTransformer2的类不允许使用@Listeners,可通过testNG.xml定义。
    @Parameters 给一个@Test方法传参。
    value 方法参数的变量列表。
    @Test 把一个类或者方法标记为测试的一部分。
    alwaysRun 如果为true,则该测试方法依然会被运行即使其所依赖的方法执行失败。为false的话,则该测试方法会被skip如果其所依赖的方法执行失败。
    dataProvider 此测试方法的dataProvider的名称。
    dataProviderClass 查找dataProvider的类。如果没有指定,则在当前测试方法所在的类或者它的基类中去查。如果指定了该属性,则@DataProvider注解的方法需在指定的类上保持静态(static),举例如下:
    @DataProvider(name = "casesProvider")
    public static Object[][] caseProvider(){}

    --------------------------------------------------------
    @Test(dataProvider = "casesProvider", dataProviderClass = CasesDataProvider.class)
    public void runCases(){}
    dependsOnGroups 方法依赖的组列表。
    dependsOnMethods 方法依赖的方法列表。
    description 方法描述。
    enabled 是否执行@Test()注解的测试。
    expectedExceptions 期望测试方法抛出的异常列表。如果没有异常或在此列表中没有异常,则此测试将被标记为失败。
    groups 类/方法所属的组列表。
    invocationCount 调用方法的次数。
    invocationTimeOut 当前测试中所有调用累计时间的最大毫秒数。如果invocationCount属性没有指定,那么此属性会被忽略。
    priority 标注测试方法的优先级。较低的优先级将优先执行。
    successPercentage 当前方法执行所期望的成功率。
    singleThreaded 如果设置为true,那么这个测试类中的所有方法都保证在同一个线程中运行,即使测试当前使用parallel="methods"运行。这个属性只能在类级别使用,如果在方法级别使用,它将被忽略
    timeOut 当前测试需要的最大毫秒数,超过该时间则执行失败。
    threadPoolSize 此方法的线程池的大小。该方法将根据invocationCount值,启用多个线程调用。如果没有指定invocationCount,则忽略此属性。

    举例说明

    1、@BeforeXXX @AfterXXX

    根据testng.xml文件配置,可了解测试级别为:suite -> test -> class -> method。test指的是testng.xml中的test 标签,而不是测试类里的一个 @Test。测试类里的@Test实际上对应的是method。所以在使用 @BeforeSuite、 @BeforeTest、 @BeforeClass、 @BeforeMethod这些标签的时候,它们的实际执行顺序也是按照上述级别来的。

    • 关于上述的注解,举例如下:
    import org.testng.annotations.*;
    
    @Test(groups = "Tomandy")
    public class TestNGHelloWorld {
        @BeforeSuite(groups = "bfSuite")
        public void bfSuite(){
            System.out.println("TestNGHelloWorld BeforeSuite!");
        }
    
        @BeforeClass(enabled = false)  //不可执行
        public void bfClass(){
            System.out.println("TestNGHelloWorld BeforeClass!");
        }
    
        @BeforeTest(dependsOnGroups = "bfSuite")  //依赖bfSuite组
        public void bfTest(){
            System.out.println("TestNGHelloWorld BeforeTest!");
        }
    
        @BeforeGroups(groups = {"Tom"})
        public void bfGroups(){
            System.out.println("TestNGHelloWorld BeforeGroups!");
        }
    
        @BeforeMethod(alwaysRun = true,dependsOnGroups = "bfSuite")//依赖bfSuite组,alwaysRun
        public void bfMethod(){
            System.out.println("TestNGHelloWorld BeforeMethod!");
        }
    
        @Test(groups = "Tom")
        public void helloWorldTest(){
            System.out.println("TestNGHelloWorld Test!");
        }
    
        @AfterSuite
        public void afSuite(){
            System.out.println("TestNGHelloWorld AfterSuite!");
        }
    
        @AfterClass()
        public void afClass(){
            System.out.println("TestNGHelloWorld AfterClass!");
        }
    
        @AfterTest
        public void afTest(){
            System.out.println("TestNGHelloWorld AfterTest!");
        }
    
        @AfterGroups(groups = "Tom")
        public void afGroups(){
            System.out.println("TestNGHelloWorld AfterGroups!");
        }
    
        @AfterMethod
        public void afMethod(){
            System.out.println("TestNGHelloWorld AfterMethod!");
        }
    
    }
    
    

    testNG.xml配置如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
    <suite name="Default Suite">  <!-- 可定义测试套件名称 -->
        <test name="TestNG">
    
            <groups>
                <run>
                    <include name="Tomandy"/>
                </run>
            </groups>
            <classes >
                <class name="TestNGHelloWorld"/>
            </classes >
        </test> <!-- TestNG -->
    </suite> <!-- Default Suite -->
    

    运行结果如下:

    TestNGHelloWorld BeforeSuite!
    TestNGHelloWorld BeforeTest!
    TestNGHelloWorld BeforeGroups!
    TestNGHelloWorld BeforeMethod!
    TestNGHelloWorld Test!
    TestNGHelloWorld AfterMethod!
    TestNGHelloWorld AfterGroups!
    TestNGHelloWorld AfterClass!
    TestNGHelloWorld AfterTest!
    TestNGHelloWorld AfterSuite!
    
    ===============================================
    Default Suite
    Total tests run: 1, Failures: 0, Skips: 0
    ===============================================
    
    • 超类上的注解,子类也将得到继承。在这种情况下,TestNG保证“@Before”方法按照继承顺序执行(首先是最高的超类,然后向下继承链),以及“@After”方法按照相反的顺序执行(向上继承链)。
      父类:
    import org.testng.annotations.*;
    
    public class Car {
        @BeforeClass
        public void beforeClass() {
            System.out.println("Car BeforeClass");
        }
    
        @Test
        public void carTest() {
            System.out.println("Car Test");
        }
    
        @AfterClass
        public void afterClass() {
            System.out.println("Car AfterClass");
        }
    }
    

    子类:

    import org.testng.annotations.*;
    
    public class BMW extends Car{
    
        @Test
        public void BMWTest() {
            System.out.println("BMW Test");
        }
    
        @AfterClass
        public void afterClass() {
            System.out.println("BMW AfterClass");
        }
    }
    

    运行子类输出如下:

    Car BeforeClass
    BMW Test
    Car Test
    BMW AfterClass
    
    ===============================================
    Default Suite
    Total tests run: 2, Failures: 0, Skips: 0
    ===============================================
    

    由于beforeClass方法未在子类实现,因此是子类调用父类中的beforeClass方法,AfterClass和Test也是一样,因此,一些公共操作,可以统一在父类中封装实现,子类只实现各自不同的方法。

    2、@DataProvider @Factory @Listeners @Parameters @Test

    该部分注解后续文章再做详述。

    相关文章

      网友评论

      本文标题:(二)TestNG学习之路—注解及属性概览

      本文链接:https://www.haomeiwen.com/subject/nfptwftx.html