特拉维斯CI中有​​时会出现Django Selenium测试失败

时间:2015-08-21 15:41:39

标签: python django unit-testing selenium

我的团队现在对这个问题持续数周的困惑。我们有一个使用LiveServerTestCase的测试套件,它运行我们拥有的所有基于Selenium的测试。特别是一次测试有时会无缘无故地随机失败 - 我可以在另一个文件中更改注释,测试会失败。更改其他一些评论将再次修复测试。我们使用Firefox webdriver进行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. 对于数据集上的特定过滤器(数据集在整个子测试中是一致的),断言返回结果的长度与特定过滤器的预期长度匹配
  5. 在Travis CI中运行时,此测试通常会通过,如前所述,此测试始终在本地运行时通过。在Web浏览器中手动与站点交互时无法重现该错误。但是,偶尔,Travis CI的测试输出中会出现这种错误:

    - Broken pipe from ('127.0.0.1', 39000)
    - Broken pipe from ('127.0.0.1', 39313)
    

    3900039313并不总是数字 - 每次运行新的Travis CI构建时,这些都会发生变化。这些似乎是端口号,但我不确定它们实际上是什么。

    我们在获取过滤器的结果列表之前就有time.sleep(sec)行。增加睡眠时间通常会与临时修复损坏的管道错误相关联。然而,测试非常善变,改变睡眠时间可能与修复错误无关;有些时候睡眠时间已减少或从分测验中取出,测试将通过。在任何情况下,由于管道损坏,过滤器无法执行并且断言失败。

    一个可能有趣的细节是,无论子测试的顺序如何,如果发生损坏的管道错误,它始终是第一个失败的子测试。但是,如果第一个子测试通过,则所有子测试将始终通过。

    所以,我的问题是:这里到底发生了什么,我们如何确保这个随机错误停止发生?如果这是一个模糊/混乱的问题,请道歉,但不幸的是,这是问题的本质。

2 个答案:

答案 0 :(得分:1)

看起来您的问题可能类似于this fellow遇到的问题。这可能是你的超时问题。您可能希望使用显式等待,或尝试在比较数据之前等待加载特定元素。我的测试中遇到了类似的问题,我的Selenium测试会在页面加载完成之前尝试轮询图像以查看它是否存在。就像我说的,这可能不是同一个问题,但可能有所帮助。古德勒克!

答案 1 :(得分:0)

我自己也碰到了这个问题,这是由于django的内置服务器没有使用python的日志记录系统。这已在1.10中修复,但在撰写本文时尚未发布。在我的情况下,可以将消息保留在日志中,直到升级为止;比添加超时和增加构建时间更好。