Testng在并行方法之间拆分dataProvider
Testng split dataProvider between parallel methods
我有一个 dataProvider,它正在从文本文件中读取数据。
@DataProvider (name = "dynamicDP", parallel = true)
public Iterator<Object> matchIDs() throws IOException {
final List<Object> list = new ArrayList<>();
for (final String line: Files.readAllLines(Paths.get("C:\mypath"),
StandardCharsets.UTF_8))
list.add(new Object[]{ line});
return list.iterator();
}
我的文本文件非常简单,它只包含以下这些数据(每对字母单独一行):
AA BB CC DD EE FF GG HH II KK
这是我的测试class:
public class dataProviderParallelTest {
@Test (dataProvider="dynamicDP")
public void verifyDPdata(String comingFromDP){
System.out.printf("%nDP#1..: "+comingFromDP);
}
@Test (dataProvider="dynamicDP")
public void verifyDPdata2(String comingFromDP){
System.out.printf("%nDP#2..: "+comingFromDP);
}
}
这是输出:
[TestNG] Running:
C:\projects\test\currentTest.xml
DP#1..: AA
DP#2..: BB
DP#1..: BB
DP#2..: AA
DP#1..: CC
DP#2..: CC
DP#1..: DD
DP#1..: EE
DP#2..: EE
DP#2..: DD
DP#1..: FF
DP#2..: FF
DP#1..: GG
DP#1..: HH
DP#2..: HH
DP#2..: GG
DP#1..: II
DP#2..: II
DP#1..: KK
DP#2..: KK
===============================================
Regression
Total tests run: 20, Failures: 0, Skips: 0
===============================================
这是我用来开始测试的 XML 文件:
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Regression" parallel="methods" thread-count="2" data-provider-thread-count="2">
<test name="smokeTest11">
<classes>
<class name="regression.bo.dataProviderParallelTest"/>
</classes>
</test>
</suite>
我试过的:
我读过这篇文章:cedricBlog
这个计算器 post:Whosebug
我想达到什么目的:
我正在尝试在两个线程之间共享数据。目前我刚刚实现了两个线程来执行 DP 提供的相同数据。我的目标是在两种方法之间拆分数据并获得如下输出(两种方法共享 DP 数据):
DP#1..: AA
DP#2..: BB
DP#1..: DD
DP#2..: EE
DP#1..: CC
DP#2..: GG
DP#1..: KK
DP#1..: HH
DP#2..: II
DP#2..: FF
这有可能吗,还是我遗漏了什么?预先感谢您的帮助!
将该方法作为数据提供程序的参数。将您的数据分成两个列表,无论您喜欢哪种方式。根据方法名称,return 每个列表一个。
例如
例如,以下代码在其@DataProvider 中打印测试方法的名称:
@DataProvider(name = "dynamicDP", parallel = true)
public Object[][] dynamicDP(Method m) {
System.out.println(m.getName());
//Divide list in two lists
if (m.getName().equals("Met1")
return list1
else
return list2
}
@Test(dataProvider="dynamicDP")
public void test1(String s) {
}
@Test(dataProvider="dynamicDP")
public void test2(String s) {
}
HTH
好的,发帖和我的解决方案供参考。总之就是这个。计算文件中的行数,并开始一次读取 1 行(从 10 个不同的线程),直到到达 EOF。这是:
public volatile int currentLine=0;
public static Object writeLock = new Object();
public static Object readLock = new Object();
public long currentThread = Thread.currentThread().getId();
@Test(invocationCount = 50)
public void readOneLineGetID() throws IOException{
countLines();
if(currentLine==noOfLines){throw new SkipException("%nSkipping this test method as we got all the records we need.");}
long threadID = Thread.currentThread().getId();
synchronized(readLock){
if(currentLine<noOfLines){
System.out.printf("%nCurrent thread is..: "+ threadID);
readASpecificLineFromATextFile(currentLine);
System.out.printf("%n----------------------------------------------------------");
}
}
synchronized(writeLock){
currentLine++;
}
}
所以我有 10 种这样的方法,我正在将我的测试同时推送到一个网格中心,然后使用 10 个不同的数据提供者来提供节点。
只是,次要点是 invocationCount(理想情况下我应该除以 10,然后相应地设置每个方法的调用计数;但因为我没有时间重新发明轮子这运行得非常非常快(通常只处理 200 行文件,我决定在行号达到 EOF 后跳过其余方法;))
这是输出(10 种方法,50 次调用计数从我的文件中找到 10 行模型并跳过其余部分):
在对同步进行一些修补之后,太棒了!!! :)
我有一个 dataProvider,它正在从文本文件中读取数据。
@DataProvider (name = "dynamicDP", parallel = true)
public Iterator<Object> matchIDs() throws IOException {
final List<Object> list = new ArrayList<>();
for (final String line: Files.readAllLines(Paths.get("C:\mypath"),
StandardCharsets.UTF_8))
list.add(new Object[]{ line});
return list.iterator();
}
我的文本文件非常简单,它只包含以下这些数据(每对字母单独一行):
AA BB CC DD EE FF GG HH II KK
这是我的测试class:
public class dataProviderParallelTest {
@Test (dataProvider="dynamicDP")
public void verifyDPdata(String comingFromDP){
System.out.printf("%nDP#1..: "+comingFromDP);
}
@Test (dataProvider="dynamicDP")
public void verifyDPdata2(String comingFromDP){
System.out.printf("%nDP#2..: "+comingFromDP);
}
}
这是输出:
[TestNG] Running:
C:\projects\test\currentTest.xml
DP#1..: AA
DP#2..: BB
DP#1..: BB
DP#2..: AA
DP#1..: CC
DP#2..: CC
DP#1..: DD
DP#1..: EE
DP#2..: EE
DP#2..: DD
DP#1..: FF
DP#2..: FF
DP#1..: GG
DP#1..: HH
DP#2..: HH
DP#2..: GG
DP#1..: II
DP#2..: II
DP#1..: KK
DP#2..: KK
===============================================
Regression
Total tests run: 20, Failures: 0, Skips: 0
===============================================
这是我用来开始测试的 XML 文件:
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Regression" parallel="methods" thread-count="2" data-provider-thread-count="2">
<test name="smokeTest11">
<classes>
<class name="regression.bo.dataProviderParallelTest"/>
</classes>
</test>
</suite>
我试过的: 我读过这篇文章:cedricBlog 这个计算器 post:Whosebug
我想达到什么目的: 我正在尝试在两个线程之间共享数据。目前我刚刚实现了两个线程来执行 DP 提供的相同数据。我的目标是在两种方法之间拆分数据并获得如下输出(两种方法共享 DP 数据):
DP#1..: AA
DP#2..: BB
DP#1..: DD
DP#2..: EE
DP#1..: CC
DP#2..: GG
DP#1..: KK
DP#1..: HH
DP#2..: II
DP#2..: FF
这有可能吗,还是我遗漏了什么?预先感谢您的帮助!
将该方法作为数据提供程序的参数。将您的数据分成两个列表,无论您喜欢哪种方式。根据方法名称,return 每个列表一个。
例如
例如,以下代码在其@DataProvider 中打印测试方法的名称:
@DataProvider(name = "dynamicDP", parallel = true)
public Object[][] dynamicDP(Method m) {
System.out.println(m.getName());
//Divide list in two lists
if (m.getName().equals("Met1")
return list1
else
return list2
}
@Test(dataProvider="dynamicDP")
public void test1(String s) {
}
@Test(dataProvider="dynamicDP")
public void test2(String s) {
}
HTH
好的,发帖和我的解决方案供参考。总之就是这个。计算文件中的行数,并开始一次读取 1 行(从 10 个不同的线程),直到到达 EOF。这是:
public volatile int currentLine=0;
public static Object writeLock = new Object();
public static Object readLock = new Object();
public long currentThread = Thread.currentThread().getId();
@Test(invocationCount = 50)
public void readOneLineGetID() throws IOException{
countLines();
if(currentLine==noOfLines){throw new SkipException("%nSkipping this test method as we got all the records we need.");}
long threadID = Thread.currentThread().getId();
synchronized(readLock){
if(currentLine<noOfLines){
System.out.printf("%nCurrent thread is..: "+ threadID);
readASpecificLineFromATextFile(currentLine);
System.out.printf("%n----------------------------------------------------------");
}
}
synchronized(writeLock){
currentLine++;
}
}
所以我有 10 种这样的方法,我正在将我的测试同时推送到一个网格中心,然后使用 10 个不同的数据提供者来提供节点。
只是,次要点是 invocationCount(理想情况下我应该除以 10,然后相应地设置每个方法的调用计数;但因为我没有时间重新发明轮子这运行得非常非常快(通常只处理 200 行文件,我决定在行号达到 EOF 后跳过其余方法;))
这是输出(10 种方法,50 次调用计数从我的文件中找到 10 行模型并跳过其余部分):
在对同步进行一些修补之后,太棒了!!! :)