在上一篇文章中,我们可能最疑惑的是@Test类似的注解是什么东西,它用来中什么。下面我们来讲解该部分内容。
这里是TestNG的支持列表中的注解:
注解 | 描述 |
@BeforeSuite | 注解的方法将只运行一次,被注释的方法将在所有测试运行前运行。 |
@AfterSuite | 注解的方法将只运行一次,被注释的方法将在所有测试运行后运行。 |
@BeforeClass | 注解的方法将只运行一次,被注释的方法将在测试运行前运行。 |
@AfterClass | 注解的方法将只运行一次,被注释的方法将在测试运行后运行。 |
@BeforeTest | 注解的方法将被运行之前的任何测试方法属于内部类的 <test>标签的运行。 |
@AfterTest | 注解的方法将被运行后,所有的测试方法,属于内部类的<test>标签的运行。 |
@BeforeGroups | 组的列表,被配置的方法将在列表中的gourp前运行。此方法是保证在运行属于任何这些组第一个测试方法,该方法被调用。 |
@AfterGroups | 组的名单,这种配置方法后,将运行。此方法是保证运行后不久,最后的测试方法,该方法属于任何这些组被调用。 |
@BeforeMethod | 注解的方法将每个测试方法之前运行。 |
@AfterMethod | 被注释的方法将被运行后,每个测试方法。 |
@DataProvider | 标志着一个方法,提供数据的一个测试方法。注解的方法必须返回一个Object[] [],其中每个对象[]的测试方法的参数列表中可以分配。 该@Test 方法,希望从这个DataProvider的接收数据,需要使用一个dataProvider名称等于这个注解的名字。 |
@Factory | 作为一个工厂,返回TestNG的测试类的对象将被用于标记的方法。该方法必须返回Object[]。 |
@Listeners | 定义一个测试类的监听器。 |
@Parameters | 介绍如何将参数传递给@Test方法。 |
@Test | 标记一个类或方法作为测试的一部分。 |
使用 TestNG,不仅可以指定测试方法,还可以用专门的标注 @Configuration指定类中的其他特定方法,这些方法叫做 配置方法。配置方法有四种类型:
- beforeTestClass方法在类实例化之后,但是在测试方法运行之前执行。
- afterTestClass方法在类中的所有测试方法执行之后执行。
- beforeTestMethod方法在类中的任何测试方法执行之前执行。
- afterTestMethod方法在类中的每个测试方法执行之后执行。
图 1进一步描述了测试类的生命周期。
图 1. 测试类的生命周期
清单 1 演示了配置方法的一些示例。请注意,如果您使用组,那么配置方法也必须属于某个组。而且,配置方法的四种类型彼此之间不是互斥的,所以可以把方法定义成同时属于一种或多种配置方法类型。(作为例子,请参阅清单 1 中的 aroundTestMethods()
方法)。
清单 1. 配置方法示例
@Configuration(beforeTestClass = true, groups = {"tests.workflow"}) public void setUp() { System.out.println("Initializing..."); } @Configuration(afterTestMethod = true, beforeTestMethod = true , groups = {"tests.workflow"}) public void aroundTestMethods() { System.out.println("Around Test"); }
TestNG 中的配置方法是 JUnit 的 setUp()
和 tearDown()
方法的增强版;它们的主要目的是为测试创建正确的执行上下文,并在测试用例执行之后刷新数据。
我们来验证一下,TestNG中主要的注解的执行顺序
- import java.util.*;
- import org.testng.Assert;
- import org.testng.annotations.*;
- public class TestNGTest1 {
- private Collection collection;
- @BeforeClass
- public void oneTimeSetUp() {
- // one-time initialization code
- System.out.println("@BeforeClass - oneTimeSetUp");
- }
- @AfterClass
- public void oneTimeTearDown() {
- // one-time cleanup code
- System.out.println("@AfterClass - oneTimeTearDown");
- }
- @BeforeMethod
- public void setUp() {
- collection = new ArrayList();
- System.out.println("@BeforeMethod - setUp");
- }
- @AfterMethod
- public void tearDown() {
- collection.clear();
- System.out.println("@AfterMethod - tearDown");
- }
- @Test
- public void testEmptyCollection() {
- Assert.assertEquals(collection.isEmpty(),true);
- System.out.println("@Test - testEmptyCollection");
- }
- @Test
- public void testOneItemCollection() {
- collection.add("itemA");
- Assert.assertEquals(collection.size(),1);
- System.out.println("@Test - testOneItemCollection");
- }
- }
所以这一段代码执行后的结果如下:
- @BeforeClass - oneTimeSetUp
- @BeforeMethod - setUp
- @Test - testEmptyCollection
- @AfterMethod - tearDown
- @BeforeMethod - setUp
- @Test - testOneItemCollection
- @AfterMethod - tearDown
- @AfterClass - oneTimeTearDown
- PASSED: testEmptyCollection
- PASSED: testOneItemCollection
分析以上运行结果:
- 首先,所有beforeSuite()方法只执行一次。
- 最后,afterSuite的()方法只执行一次。
- 即使方法 beforeTest(),beforeClass(), afterClass() 和afterTest() 方法只执行一次。
- beforeMethod()方法执行每个测试用例,但在此之前执行的测试用例。
- afterMethod()方法执行每个测试用例,但测试用例执行后。
TestNG测试的一个方法的生命周期:
@BeforeClass(执行一次)
@BeforeMethod(N个Test 方法执行N次)
@Test Test方法(此注解可能在类上表示多个,在方法表示一个)
@AfterMethod(N个Test 方法执行N次)
@AfterClass(执行一次)