详解TestNg中的依赖和并发
  qTGkBRdHYMul 2023年11月02日 62 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);
  }
}

运行结果,如下:

 

详解TestNg中的依赖和并发_用例

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中的依赖和并发_Test_02

总结

各个测试框架的基础功能几乎都一样!不同的框架会提供一些特色功能,TestNG中的依赖和并发就是最为重要的两个实用功能,也是在关于TestNG的面试中被问及最多的热点,相信掌握了他们一定会帮你在面试中加分,赢得面试官的认可。而原创不易,如果文章帮到了你,欢迎转发,让更多的朋友受益!

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  xaeiTka4h8LY   2024年05月17日   52   0   0 数据库JavaSQL
  2iBE5Ikkruz5   2023年12月12日   92   0   0 JavaJavaredisredis
qTGkBRdHYMul