【问题标题】:Django Selenium test fails sometimes in Travis CITravis CI 中的 Django Selenium 测试有时会失败
【发布时间】: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 容器。

失败的测试是一系列子测试,每个子测试都测试我们拥有的过滤搜索功能;每个子测试都是一个不同的过滤查询。每个子测试的顺序是:

  1. 找到过滤搜索栏元素
  2. 发送过滤查询(字符串,例如"function = int main()")
  3. 模拟浏览器点击执行查询
  4. 对于数据集的特定过滤器(数据集在整个子测试中保持一致),断言返回结果的长度与该特定过滤器的预期匹配

在 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


【解决方案1】:

我自己也遇到了这个问题,这是由于 django 的内置服务器没有使用 python 的日志系统造成的。这已在 1.10 中修复,但在撰写本文时尚未发布。就我而言,在升级之前将消息留在日志中是可以接受的;比添加超时和增加构建时间要好。

【讨论】:

    【解决方案2】:

    您的问题可能与this fellow 遇到的问题类似。这可能是您的超时问题。您可能想要使用显式等待,或者在比较数据之前尝试等待特定元素加载。我的测试有类似的问题,我的 Selenium 测试会尝试在页面加载完成之前轮询图像以查看它是否存在。就像我说的那样,这可能不是同一个问题,但可能会有所帮助。祝你好运!

    【讨论】:

    • 最初我对这个答案持怀疑态度,因为我们已经在显式等待等方面做了很多摆弄,但没有真正的效果。然而,似乎一个有足够长的显式等待 (time.sleep) 的子测试终于成功了。原来它根本没有这样的等待。但是,在添加了足够长的等待并经历了 11 个 Travis 构建之后,没有失败,所以它似乎已修复!
    猜你喜欢
    • 1970-01-01
    • 2018-11-21
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多