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

时间:2013-09-01 13:13:55

标签: java multithreading testing selenium selenium-webdriver

我在使用多个线程与TestNG运行测试方法时遇到问题。

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

@Test(threadPoolSize=2,invocationCount=2)
public void mainRun() { ... }

它正在启动两个浏览器,用于按预期并行执行测试方法。启动浏览器后,必须在文本框中键入一些文本。因此,在此步骤中,文本在一个浏览器中“两次”发送到文本框,另一个浏览器处于空闲状态。

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

3 个答案:

答案 0 :(得分:2)

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

如果TestNG为每次调用创建一个新的类实例而不是共享同一个类实例,那么使驱动程序成为类实例属性只会解决问题。我不知道TestNG是如何以这种方式工作的,所以不能说它是否会解决你的问题。

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

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

e.g。

public static void doSomethingFoo(WebDriver driver) {

    // do something to the driver
}

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

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

答案 1 :(得分:1)

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

尝试在方法级别定义属性并让我知道会发生什么。

答案 2 :(得分:-1)

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

如果您想使用具有多个驱动程序的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
}

这是做什么的:

在每次调用具有该dataProvider的任何@Test之前,它将运行您的getDrivers()函数,并获取驱动程序。

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

如果这不是你想要的......那么请更具体地说明你想要的东西。