I have a single test which receives data from data provider. I would like this test to run in parallel with different values from data provider .
I tried an approach like :
public class IndependentTest
{
@Test(dataProvider = "dp1" ,threadPoolSize=3,invocationCount=1)
public void testMethod(int number)
{
Long id = Thread.currentThread().getId();
System.out.println("HELLO : " + id);
}
@DataProvider(name = "dp1",parallel=true)
public Object[][] dp1() {
return new Object[][] {
new Object[] { 1 },
new Object[] { 2 },
new Object[] { 3 },
new Object[] { 4 },
new Object[] { 5 },
new Object[] { 6 },
new Object[] { 7 },
new Object[] { 8 }
};
}
}
The output i received is :
HELLO : 10
HELLO : 12
HELLO : 17
HELLO : 11
HELLO : 16
HELLO : 14
HELLO : 13
HELLO : 15
Spawned 10 threads while i specified 5 in the thread pool size .
Could you please tell what has to be added to the above snippet to control the data provider thread pool size .
You need to use dataproviderthreadcount
. The threadpoolsize
and invocationcount
values are not required. See details here.
In testng.xml you can set thread count for the dataprovider via data-provider-thread-count="3"
<suite name="Manage" data-provider-thread-count="3" >
<test name="Manage data tests">
<classes>
<class name="uk.example.ExampleTest"></class>
</classes>
</test>
</suite>
Try to set the thread pool in following way:
@BeforeClass
public void setupClassName(ITestContext context) {
context.getCurrentXmlTest().getSuite().setDataProviderThreadCount(5);
context.getCurrentXmlTest().getSuite().setPreserveOrder(false);
}
Currently only one thread is getting used as you have define invocationCount
as 1, if you change it to 3 then three workers thread will get used.
invocationCount
:- The number of times this method should be invoked.
threadPoolSize
:- The size of the thread pool for this method. The method will be invoked from multiple threads as specified by invocationCount.
Note: this attribute is ignored if invocationCount is not specified.
Also,
You can also specify that a @Test
method should be invoked from different threads. You can use the attribute threadPoolSize
to achieve this result:
@Test(threadPoolSize = 3, invocationCount = 10, timeOut = 10000)
public void testServer() {
In this example, the function testServer will be invoked ten times from three different threads. Additionally, a time-out of ten seconds guarantees that none of the threads will block on this thread forever.
More info can be found here