当前位置: 首页 > 知识库问答 >
问题:

多线程TestNG数据提供程序执行

冯德宇
2023-03-14

我正在尝试通过TestNG进行多线程测试@beforethod为测试实例化WebDrivers<代码>@AfterMethod在测试后关闭WebDrivers@Dataprovider提供测试数据,以便在循环中多次运行。

 import java.lang.reflect.Method;

 import org.openqa.selenium.By;
 import org.openqa.selenium.WebDriver;
 import org.openqa.selenium.chrome.ChromeDriver;
 import org.testng.annotations.AfterMethod;
 import org.testng.annotations.AfterSuite;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
 public class MultipleSession {
     private WebDriver driver;
 
     @BeforeMethod
     public void beforeMethod() {
         System.err.println("Before ID" + Thread.currentThread().getId());
         System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
         if (driver == null) {
             driver = new ChromeDriver();
             
             driver.get("https://www.google.co.in/");
         }
 
     }
 
     @DataProvider(name = "sessionDataProvider", parallel = true)
     public static Object[][] sessionDataProvider(Method method) {
         int len = 12;
 
         Object[][] parameters = new Object[len][1];
         for (int i = 0; i < len; i++) {
             parameters[i][0] = i;
 
         }
         return parameters;
     }
 
     @Test(dataProvider = "sessionDataProvider")
     public void executSessionOne(int input) {
         System.err.println("Test ID" + Thread.currentThread().getId());
 
     
 
         driver.findElement(By.name("q")).sendKeys(input + "");
         try {
             Thread.sleep(5000);
         } catch (InterruptedException e) {
             
             e.printStackTrace();
         }
 
     }
 
     @AfterMethod
     public void afterMethod() {
         System.err.println("After ID" + Thread.currentThread().getId());
     }
 
     @AfterSuite
     public void afterSuite() {
         driver.close();
         driver.quit();
     }
  }

我的问题是,尽管TestNG一次打开10个浏览器,但任务只由一个浏览器执行,而其他9个浏览器什么都不做。

如何将在beforeMethod中声明的Webdriver实例分发给所有线程?


共有1个答案

屈浩波
2023-03-14
private WebDriver driver;

这一行表示只有一个webdriver实例,driver=new ChromeDriver() 一次又一次地实例化同一个驱动程序对象。

要解决此问题,请创建一个工厂,并在每个@测试方法中向工厂请求驱动程序对象。工厂的示例代码如下

static synchronized RemoteWebDriver getDriver()
{
System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
         if (driver == null) {
             driver = new ChromeDriver()
}

 类似资料:
  • 我想在类中与数据提供者并行运行测试方法。我需要一个数据提供者,它每次在新测试方法开始为给定的测试运行生成部分动态数据之前都会被调用。让我用伪代码解释一下: 我怎样才能做到这一点?

  • 我有一个TestNG Dataprovider测试,如下所示: 输入csv 读者 测验 有许多输入文件,每个测试都包含一个优先级。我想单独运行优先级为1的测试。 在没有数据提供者的情况下,我可以使用下面的IMethodInterceptor过滤测试。 样品测试: 由于数据提供者的优先级是动态的,因此我无法根据优先级过滤测试。 不应执行其他测试,而应跳过其他测试。

  • 我已使用以下方法在应用程序中输入凭据。 其中EnterText定义如下: 在测试类中,我写了下面的代码 我得到以下错误: 失败:loginProxy(“11”,“Priya”)java.lang.NumberFormatException:java.lang.Integer处为空。parseInt(未知源)位于java.lang.Integer。parseInt(未知源) 请帮助解决同样的问题。据

  • 有人知道TestNG如何根据为测试方法指定的数据提供者名称计算出数据提供者方法是什么吗? 我找到了这个解决方案:https://gist.github.com/ae6rt/3805639 但是,它没有考虑到数据提供者可能是: 在完全不同的类别中定义,或 在父类中定义,并且 该方法可以是静态的,也可以是非静态的 我试图自己破解一些东西,但后来我想我不可能是第一个试图解决这个问题的人,特别是因为显然T

  • 我是Spock的新手,目前正在使用它,但我继承了大量需要重复使用的测试配置文件。每个配置文件都是一个JSON,与Spec类同名。对于每种试验方法,都有一个带有参数的地图列表,例如: TestNG允许我在数据提供者方法中传递测试方法名称,因此我可以根据测试类名和测试方法名称返回映射列表。我的基类中只有一个数据提供者方法: 作为这种方法的结果,我得到了一组映射,用于每个测试迭代。然后我将这个方法指定为

  • 我想在TestNg中并行运行硒测试,使用“数据提供者”。理想情况下,测试是按方法并行的(一个测试=一个方法),而不是简单的浏览器套件并行。我在某个地方读到过,一次可以控制大约5个ChromeDriver实例,所以我认为这应该是可能的。稍后,我计划转移到grid2。对于开发,我将通过右键单击XML配置文件上的运行来运行IntelliJ idea测试运行程序。 我在并行运行测试时遇到了问题(在grid