详解TestNg中的依赖和并发
我在之前的文章十分钟上手TestNg讲解了TestNG的基础功能使用,今天给大家介绍一下TestNG框架中两个非常重要的功能:依赖和并发。这也是它强于Junit4的两个重点!
依赖
TestNG的依赖主要包括方法的依赖和组的依赖。dependsOnMethods在被依赖的方法运行完成之后运行当前方法,如果依赖方法测试不通过,那么当前方法也不会继续运行了,依赖的方法可以有多个。dependsOnGroups和依赖方法类似,在被依赖组运行完成之后运行当前组,如果依赖组中的方法没有测试能过,那么当前的方法也不会继续运行了,依赖组可以有多个。
例如:
public class DependencyCase {
@Test
public void m1() {
assertTrue(true);
}
@Test
public void m2() {
assertTrue(false);
}
@Test(dependsOnMethods={"m1","m2"})
public void m3() {
assertTrue(true);
}
}
运行结果,如下:
m3依赖m1和m2,因为m2是fail,所以m3没有执行!如果你希望不论前置方法是否成功运行,有依赖的后置方法都会得到运行,那么需要在TestNG方法注解上,加一个alwaysRun=true属性。dependsOnGroups与dependsOnMethods类似,在这里就不在赘述了。
用例并发测试
TestNG有多种并发方式支持,主要包括:方法的并发,class级的并发,和test级的并发,它们的区别如下:
tests级别:不同test tag下的用例可以在不同的线程执行,相同test tag下的用例只能在同一个线程中执行。
classs级别:不同class tag下的用例可以在不同的线程执行,相同class tag下的用例只能在同一个线程中执行。
methods级别:所有用例都可以在不同的线程去执行。
xml文件中配置如下
<suitename="Testng Parallel Test"parallel="tests"thread-count="5">
<suitename="Testng Parallel Test"parallel="classes"thread-count="5">
<suitename="Testng Parallel Test"parallel="methods"thread-count="5">
<suitename="My suite" parallel="instances" thread-count="5">
实践中,很多时候我们在测试类中通过dependOnMethods/dependOnGroups方式,给很多测试方法的执行添加了依赖,以达到期望的执行顺序。TestNG能在多线程情况下依然遵循既定的用例执行顺序去执行。
有些时候,我们需要对一个测试用例,比如一个http接口,执行并发测试,即一个接口的反复调用。在 @Test标签中指定threadPoolSize和invocationCount可以实现该需求。
例如:@Test(threadPoolSize=5,invocationCount=10)
其中threadPoolSize表明用于调用该方法的线程池容量,该例就是同时起5个线程并行执行该方法;invocationCount表示该方法总计需要被执行的次数。该例子中5个线程同时执行,当总计执行次数达到10次时,停止。
实例如下:
写两个类 ThreadCase1和ThreadCase1
public class ThreadCase1 {
@Test
public void m1() throws InterruptedException {
Thread.sleep(1000);
System.out.println("*****"+Thread.currentThread().getId());
assertTrue(true);
}
@Test
public void m2() throws InterruptedException {
Thread.sleep(1000);
System.out.println("*****"+Thread.currentThread().getId());
assertTrue(false);
}
@Test
public void m3() throws InterruptedException {
Thread.sleep(1000);
System.out.println("*****"+Thread.currentThread().getId());
assertTrue(true);
}
}
public class ThreadCase2 {
@Test
public void m1() throws InterruptedException {
Thread.sleep(1000);
System.out.println("*****"+Thread.currentThread().getId());
assertTrue(true);
}
@Test
public void m2() throws InterruptedException {
Thread.sleep(1000);
System.out.println("*****"+Thread.currentThread().getId());
assertTrue(false);
}
@Test
public void m3() throws InterruptedException {
Thread.sleep(1000);
System.out.println("*****"+Thread.currentThread().getId());
assertTrue(true);
}
}
在配置文件中指定parallel为class,thread-count值为2
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="TestngParallel Test" parallel="classes "thread-count="2">
<test name="case1">
<classes>
<class name="com.my.test5.ThreadCase1"/>
<class name="com.my.test5.ThreadCase2"/>
</classes>
</test>
</suite>
查看运行结果:3292ms完成测试,如果不使用多线程则至少需要6s
总结
各个测试框架的基础功能几乎都一样!不同的框架会提供一些特色功能,TestNG中的依赖和并发就是最为重要的两个实用功能,也是在关于TestNG的面试中被问及最多的热点,相信掌握了他们一定会帮你在面试中加分,赢得面试官的认可。而原创不易,如果文章帮到了你,欢迎转发,让更多的朋友受益!