我有一个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
这是我的测试类:
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 这个stackoverflow帖子:stackOverFlow
我想要实现的目标: 我试图在两个线程之间共享数据。目前我刚刚实现了两个线程来执行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
这甚至可能还是我错过了什么?在此先感谢您的帮助!
答案 0 :(得分:1)
将方法作为参数提供给dataprovider。无论您喜欢哪种方式,都可以将数据分成两个列表。根据方法名称,返回一个列表。
例如
例如,以下代码在其@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 :(得分:0)
好的,张贴和我的解决方案供参考。简而言之就是这样。计算文件中的行数,并开始一次读取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个模型行并跳过其余的):
经过一些修补同步,美丽! :)