Testng在并行方法之间拆分dataProvider

时间:2017-02-21 17:17:25

标签: parallel-processing testng dataprovider

我有一个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

这甚至可能还是我错过了什么?在此先感谢您的帮助!

2 个答案:

答案 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个模型行并跳过其余的):

enter image description here

经过一些修补同步,美丽! :)