我之前也问过这个问题,但对答案不满意。
我用的是什么:
- 在 Django/python 网站上工作。
- 在本地使用 python 虚拟环境完成开发。
- 使用 GIT 作为我的 SCM
- 为 GIT 的开发和生产分支部署了单独的虚拟服务器
- 使用 Jenkins CI 进行持续集成。为 Jenkins 部署的独立虚拟服务器
工作:
- 我对网站进行了单元测试、冒烟测试和集成测试。 Jenkins 已设置好,每当代码从我的本地 git 分支推送到 git repo 上的 Developer 和 Production 分支时,都会在 Jenkins 中触发构建。
问题:
- 当我执行“python manage.py 测试”时,我的测试在本地通过
- 当代码被推送到其他分支(开发和生产)时,Jenkins 中的随机测试(主要是单元测试)失败。
- 测试失败后,如果我通过在 Jenkins 中按下“立即构建”按钮手动构建,测试通常会通过并且构建成功。
- 有时,当没有对代码进行任何更改并且代码仍被推送到这些分支时,Jenkins 中的测试会随机失败。
一些常见的错误:
- 断言错误:302 != 200
- TypeError: 'NoneType' 对象不可订阅
- IndexError: 列表索引超出范围
- 断言错误:datetime.datetime(2012, 12, 5, 0, 0, 27, 218397) != datetime.datetime(2012, 12, 5, 0, 0, 27, 239884)
- AssertionError:重定向到“x”的响应应为“y”
迄今为止的故障排除:
- 在我的机器和虚拟服务器上本地运行所有测试。他们运行良好。
- 在本地和虚拟服务器上运行个别失败的测试。他们运行良好。
- 尝试重新创建失败条件,但截至目前,测试正在通过。
我看到的唯一问题是,无论何时将代码推送到开发人员和生产分支,都会出现随机测试失败。一些测试反复失败。
谁能告诉我我还能做些什么来解决这个问题。我试着用谷歌搜索这个问题,但没有成功。我知道 xunitpatterns 网站对不稳定的测试行为有一些很好的见解,但它没有帮助,因为我在那里尝试了大部分内容。
请您参考如下方法:
这是一个很难回答的问题。
Django 开发人员可能会掉入一些常见的陷阱,但我不知道。
除此之外,这只是正常的调试:
找到重现失败的方法。如果您可以让测试在您自己的笔记本电脑上失败,那就太好了。如果不能,就只好在出现故障的机器上调试了。
获取更多信息。断言可以在失败时打印自定义消息。打印相关变量的值。将调试打印输出添加到您的代码和测试中。看看事情在哪里不是他们应该的样子。谷歌如何使用 Python 调试器。
保持开放的心态。错误可能出现在任何地方:在硬件、软件环境、您的代码或测试代码中。但是,除非你是上帝,Linus Torvalds 或 Brian Kernighan,否则这是一个安全的第一个假设,该错误起源于你的键盘和座位靠背之间的某个地方。 (而且上面的三位黑客也都犯了严重的错误。)
