单元测试有时会失败,有时会失败

时间:2012-09-27 14:43:23

标签: unit-testing jenkins mocha

我有一个mocha单元测试套件。

当我在本地运行它们时,一切正常。当我在Jenkins CI服务器上运行它们时,它们有时会失败,有时会通过。

我只是无法重现他们失败的原因。什么可能导致这种行为?

4 个答案:

答案 0 :(得分:7)

由于多种原因,测试可能会间歇性地失败,并确定它们失败的原因通常会揭示您的代码库和环境。

以下是一些可能的原因:

•共享对象 - 如果测试环境未重置为众所周知的状态,则保持状态的单例可能会导致测试之间出现问题。 如果您的测试运行器以非确定性顺序执行测试,您可能会看到实际暴露出已损坏状态问题的随机错误

•环境和外部依赖关系 - 任何可以保持状态的外部对象都可能导致不可预测的结果

•时间 - 有时测试是使用超时或线程休眠来编写的,这些测试太具体了。如果构建服务器在高负载下运行,则这些超时可能不够长

作为一般指导,测试必须是:

  • 隔离:测试一次关注一个单元
  • repeatable:每次产生相同的结果
  • 独立:执行测试的顺序无关紧要

答案 1 :(得分:2)

我会尝试通过将执行程序的数量减少到1来缩小问题范围。如果测试仍然间歇性地失败,那么你有一个Test Run War,否则(假设它们在本地运行正常)它看起来像一个Resource Leakage

http://xunitpatterns.com/Erratic%20Test.html

的更多信息

答案 2 :(得分:1)

我希望您重复使用测试夹具进行多次测试。在某些情况下,测试的顺序会从本地计算机上的顺序更改,并且在开始测试时没有正确的夹具。要修复它,你应该给每个测试一个干净的夹具。

另一个原因可能是您在runnen测试(两个具有相同测试配置的构建服务器)时从多个位置重用数据库。为每个构建服务器提供自己的数据库或者子/模拟数据库层。除非您测试与外部资源的连接,否则您的测试不应依赖外部资源。

答案 3 :(得分:0)

如果您正在测试多线程代码并在测试中使用Thread.sleep(time);,则可能会发生这种情况。如果睡眠时间不够长,测试可能会通过或失败,具体取决于计算机的处理速度。相关讨论: