我在使用TestNG的多个线程运行测试方法时遇到问题 .
使用以下配置的两个线程运行测试方法两次:
@Test(threadPoolSize=2,invocationCount=2) public void mainRun() { ... }
它正在启动两个浏览器,用于按预期并行执行测试方法 . 启动浏览器后,必须在文本框中键入一些文本 . 因此,在此步骤中,文本在一个浏览器中“两次”发送到文本框,另一个浏览器处于空闲状态 .
有人可以指导我如何克服这个问题吗?
我想知道你的驱动程序对象是否是一个类属性,因此在调用之间共享?两个线程可能引用相同的属性 . 虽然我不确定多次运行方法时TestNG的工作原理,但在并行运行同一个类中的不同方法时,这是一个问题 .
尝试在方法级别定义属性并让我知道会发生什么 .
您的驱动程序存储在静态属性中,因此两个线程同时访问它,这将考虑您所看到的行为 .
如果TestNG为每个调用创建一个新的类实例而不是共享同一个类实例,那么使驱动程序成为类实例属性只会解决问题 . 我不知道TestNG是如何以这种方式工作的,所以不能说它是否能解决你的问题 .
如果你想要使用相同的webdriver测试,使用@invocationCount在并行线程中运行多次,那么你的测试方法必须是隔离的和原子的,并且使用静态webdriver不支持这一点 .
要允许静态方法访问webdriver实例,则必须将webdriver对象作为参数传递给static方法;
例如
public static void doSomethingFoo(WebDriver driver) { // do something to the driver }
还有其他方法在TestNG中运行不同测试方法的并行线程,例如创建套件xml文件,但即使这样也会因使用静态属性来存储webdriver实例而导致同样的问题 .
也许使用这种静态属性并不是一个好主意 .
我不太了解你的问题(你如何在两个驱动程序上实例化和运行命令)......但我相信我知道你想要什么 .
如果您想使用具有多个驱动程序的TestNG进行并行测试,那么我相信您需要使用 @dataProvider .
@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的任何_320102之前,它将运行您的getDrivers()函数,并获取驱动程序 .
它是一个二维数组,因为第一个维度是您传递给测试的数据集,而第二个维度是您要传递的数据集 .
如果这不是你想要的......那么请更具体地说明你想要的东西 .
3 回答
我想知道你的驱动程序对象是否是一个类属性,因此在调用之间共享?两个线程可能引用相同的属性 . 虽然我不确定多次运行方法时TestNG的工作原理,但在并行运行同一个类中的不同方法时,这是一个问题 .
尝试在方法级别定义属性并让我知道会发生什么 .
您的驱动程序存储在静态属性中,因此两个线程同时访问它,这将考虑您所看到的行为 .
如果TestNG为每个调用创建一个新的类实例而不是共享同一个类实例,那么使驱动程序成为类实例属性只会解决问题 . 我不知道TestNG是如何以这种方式工作的,所以不能说它是否能解决你的问题 .
如果你想要使用相同的webdriver测试,使用@invocationCount在并行线程中运行多次,那么你的测试方法必须是隔离的和原子的,并且使用静态webdriver不支持这一点 .
要允许静态方法访问webdriver实例,则必须将webdriver对象作为参数传递给static方法;
例如
还有其他方法在TestNG中运行不同测试方法的并行线程,例如创建套件xml文件,但即使这样也会因使用静态属性来存储webdriver实例而导致同样的问题 .
也许使用这种静态属性并不是一个好主意 .
我不太了解你的问题(你如何在两个驱动程序上实例化和运行命令)......但我相信我知道你想要什么 .
如果您想使用具有多个驱动程序的TestNG进行并行测试,那么我相信您需要使用
@dataProvider
.这是做什么的:
在每次调用具有该dataProvider的任何_320102之前,它将运行您的getDrivers()函数,并获取驱动程序 .
它是一个二维数组,因为第一个维度是您传递给测试的数据集,而第二个维度是您要传递的数据集 .
如果这不是你想要的......那么请更具体地说明你想要的东西 .