JUnit.平行运行.但是所有的测试方法都处理单例实例.如何解决



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

当测试方法在一个线程中一步一步地执行时,一切都很好。但它也太长了,

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

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

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

我希望测试将以并行模式执行——这真的很快。

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

你能给我什么建议?

你会如何解决这个问题?

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

对此别无选择。如果测试是并行运行的,则不能使用单个WebDriver实例,每个测试用例必须实例化一个WebDriver实例。

通过串行运行测试来获得加速的一种方法是重用WebDriver对象,因为启动WebDriver往往是一个需要很长时间的步骤。另一个常见的优化是,如果正在使用FirefoxDriver,则重用FirefoxProfile,因为简档的创建也很慢。

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

driver.manage().deleteAllCookies();

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

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

Jute maven插件通过JUnit测试方法作为外部JVM进程的启动提供了对它们的隔离,您还可以为测试定义特定的JRE

相关内容

  • 没有找到相关文章

最新更新