随机失败的测试jest和supertest Node.js

时间:2018-04-20 08:36:14

标签: javascript node.js express testing jestjs

这么长的故事简短我正在开发RESTapi,它将POST请求的电影标题带到/ movies路线,从外部api获取有关该电影的信息并将该对象保存到数据库。在POST /评论中,您可以为不同的集合添加注释,但每个评论都有一个'movie_id'属性,该属性具有关联的电影。

这是我的第一个更大的项目,所以我正在尝试编写集成测试。 至少在我看来,一切都很棒,除了3个奇怪的测试用例,这些测试用例无处不在。测试可以连续传递10次,然后突然出现奇怪的“开玩笑”计时器,3个案例失败。

我正在使用本机mongodb驱动程序,表达和使用supertest进行测试,删除测试数据库BeforeAll和AfterEach,我不知道是什么原因。

计时器东西: enter image description here

在计时器显示后,测试失败: enter image description here

完整的源代码在这里GITHUB

其他失败案例: enter image description here enter image description here

任何想法,提示?

2 个答案:

答案 0 :(得分:0)

代码似乎返回一个条目,而测试期望为零。这看起来非常像测试独立性的问题:您的测试似乎彼此依赖(通过数据库)。

会猜测一个测试会创建电影,然后再次清除它。当一切正常时,第二次测试找不到电影。但是,在一些不幸的情况下(错误的时间,不同的执行顺序......),数据库的清除速度不够快,第二次测试找不到电影。

因此,您应该努力使您的测试独立。这对于集成测试来说并不容易,特别是当它们涉及真实的数据库时。

也许你可以创建更小的测试(单元测试,微测试......)来实现独立性。如果这是不可能的,测试可以检查它的前提条件(数据库为空或其他)并等待它完成(或直到发生超时)。

在BeforeAll和AfterEach中删除数据库可能还不够,因为Jest甚至可以并行运行您的测试:Are tests inside one file run in parallel in Jest?

此外,删除可能不是完全同步的原子操作,尤其是在数据库驱动程序中存在一些缓存时。但是我不知道mongodb和它的node.js集成是否足以判断它。

答案 1 :(得分:0)

我遇到了同样的“玩笑并行测试”问题,我找到了一个解决方案,也许不是最好的,但是现在开玩笑地在“队列模式”下运行测试,所以当我删除beforeAll中的数据时,我的下一组测试准备好与“新”新插入的数据一起使用。

  

-runInBand   别名:-i。在当前进程中串行运行所有测试,而不是创建运行测试的子进程的>工作池。这对于调试很有用。

jest source

所以在我的config.json中,我有:

    "scripts": {
        "test": "set NODE_ENV=test&& jest ./tests --runInBand --detectOpenHandles --forceExit",
        "server": "set NODE_ENV=development&& nodemon app.js"
    }