编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

详解TestNg中的依赖和并发

wxchong 2024-06-27 01:15:13 开源技术 10 ℃ 0 评论

我在之前的文章十分钟上手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的面试中被问及最多的热点,相信掌握了他们一定会帮你在面试中加分,赢得面试官的认可。而原创不易,如果文章帮到了你,欢迎转发,让更多的朋友受益!

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表