首页 文章

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

提问于
浏览
0

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

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

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

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

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

3 回答

  • 2

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

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

  • 1

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

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

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

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

    例如

    public static void doSomethingFoo(WebDriver driver) {
    
        // do something to the driver
    }
    

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

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

  • -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的任何_320102之前,它将运行您的getDrivers()函数,并获取驱动程序 .

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

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

相关问题