有两个测试类,每个测试类都在并行模式下使用datatProvider。
public class FirstNg {
@Test(dataProvider = "dp11", description="f one")
public void f11(Integer n, String s) throws InterruptedException {
System.out.println("DP FIR ----" + Thread.currentThread().getId() + "----" + System.currentTimeMillis());
Thread.sleep(4000);
}
@DataProvider(parallel = true)
public Object[][] dp11() {
return new Object[][] { new Object[] { 1, "a" }, new Object[] { 2, "b" }, new Object[] { 3, "c" },
new Object[] { 4, "d" }};
}
}
public class SecondNg {
@Test(dataProvider = "dp22", description="f two")
public void f22(Integer n, String s) throws InterruptedException {
System.out.println("DP SEC ----" + Thread.currentThread().getId() + "----" + System.currentTimeMillis());
Thread.sleep(4000);
}
@DataProvider(parallel = true)
public Object[][] dp22() {
return new Object[][] { new Object[] { 1, "a" }, new Object[] { 2, "b" }, new Object[] { 3, "c" },
new Object[] { 4, "d" }};
}
}
测试运行的持续时间是通过在贝福仪和Atersuite中确定的时间计算的。
案例1-没有任何线程并行设置。
<suite name="suite" data-provider-thread-count="2">
<test name="test">
<classes>
<class name="FirstNg"/>
<class name="SecondNg"/>
</classes>
</test>
</suite>
这给出以下结果。
DP FIR ----12----1552410839748
DP FIR ----11----1552410839752
DP FIR ----12----1552410843753
DP FIR ----11----1552410843756
DP SEC ----13----1552410847763
DP SEC ----14----1552410847764
DP SEC ----13----1552410851767
DP SEC ----14----1552410851768
DURATION - 16.936 secs
前两行开始属于第一类类的数据a。这是两个成对重复的(等于数据提供者 - 线程计数的值),然后使用secondng类的数据。
案例2-与线程并行设置一起运行至方法。
<suite name="Surefire suite" data-provider-thread-count="2" parallel="methods">
<test name="Surefire test">
<classes>
<class name="testngparallel.FirstNg"/>
<class name="testngparallel.SecondNg"/>
</classes>
</test>
</suite>
这给出以下结果。
DP SEC ----14----1552412828961
DP FIR ----13----1552412828962
DP FIR ----16----1552412828964
DP SEC ----15----1552412828966
DP FIR ----13----1552412832972
DP FIR ----16----1552412832977
DP SEC ----15----1552412832979
DP SEC ----14----1552412832980
DURATION - 8.161 secs
前四行开始在一起。两个行属于第一个dataprovider,而另外两个属于第二行。重复此操作,直到所有DataProvider的所有行都用尽。
从这个讨论中,似乎有2个池,一个用于dataprovider,一个用于其他测试-https://groups.google.com/forum/# !! topic/testng-users/bkkfsghoachu
添加并行="方法"设置,减少了测试执行的时间。此外,更改了测试的顺序,两个数据aprovider的测试都混合在一起。两个设置之间的连接是什么?
添加并行="方法"设置,减少了测试时间 执行。另外,测试的顺序也会更改,两者都进行了测试 DataProvider混合了。两者之间的联系是什么 设置?
基本上,这两个设置控制了不同的执行方面。所有测试方法都可以分为两类。
- 常规测试方法
- 由数据提供商支持的测试方法。
testng具有两个特定的设置,可以通过
满足上述两类的需求-
thread-count
-哪个在任何给定点可以同时运行多少个常规测试方法。 -
data-provider-thread-count
-哪个在任何给定点控制的,可以同时运行的数据驱动的测试方法。
当您启用这两个设置(以及当您有常规和数据驱动测试方法的混合时)时,发生的情况是,如果有数据驱动的数据驱动的测试方法,这些数据驱动的迭代也是并行执行的。
就像您同时旋转一堆线,但其中一个或多个线程在内部旋转其他线程。
此设置为您提供了执行速度的最大吞吐量,但是如果您具有更大的值(通过添加这两个设置值获得),则可以影响整体性能,因为现在JVM将开始执行更多上下文切换安排线程并完成工作。
以简单术语为2N-1
的线程数的经验法则(其中N
代表处理器中的内核数。因此,如果您有Quad Core处理器,则最大线程计数应为7)。这是计算线程计数的一种过于简单的方法,但是要意识到这对我有所帮助。
要简要介绍数据提供商注释的parallel = true
,允许使用测试数据的每个迭代使用单独的线程池,而不管并行方法/类/测试/无。
当您将parallel = true
添加到数据提供商注释中时,它将考虑一个单独的池,该池使用data-provider-thread-count
提供的大小(默认为10)。因此,当使用数据提供程序进行测试时,即使您在套件配置中设置parallel=none
,也将使用单独的线程池并行执行。
案例parallel=none
和数据提供者parallel = false
或不设置:每个方法(包括数据提供程序的迭代)都将在同一线程中运行。
DP FIR ----1----1552433313814
DP FIR ----1----1552433317824
DP FIR ----1----1552433321834
DP FIR ----1----1552433325839
Normal FIR2 ----1----1552433329848
DP SEC ----1----1552433333855
DP SEC ----1----1552433337859
DP SEC ----1----1552433341865
DP SEC ----1----1552433345871
Normal SEC2 ----1----1552433349876
案例parallel=none
和Data-Provider parallel = true
:
所有方法都需要在同一线程中依次执行的所有方法接受数据驱动的方法。如果该方法是数据驱动的,则在转到数据驱动器时,如果数据支持者parallel = true
,当前线程将使用单独的池并行运行每个迭代。在以下执行中,一个数据管理器将设置为parallel = true
,而另一个数据则将其设置为不。因此,您可以看到当前线程在" DP FIR"的单独池中执行迭代,并在当前线程中以" DP SEC"运行所有迭代。(默认为10)
DP FIR ----10----1552433554893
DP FIR ----12----1552433554893
DP FIR ----11----1552433554893
DP FIR ----13----1552433554894
Normal FIR2 ----1----1552433558907
DP SEC ----1----1552433562916
DP SEC ----1----1552433566923
DP SEC ----1----1552433570928
DP SEC ----1----1552433574933
Normal SEC2 ----1----1552433578938
<suite name="suite" >
<test name="test">
<classes>
<class name="FirstNg" />
<class name="SecondNg" />
</classes>
</test>
</suite>
public class FirstNg {
@Test(dataProvider = "dp11", description = "f one")
public void f11(Integer n, String s) throws InterruptedException {
System.out.println("DP FIR ----" + Thread.currentThread().getId() + "----" + System.currentTimeMillis());
Thread.sleep(4000);
}
@Test
public void f12() throws InterruptedException {
System.out.println("Normal FIR2 ----" + Thread.currentThread().getId() + "----" + System.currentTimeMillis());
Thread.sleep(4000);
}
@DataProvider(parallel = true)
//@DataProvider
public Object[][] dp11() {
return new Object[][] { new Object[] { 1, "a" }, new Object[] { 2, "b" }, new Object[] { 3, "c" },
new Object[] { 4, "d" } };
}
}
public class SecondNg {
@Test(dataProvider = "dp22", description="f two")
public void f22(Integer n, String s) throws InterruptedException {
System.out.println("DP SEC ----" + Thread.currentThread().getId() + "----" + System.currentTimeMillis());
Thread.sleep(4000);
}
@Test
public void f222() throws InterruptedException {
System.out.println("Normal SEC2 ----" + Thread.currentThread().getId() + "----" + System.currentTimeMillis());
Thread.sleep(4000);
}
//@DataProvider(parallel = true)
@DataProvider
public Object[][] dp22() {
return new Object[][] { new Object[] { 1, "a" }, new Object[] { 2, "b" }, new Object[] { 3, "c" },
new Object[] { 4, "d" }};
}
}
案例parallel=methods or classes
:
使用parallel=methods
,它将开始并行执行,具体取决于thread-count
在XML配置中提供的尺寸池。同样,如果该方法是数据驱动的,那么当轮到时,分配的线程将在平行单独的池中运行每个迭代。否则分配的线程以顺序运行每个迭代。
您可以看到分配给" dp fir"的线程在" dp fir"的单独池中执行迭代,但在" dp sec"的分配线程中运行所有迭代。
DP FIR ----14----1552433989613
Normal FIR2 ----11----1552433989614
DP FIR ----17----1552433989613
DP SEC ----12----1552433989613
DP FIR ----16----1552433989613
DP FIR ----15----1552433989616
Normal SEC2 ----13----1552433989617
DP SEC ----12----1552433993625
DP SEC ----12----1552433997632
DP SEC ----12----1552434001640
案例parallel=methods or classes
和数据提供者parallel = false
或不设置:
当数据驱动方法的转弯到来时,每次迭代都将在分配的线程中按顺序执行。