
关于执行顺序
从上到下的顺序
@BeforeSuite 在测试套开始时候执行
@BeforeTest 在测试测试开始时候执行,在 xml 中表现为在 标签的测试中最开始执行
@BeforeClass 在测试的类最开始时候执行,在 xml 中表现为在 标签中开始执行
@BeforeGroup 在测试分组时候开始执行
@BeforeMethod 在每一个测试方法之前执行,测试的方法为标注了 @Test 注解的方法
@Test 测试的方法用例
@AfterMethod
@AfterGroup
@AfterClass
@AfterTest
@AfterSuite
关于 @Test
关于测试是否执行
// 默认是执行的
@Test
@Test(enabled = true)
// 被标注的测试用例将不会执行
@Test(enabled = false)
关于测试方法依赖于上一个
第一个方法错误,后面依赖于其的测试方法也不会执行!
@Test
public void fun1() {}
@Test(dependsOnMethod = {"fun1"})
public void fun2() {}
关于多线程方面
// 2 线程,执行 3 次,这个执行两次不是每个线程执行 2 次,而是一共执行 2 次,每次执行测试方法唱过 10 ms 的就表示超时
@Test(threadPoolSize = 2, invocationCount = 3, timeOut = 10000)
关于 groups
testng 中 groups 相对于测试方法而言,实际测试中可以将具有相似功能方法进行分组运行。一个测试方法可以属于一个组也可以属于多个组
下面是测试类
// 测试的类如下
public class Demo {
@Test(groups = {"group1"})
public void fun1() {}
@Test(groups = {"group1"})
public void fun2() {}
@Test(groups = {"group1, group2"})
public void fun3() {}
@Test(groups = {"group2"})
public void fun4() {}
@Test(groups = {"group2"})
public void fun5() {}
}
下面是 xml 中的结构
// testng.xml 中的一个 test
<test verbose="2" name="balabala">
<groups>
<run>
<include name="group1" />
<exclude name="group2" />
</run>
</groups>
<classes>
<class name="xxx.xxx.Demo">
<methods>
<include name="testMethod1" />
<include name="testMethod2" />
</methods>
</class>
</classes>
</test>
结果是只会运行 group1 且无 group2 的测试用例
关于 @DateProvider
利用其可以进行大量参数
注意由于下面 dataprovider 提供两组数据,则下方 test 方法串行的执行了两遍,分别对应着两组数据
这个功能对应的场景就是在测某一个功能模块时候要求通过几种传参来测就可以用这种方式了
public class Demo {
@DateProvider(name = "xxx")
public Object[][] fun() {
return new Object[][] {
{"参数列表1", 0, 1},
{"参数列表2", 2, 3}
};
}
@Test(dataProvider = "xxx")
public void funTest(String param1, int param2, int param3) {
}
}
注解执行需要初始化类吗
先说结论:会自动调用类的构造器,且只调用一次
我们发现 testng 和 junit 还是比较不同的,以 junit 5 举例,它的@BeforeAll
注解要求标志 static 方法,也就是不用初始化一个类,但是 testng 中从@BeforeSuite
一直到@Test
都需要一个实例化的对象,而且不管有几个同类的注解只用调用一次构造器,实例化一个对象就行。
还需要注意的是如果我们自己手动写一个无参的构造器是完全没有问题的,如果我们写一个有参的构造器呢?比如说参数是 int 或者 boolean,这样我们再去运行发现就运行不起来了,如果我们写一个 String 类型的传参的构造器,那么也是可以运行的起来的,这个 String 会被自动传成项目名
多线程怎么运行
testng 可以结合 surefire 插件来多线程运行,假如线程并行级别为 test 级别,那么意味着<Test>
标签会被识别为一个新的线程,<test>
标签又对应着@BeforeTest
注解,也就是说有一个测试类 A 其中有@BeforeSuite
和@BeforeTest
,那么在多线程,线程级别是 test 级别下运行的时候,A 实例化一个新对象 a1,a1 中会执行@BeforeSuite
和@BeforeTest
,然后又开启一个新的线程,新的线程会实例化 A 为 a2,然后 a2 中只会执行@BeforeTest
,因为并行级别为 test