【问题标题】:Mocha unit tests timeout error on Jenkins, but not locallyMocha 单元测试 Jenkins 上的超时错误,但不是本地
【发布时间】:2017-09-24 06:45:55
【问题描述】:

我正在处理的这个项目有一堆单元测试,并且项目构建正在由运行这些测试的 Jenkins 检查。

我遇到的问题是:每当我在本地运行测试时,都不会出现错误。无论我是单独测试文件还是对整个项目运行测试,一切正常。

但是,每当我推送任何提交时,Jenkins 总是返回此错误:

timeout of 20000ms exceeded. Ensure the done() callback is being called in this test.

我不知道为什么,因为当我在本地测试它时它可以工作,而且我确定我在测试中调用了 done()。此外,始终是相同的两个单元测试在 Jenkins 上始终因超时而失败,但从未在我们的任何机器上本地失败。

测试如下所示:

it('should provide result', function(done) {
  this.timeout(20000);
  server.get(`/api/model/function/${token}`)
  .set('Authorization', access_token)
  .expect(200)
  .end((err, res) => {
    assert.equal(res.status, 200, 'expects status equal to 200');
    done(err);
  });
});

我也尝试将其重写为一个看起来像的承诺

it('should provide result', function(done) {
  server.get(`/api/model/function/${token}`)
  .set('Authorization', access_token)
  .then(res => {
    assert.equal(res.status, 200, 'expects status equal to 200');
    done();
  });
});

这给出了相同的结果:在本地工作正常,但在 Jenkins 中不行。

我环顾四周,看到人们建议在末尾添加 .catch(done).catch(err => { done(err) }),但这只会导致我出现错误 Done() called multiple times

我们将不胜感激有关此问题的任何帮助。

【问题讨论】:

    标签: javascript unit-testing jenkins mocha.js


    【解决方案1】:

    不同的“系统”在网络连接等方面具有不同的特征并不罕见。有时您只需要接受它并更改 CI 环境中特定测试的超时时间即可。因此,只需像这样为您的失败测试提出它:

    describe("something", function () {
        this.timeout(5000);
    
        // tests...
    });
    

    但是,根据您在聊天中所说的话,服务器似乎没有在 CI 环境中启动。请在设置服务器变量的位置发布代码。

    【讨论】:

    • 我尝试将超时设置为高达一分钟(60000),但仍然超时。但是当我尝试将其设置为 (60000 * 2) 时,错误变为Cannot read property 'status' of undefined,我认为这是因为测试的其余部分已经完成并且仍在尝试解决该特定测试。
    • 所以你在 jekins 上启动了服务器?
    • 我不完全确定,但我认为它就是这样做的。
    • 您是否还有其他测试可以在本地运行服务器,或者只有这些测试?
    • 你为什么不同时发布定义和设置服务器变量的代码。
    猜你喜欢
    • 2019-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    相关资源
    最近更新 更多