Java 在使用TestNG的多线程运行测试方法时,几乎没有问题

Java 在使用TestNG的多线程运行测试方法时,几乎没有问题,java,multithreading,testing,selenium,selenium-webdriver,Java,Multithreading,Testing,Selenium,Selenium Webdriver,当使用多线程和TestNG运行测试方法时,我面临一个问题 使用以下配置的两个线程运行测试方法两次: @Test(threadPoolSize=2,invocationCount=2) public void mainRun() { ... } 它正在启动两个浏览器,以便按照预期并行执行测试方法。启动浏览器后,它必须在文本框中键入一些文本。因此,在此步骤中,文本在一个浏览器中“两次”发送到文本框,而另一个浏览器处于空闲状态 有人能指导我如何克服这个问题吗?我对你的问题还不够了解(你是如何在两个驱

当使用多线程和TestNG运行测试方法时,我面临一个问题

使用以下配置的两个线程运行测试方法两次:

@Test(threadPoolSize=2,invocationCount=2)
public void mainRun() { ... }
它正在启动两个浏览器,以便按照预期并行执行测试方法。启动浏览器后,它必须在文本框中键入一些文本。因此,在此步骤中,文本在一个浏览器中“两次”发送到文本框,而另一个浏览器处于空闲状态


有人能指导我如何克服这个问题吗?

我对你的问题还不够了解(你是如何在两个驱动程序上实例化和运行命令的)…但我相信我知道你想要什么

如果您想使用TestNG和多个驱动程序进行并行测试,那么我认为您需要使用
@dataProvider

@dataProvider(parallel=true, name= "drivers")
public Object[][] getDrivers(){
    return new Object[][]{{firefoxDriver},{chromeDriver}};
}

@Test(dataProvider="drivers")
public void mainRun(WebDriver driver){
    test goes here
}
它的作用是:

在调用任何具有该数据提供程序的
@Test
之前,它将运行getDrivers()函数,并获取驱动程序

这是一个二维数组,因为第一个维度是传递给测试的数据集,而第二个维度是要传递的数据集


如果这不是您想要的…那么请更具体地说明您想要什么。

我想知道您的驱动程序对象是否是一个类属性,因此在调用之间共享?这两个线程可能正在引用相同的属性。虽然我不确定多次运行一个方法时TestNG是如何工作的,但在同一个类中并行运行不同的方法时,这是一个问题


尝试在方法级别定义属性,并告诉我发生了什么。

您的驱动程序存储在静态属性中,因此两个线程同时访问它,这将解释您看到的行为

只有当TestNG为每次调用创建一个新的类实例而不是共享同一个类实例时,将驱动程序设置为类实例属性才能解决问题。我不知道TestNG是如何以这种方式工作的,所以不能说它是否能解决您的问题

如果要进行相同的webdriver测试,请使用@invocationCount在并行线程中多次运行,那么测试方法必须是隔离的和原子的,而使用静态webdriver不支持这一点

要允许静态方法访问webdriver实例,则必须将webdriver对象作为参数传递到静态方法中

e、 g

在TestNG中,还有其他方法可以运行不同测试方法的并行线程,例如创建一个套件xml文件,但即使这样,使用静态属性存储webdriver实例也会导致相同的问题


也许使用此静态属性不是一个好主意。

有人能帮我吗?我需要查看您的其余代码。您的驱动程序实例化可能有问题。@Robbie:代码的其余部分正在调用驱动程序设置方法。。驱动程序=新的Firefox驱动程序(dc)@dataprovider用于提供数据驱动的测试。您不需要它并行运行是的……但他说“使用TestNG的多线程”。这对我来说是一种尖叫。然而,看起来驱动程序是静态的是他的问题。是的,但是“如果你想用多个驱动程序的TestNG进行并行测试,那么我相信你需要使用@dataProvider。”是一个不正确的陈述,可能会导致将来的混乱。刚刚看到你对代码的评论。我认为以上是你的问题。在方法中移动设置代码并在方法中声明“driver”。如果您希望并行运行测试(而不是并行运行同一测试),请查看创建testng套件xml文件并规定线程数,驱动程序对象是在类级别创建的[static WebDriver driver;]。如果我在方法级别定义它,其他方法如何使用驱动程序对象?如果我不清楚,请告诉我。我需要并行运行同一个测试类,以便同时启动两个运行测试的浏览器。啊,它是静态的。它需要是静态的吗?静态对象只存在一次,所以这肯定是您的问题。尝试删除“static”谢谢Robbie,将驱动程序对象设置为非静态并作为静态方法的参数传递解决了我的问题。也感谢您的澄清。!!
public static void doSomethingFoo(WebDriver driver) {

    // do something to the driver
}