【发布时间】:2015-11-15 15:19:21
【问题描述】:
我的团队已经断断续续地为这个问题困惑了好几个星期。我们有一个使用LiveServerTestCase 的测试套件,它运行我们拥有的所有基于 Selenium 的测试。特别是一项测试有时会无缘无故地随机失败——我可以更改不同文件中的注释,测试会失败。更改其他一些评论将再次修复测试。我们正在使用 Firefox 网络驱动程序进行 Selenium 测试:
self.driver = Firefox()
在我们的 Docker 容器中进行本地测试永远不会重现错误。这很可能是因为当tests.py 在 Travis CI 之外运行时,使用了与Firefox() 不同的 Web 驱动程序。 Web 驱动程序是这样的:
self.driver = WebDriver("http://selenium:4444/wd/hub", desired_capabilities={'browserName':'firefox'})
对于本地测试,我们使用 Selenium 容器。
失败的测试是一系列子测试,每个子测试都测试我们拥有的过滤搜索功能;每个子测试都是一个不同的过滤查询。每个子测试的顺序是:
- 找到过滤搜索栏元素
- 发送过滤查询(字符串,例如
"function = int main()") - 模拟浏览器点击执行查询
- 对于数据集的特定过滤器(数据集在整个子测试中保持一致),断言返回结果的长度与该特定过滤器的预期匹配
在 Travis CI 中运行时,此测试通常会通过,并且如前所述,在本地运行时,此测试总是通过。在 Web 浏览器中手动与站点交互时,无法重现该错误。但是,偶尔会在 Travis CI 的测试输出中出现这种错误:
- Broken pipe from ('127.0.0.1', 39000)
- Broken pipe from ('127.0.0.1', 39313)
39000 和 39313 并不总是数字——每次运行新的 Travis CI 构建时,它们都会改变。这些看起来像端口号,尽管我不确定它们实际上是什么。
在获取过滤器的结果列表之前,我们有 time.sleep(sec) 行。增加睡眠时间通常与临时修复损坏的管道错误相关。但是,测试非常变化无常,更改睡眠时间可能与修复错误没有太大关系;有时睡眠时间已减少或从子测试中删除并且测试将通过。在任何情况下,由于管道损坏,过滤器无法执行并且断言失败。
一个可能有趣的细节是,无论子测试的顺序如何,如果发生管道损坏错误,始终是第一个失败的子测试。但是,如果第一个子测试通过,那么所有子测试将始终通过。
所以,我的问题是:到底发生了什么,我们如何确保这个随机错误不再发生?如果这是一个模糊/令人困惑的问题,我们深表歉意,但不幸的是,这就是问题的本质。
【问题讨论】:
-
您可以从您的应用程序中获取性能日志吗?您的应用程序是否可能失败?
-
无法想象它会失败,因为所有其他测试都通过了。就像我说的那样,测试在 Travis 之外 100% 的时间都通过了,并且无法通过正常使用该站点来重现错误。在 Travis 内部,测试仍然经常通过。性能日志是什么意思?该应用程序有与数据库查询相关的计时日志,但我无法想象有任何类似的东西可以帮助诊断问题。
标签: python django unit-testing selenium