0

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

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

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

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

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

4

3 回答 3

2

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

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

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

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

例如

public static void doSomethingFoo(WebDriver driver) {

    // do something to the driver
}

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

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

于 2013-09-01T21:04:00.503 回答
1

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

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

于 2013-09-01T14:15:29.170 回答
-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
}

这是做什么的:

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

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

如果这不是您正在寻找的......那么请更具体地说明您想要什么。

于 2013-09-01T13:54:53.750 回答