3

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

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

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

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

我正在尝试找到最佳解决方案:

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

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

你能给我什么建议?

你会如何解决这个问题?

4

4 回答 4

3

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

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

如果您确实选择重用该WebDriver对象,请确保您尝试在tearDown. 例如,通过清除 cookie:

driver.manage().deleteAllCookies();
于 2012-12-27T16:17:10.193 回答
3

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

于 2012-12-28T09:40:43.147 回答
0

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

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

于 2012-12-27T16:18:21.400 回答
0

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

于 2015-05-18T10:40:06.233 回答