Java和Python的主流测试框架测试开发那些事儿

详解TestNg中的依赖和并发

2020-06-22  本文已影响0人  测试开发Kevin

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

上一篇下一篇

猜你喜欢

热点阅读