如何针对一个测试用例以并行模式执行测试数据级别执行

时间:2019-01-06 06:50:15

标签: selenium testng testng-dataprovider

我为每个数据集打开浏览器的多个实例,但是所有输入数据仅在一个实例/会话中输入,而不是在每个实例中输入每个数据集。我正在使用硒和TestNG

@DataProvider(name="URLprovider", parallel=true )
private Object[][] getURLs() {
  return new Object[][] {
      {"Fist data"},
      {"Second Data"},
      {"3 data"}
  };
 }

 @Test(dataProvider="URLprovider",threadPoolSize = 3)
 public void testFun(String url){
    BaseDriver baseReference = BaseDriver.getBaseDriverInstance();      
  System.out.println("Test class"+url +"=" 
       +Thread.currentThread().getId());

    driver = baseReference.initBrowser();       
    driver.get("http://stackoverflow.com/"); 
driver.findElement(By.xpath("//*@id='search']/div/input")).sendKeys(url);

}

因此,在这里我要并行打开三个浏览器实例(因为我们在@dataprovider中有3组数据)并在文本框中输入值。但是在执行代码3时,实例打开了,但是仅在一个实例中输入了测试数据值...但是我期望在一个实例中输入一个数据。

1 个答案:

答案 0 :(得分:0)

问题出在您的测试代码上。

您在testFun()中共享的测试代码似乎表明您在所有WebDriver迭代中都使用相同的@Test实例。 您尚未向我们展示BaseDriver baseReference = BaseDriver.getBaseDriverInstance();的外观,但是按照您的问题,我假设它返回的是相同的webdriver实例。

这说明了为什么所有测试方法似乎都共享同一webdriver实例。

要解决此问题,您需要执行以下一项操作:

  1. 在测试方法(即testFun()(或)”内部移动您的webdriver实例化逻辑
  2. 创建一个@BeforeMethod配置方法,该方法将负责创建浏览器实例并将其持久保存在ThreadLocal<RemoteWebDriver>实例和测试方法中,即testFun()获取当前线程的webdriver实例通过driver.get() [这里驱动程序的类型为ThreadLocal<RemoteWebDriver>。不要忘记将driver声明为静态变量。