【问题标题】:JUnit. Parallel running. But all the test methods processing singleton instance. How to solve?JUnit。并行运行。但是所有的测试方法都处理单例实例。怎么解决?
【发布时间】:2012-12-12 23:58:29
【问题描述】:

所以,我有几个JUnit 类,每个类都包含一个测试方法列表。 每种方法都是相互独立的,没有直接的联系。 但是我们有间接联系:所有方法都处理一个单例对象(它是Selenium Web Driver Instance,是的,我在所有测试中都使用了 1 个Web Driver Instance,因为为了创建新的对象实例,我们花了很多时间!)。

当测试方法在一个线程中逐步执行时,一切正常。不过也太长了,

所以,我决定提高速度, 如何? - 我决定以并行模式运行所有测试方法。为此,我使用具有特殊配置的 maven 来执行并行测试。

但我认为,这是一个新问题的根源,因为 - 结果我们有并行方法执行,但我们仍然只使用 single Web 驱动程序实例。

我正在寻找最佳解决方案:

我希望测试以并行模式执行 - 它真的很快。

我不希望每次测试都创建新对象 - 这是一个非常漫长的过程。

你能给我什么建议?

你会如何解决这个问题?

【问题讨论】:

  • 你有多少测试?
  • 即使每个线程(而不是每个测试)创建一个新驱动程序的成本可能仍然很快
  • 目前,我有2个测试类,每个包含5-7个测试方法。

标签: java selenium junit parallel-processing webdriver


【解决方案1】:

不幸的是,webDriver 不是线程安全的。恕我直言,最佳实践是在单独的线程中使用单独的 webDriver 实例运行每个测试类。最佳线程数是 int threadNum = Runtime.getRuntime().availableProcessors() * 2; 我的项目执行时间从 30 分钟减少到 4 分钟。 在修昔底德框架中使用的方法完全相同。

【讨论】:

    【解决方案2】:

    没有其他选择。如果测试并行运行,则不能使用单个 WebDriver 实例,必须为每个测试用例实例化一个 WebDriver 实例。

    通过连续运行测试来获得加速的一种方法是重用WebDriver 对象,因为启动WebDriver 往往是一个需要很长时间的步骤。另一个常见的优化是在使用FirefoxDriver 时重用FirefoxProfile,因为配置文件的创建也很慢。

    如果您确实选择重用WebDriver 对象,请确保您尝试尽可能地清理tearDown 中的实例。例如,通过清除 cookie:

    driver.manage().deleteAllCookies();
    

    【讨论】:

      【解决方案3】:

      根据您的测试中实际性能瓶颈的位置,您可以做一些粗暴的事情,例如在您的驱动程序周围添加一个synchronized 包装器,这样您仍然只有一个,但对它的所有访问都是序列化的。

      您可能会更改您的测试以使 ThreadLocal 引用驱动程序,这样每个线程就有一个驱动程序。

      【讨论】:

      • 包装synchronized 对性能有何帮助?你实际上是在强迫它是连续的。
      • 速度慢的原因是在驱动程序中还是在周围的测试代码中。是的,如果WebDriver 是问题所在,那么拥有一个并同步访问它并没有多大帮助。
      【解决方案4】:

      Jute maven plugin 通过作为外部 JVM 进程启动来提供 JUnit 测试方法(!)的隔离,您也可以为测试定义特定的 JRE

      【讨论】:

        猜你喜欢
        • 2018-08-25
        • 2021-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-23
        • 1970-01-01
        • 2022-12-18
        相关资源
        最近更新 更多