全栈自动化测试实战:基于TestNG、HttpClient、Selenium和Appium
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.3 TestNG注解

TestNG和其他很多Java框架(比如JUnit、Spring等)一样,使用了大量的注解。被不同注解修饰的类、方法具有不同的含义,本节对TestNG注解进行详细介绍,并按照使用场景把注解分成4类。

(1)前置条件和后置条件

把注解作为前置条件(或初始化操作)和后置条件(或清理操作)使用。

(2)数据驱动

TestNG的特点之一是数据驱动,即测试用例和测试数据分离,以便维护和管理。

(3)测试用例

该分类只有一个@Test注解。@Test注解的作用是对测试用例进行控制,该注解中的方法有很多,后面会对常用方法进行介绍。

(4)监听器

该分类只有一个@Listeners注解。监听器的作用是监控测试过程,如果采用默认监听器,则不需要任何配置;如果使用自定义监听器,则需要使用@Listeners注解或testng.xml文件进行配置。由于篇幅所限,本章不对自定义监听器进行介绍,有兴趣的读者可以自行查阅相关资料。

2.3.1 前置条件和后置条件

先来看看各注解的含义。

@BeforeSuite:在该Suite的所有Test都未运行之前运行。

@AfterSuite:在该Suite的所有Test都运行之后运行。

一个Suite对应一个顶级模块,比如一个软件项目分为4个模块,那么每个模块就是一个Suite。一般结合testng.xml文件中的<suite>或<suite-files>标签进行使用。

@BeforeTest:在该Test的所有Class都未运行之前运行。

@AfterTest:在该Test的所有Class都运行之后运行。

一个Test对应一个子模块,一般结合testng.xml文件中的<test>标签进行使用。

@BeforeClass:在该Class的所有@Test方法都未运行之前运行。

@AfterClass:在该Class的所有@Test方法都运行之后运行。

一个Class对应一个Java类,在该Java类中,用@BeforeClass(或@AfterClass)修饰的方法会在该Class的所有@Test方法都运行之前(或之后)运行。

@BeforeMethod:在该Class的每个@Test方法运行之前运行。

@AfterMethod:在该Class的每个@Test方法运行之后运行。

一个Method对应一个Java方法,在Java类中用@BeforeMethod(或@AfterMethod)修饰的方法会在该Class的每个@Test方法运行之前(或之后)运行。

@BeforeGroups:在该Class第一个分组的@Test方法运行之前运行。

@AfterGroups:在该Class最后一个分组的@Test方法运行之后运行。

Group的控制粒度介于Class和Method之间,一个Class可以包含多个Group,一个Group可以包含多个Method。

只看文字是很生硬的,下面通过例子来说明以上注解。删除FirstClassTest中的内容,输入以下代码:

保存代码,在“FirstClassTest.java”上用鼠标右击,从弹出的快捷菜单中选择“Run As → TestNG Test”选项,此时Eclipse的控制台输出如下:

下面对运行结果进行说明。

①可以看出@BeforeSuite、@AfterSuite、@BeforeTest、@AfterTest、@BeforeClass和@AfterClass控制测试执行的粒度是不同的,即Suite>Test>Class。

②一个测试用例(@Test修饰的Java方法)可以属于多个分组,比如上面示例的testCase4。当多个分组都设置了对应的@BeforeGroups和@AfterGroups注解时,执行顺序是Before Group1→Before Group2→After Group2→After Group1。

③@BeforeMethod和@AfterMethod共执行了4次,因为有4个测试用例。

2.3.2 数据驱动

TestNG做数据驱动时使用了@DataProvider和@Parameters注解,后者需要和testng.xml文件配合。举一个登录的场景,每种不同的输入都对应了不同的提示。

删除FirstClassTest中的内容,输入以下代码:

保存代码,在FirstClassTest.java上用鼠标右击,从弹出的快捷菜单中选择“Run As → TestNG Test”选项,此时Eclipse的控制台输出如下:

被@DataProvider修饰的Java方法称为数据提供者,该方法返回一个对象二维数组。如果一个测试用例需要该数据,那么就通过@Test注解的dataProvider方法传入数据提供者的名称。

2.3.3 测试用例

@Test注解的方法很多,前面已经介绍过groups和dataProvider了,下面再介绍几种常用的。

删除FirstClassTest中的内容,输入以下代码:

保存代码,在“FirstClassTest.java”上用鼠标右击,从弹出的快捷菜单中选择“Run As → TestNG Test”选项,此时Eclipse的控制台输出如下:

下面对运行结果进行说明。

①description代表测试用例描述,控制台会打印输出该描述。

②priority代表优先级,数字越小,优先级越高,默认值为0。testCase2的priority值为2,会最后一个执行;testCase3的priority值为1,会倒数第二个执行。如果级别一样,则执行顺序默认按方法名排序。

③enabled的默认值为true,代表不启用。当enabled的值为false时,表示禁用,因此testCase6并未执行。

④testCase4和testCase5都抛出了运行时异常,因此执行失败。

⑤dependsOnMethods代表依赖一个或多个方法,dependsOnGroups代表依赖一个或多个分组。一旦被依赖的测试用例执行失败,则TestNG将跳过该测试用例。但没有跳过testCase7,原因是testCase7加了alwaysRun方法,并将值设为true,代表始终执行,在默认情况下,该值为false。建议尽量不要使用dependsOnMethods和dependsOnGroups,因为违背了测试用例需要解耦的原则。