WebDriver设置应该是静态的并发测试执行吗?

时间:2017-04-18 16:29:53

标签: java selenium selenium-webdriver webdriver testng

WebDriver设置应该是静态的并发测试执行吗?

  1. 在线观看很多BasePage设置示例等开发人员使用列表等驱动程序的静态实例。
  2. 在我的情况下,我可以同时执行多个测试用例:

    public class BrowserFactory implements ISuiteListener {
    protected WebDriver webdriver;
    

    }

  3. 你的想法?

2 个答案:

答案 0 :(得分:2)

完全取决于您的测试范围。如果您使用的是基于Gherkin的系统,如Cucumber或JBehave,那么您的测试通常是在故事中使用场景的步骤。当您有多个场景和/或多个故事时,通常可以更轻松地设置驱动程序一次(静态)并将该实例传递给其他场景/故事。另一方面,如果您希望每次都有一个全新的驱动程序实例,则不应将驱动程序定义为静态,但这意味着每个方案都需要实例化驱动程序所需的步骤,以及通常的日志用户等,并在最后关闭驱动程序。这确实允许一个更明显自包含的场景,但是如果您在继续并且相应地做出反应而不是总是假设之前检查驱动程序是否已经实例化(或用户已登录),则可以使用静态驱动程序完成相同的操作。这是一个新的开始。

如果你有一个完全自包含的测试,那么坚持使用驱动程序的动态(非静态)声明,因为如果它将与该驱动程序一起运行,它将需要初始化和关闭。但是,如果您的套件包含其他测试,并且他们可以从使用相同的驱动程序中受益,那么就这样设计它。在JBehave中,我在测试运行器中初始化我的驱动程序,因此无论我以最快和最有效的方式运行一个测试,一个故事或多个故事,它都将起作用。

我希望我已经清楚地解释了这一点。

答案 1 :(得分:1)

您可能已经知道static变量是变量。如果你使WebDriver为静态,它的实例将在并行线程之间共享,你肯定会遇到竞争条件问题。

线程安全很重要的地方。您可以通过以下几种方式实现目标:

  • 使用ThreadLocal容器;
  • 使用专门用于并发环境的专用结构之一,例如: ConcurrentHashMap

有关人们为何WebDriver静态的几点:

  • 盲目复制/粘贴来自"权威"源;
  • 从域层排除驱动程序;
  • 建筑设计。

根据我的经验,使用纯继承操作非静态WebDriver是不可能的,而不会在框架外明确地暴露它。