每个测试方法都有新的WebDriver实例?

cit*_*att 21 selenium webdriver

在Selenium-webdriver中创建webdriver实例的最佳实践是什么?每个测试方法,每个测试类或每次测试运行一次?

它们似乎相当(非常)昂贵,但在测试之间保持开放可能会在测试方法之间泄漏信息.

或者是否有另一种选择 - 单个webdriver实例是单个浏览器窗口(不包括弹出窗口),还是有一种从给定驱动程序实例启动新窗口/会话的方法?

谢谢马特

Bar*_*man 17

我发现在使用真实浏览器(例如Firefox)时,在测试方法之间重复使用浏览器实例可以节省大量时间.使用HtmlUnitDriver运行测试时,几乎没有什么好处.

关于不确定性测试的危险性,它是完全确定性测试与您的时间之间的权衡.集成测试通常涉及这些权衡.如果您想要完全确定性的集成测试,您还应该担心在测试运行之间清除数据库/服务器状态.

如果要重用浏览器实例,您必须做的一件事是在运行之间清除/存储cookie.

driver.manage().deleteAllCookies();
Run Code Online (Sandbox Code Playgroud)

我在tearDown()方法中这样做.此外,如果您的应用程序在客户端存储任何数据,您需要清除它(可能通过JavascriptExecutor).对于正在测试的应用程序,在执行此操作后,它应该看起来像一个完全不相关的请求,这确实可以最大限度地降低不确定行为的风险.


Dan*_*Dan 9

如果您的自动化集成测试的目标是进行可重复的测试,那么我建议每个测试执行一个新的webdriver实例.

每项测试都应该独立,独立于任何其他测试或副作用.

就个人而言,我唯一觉得比难以复制的bug更令人沮丧的是,你不信任的非确定性测试.

(这对于管理测试数据本身更为重要,特别是当您查看可以修改持久应用程序状态的测试时,例如CRUD操作.)

是的,额外的测试执行时间是昂贵的,但最好是花时间调试测试.

一些可能的解决方案可以帮助抵消这种损失,将测试直接推送到构建过程中,超越持续构建到持续集成的方法.

还尝试限制集成测试的范围.如果你有很多繁重的集成测试,耗费执行时间,试着重构.相反,增加底层服务调用(业务逻辑所在的位置)的更轻量级单元测试的覆盖范围.

  • 我真的不喜欢在每次测试之间启动新驱动程序所需的额外时间.但替代方案更糟糕.我努力让共享驱动程序干净利落地工作,但我发现自己花了很多时间调试测试之间奇怪的交互,这是不值得的. (3认同)