15

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

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

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

4

5 回答 5

11

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

以下是一些可能的原因:

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

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

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

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

  • 孤立的:测试一次只关注一个单元
  • 可重复的:每次产生相同的结果
  • 独立:执行测试的顺序无关紧要
于 2012-09-29T01:21:02.220 回答
3

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

更多信息请访问http://xunitpatterns.com/Erratic%20Test.html

于 2012-09-30T13:50:15.227 回答
2

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

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

于 2012-09-27T15:11:06.707 回答
1

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

于 2017-05-25T08:01:41.287 回答
0

我正在与jest. 我的问题是模拟数据导致测试间歇性失败。清除模拟并在每个内部使用假计时器describe有助于解决我的问题:

describe("my test", ()=> {

    beforeAll(() => {
        jest.setTimeout(30000);
        jest.useFakeTimers();
      });
    afterAll(() => {
        jest.useRealTimers();
      });
    beforeEach(() => {
        jest.clearAllMocks();
      });

    it("my test", async()=>{....})


    ...

})
于 2022-03-04T19:30:49.540 回答