因此,我有几个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