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 行模型并跳过其余部分):

在对同步进行一些修补之后,太棒了!!! :)