在Selenium-webdriver中创建webdriver实例的最佳做法是什么?每种测试方法,每个测试类或每次测试运行一次?
它们似乎相当(非常!)昂贵,但在测试之间保持开放可能会在测试方法之间泄漏信息。
或者有替代方案 - 单个webdriver实例是单个浏览器窗口(不包括弹出窗口),还是有从给定驱动程序实例启动新窗口/会话的方法?
由于 马特
答案 0 :(得分:16)
我发现在使用真实浏览器时,在测试方法之间重复使用浏览器实例可以节省大量时间,例如: Firefox浏览器。使用HtmlUnitDriver运行测试时,几乎没有什么好处。
关于不确定性测试的危险性,它是完全确定性测试与您的时间之间的权衡。集成测试通常涉及这些权衡。如果您想要完全确定性的集成测试,您还应该担心在测试运行之间清除数据库/服务器状态。
如果要重用浏览器实例,您肯定应该做的一件事是在运行之间清除/存储cookie。
driver.manage().deleteAllCookies();
我在tearDown()方法中这样做。此外,如果您的应用程序在客户端存储任何数据,您需要清除它(可能通过JavascriptExecutor)。对于正在测试的应用程序,在执行此操作后,它应该看起来像一个完全不相关的请求,这确实可以最大限度地降低不确定行为的风险。
答案 1 :(得分:8)
如果您的自动化集成测试的目标是进行可重复的测试,那么我会建议每个测试执行一个新的webdriver实例。
每项测试都应该独立,独立于任何其他测试或副作用。
就我个人而言,我唯一觉得比难以复制的bug更令人沮丧的是,你不信任的非确定性测试。
(这对于管理测试数据本身更为重要,特别是当您查看可以修改持久应用程序状态的测试时,例如CRUD操作。)
是的,额外的测试执行时间成本很高,但最好还是花时间调试测试。
有助于抵消这种损失的一些可能的解决方案是将测试直接推送到您的构建过程中,超越连续构建到持续集成的方法。
还尝试限制集成测试的范围。如果你有很多繁重的集成测试,耗费执行时间,试着重构。相反,增加底层服务调用(业务逻辑所在的位置)的更轻量级单元测试的覆盖范围。