我正在通过jest和supertest为新API编写大量测试。在运行测试之前,我正在设置一个测试数据库并用用户填充它:
测试命令
jest --forceExit --config src/utils/testing/jest.config.js
jest.config.js
module.exports = {
rootDir: process.cwd(),
// Sets up testing database with users
globalSetup: './src/utils/testing/jest.setup.js',
// Ensures connection to database for all test suites
setupTestFrameworkScriptFile: './src/utils/testing/jest.db.js',
}
所以我开始使用一些用户进行测试的数据库。问题是:
我的一些测试依赖于其他测试的成功。在此应用程序中,用户可以上载图像并将其分组。所以我的分组端点套件取决于我的图片上传套件的成功,等等。
我很清楚很多人可能会说这是不好的做法,测试不应该依赖于其他测试。话虽如此,我宁愿通过supertest
保留所有测试,也不要进入依赖注入等。我不想精心设置测试条件(例如人为地创建一堆用户图像)在运行测试之前),因为:(1)这只是逻辑的重复,(2)它增加了破坏的可能性。
有没有办法分组开玩笑套房?例如,按顺序运行套件:
jest run creationSuite
jest run modificationSuite
这样,我的所有“creationSuite”测试都可以同时运行, all 的成功将以快速失败的方式触发“modifySuite”等运行。
或者,在测试套件内部指定其他测试套件的依赖性会很棒:
describe('Grouping endpoint', () => {
// Somehow define deps
this.dependsOn(uploadSuite)
答案 0 :(得分:3)
您可以使用jest-runner-groups
来分组定义和运行测试。安装并添加到jest配置后,您可以使用docblock标记来标记测试,如下所示:
/**
* Foo tests
*
* @group group1/subgroup1
* @group unit/foo
*/
describe( 'Foo class', () => {
...
} );
/**
* Bar tests
*
* @group group1/subgroup2
* @group unit/bar
*/
describe( 'Bar class', () => {
...
} );
更新您的玩笑配置以指定新跑步者:
// jest.config.js
module.exports = {
...
runner: "groups"
};
然后,要运行特定的组,您需要使用--group=
参数:
// using jest executable
jest --group=mygroup
// or npm
npm test -- --group=mygroup
您还可以使用多个--group
参数来运行多个组:
// will execute tests in the unit/bar and unit/foo groups
npm test -- --group=unit/bar --group=unit/foo
// will execute tests in the unit group (including unit/bar and unit/foo groups)
npm test -- --group=unit
答案 1 :(得分:2)
Jest测试套件在多个线程中执行,这是它的主要优点之一。通过这种方式可以更快地完成测试运行,但测试序列不会被设计保留。
可以使用runInBand
选项禁用此功能。
可以根据testNamePattern
选项的名称或基于testPathPattern
option的路径选择测试和套件
由于一个套件依赖于另一个套件,它们可能按照预期运行的顺序组合成一个套件。它们仍然可以驻留在不同的文件中(确保它们与Jest不匹配),例如:
// foobar.test.js
describe(..., () => {
require('foo.partial-test.js');
require('bar.partial-test.js');
});
问题在于:
我的一些测试依赖于其他测试的成功。
这是真正的问题。在任何类型的自动化测试中,依赖于先前测试状态的方法都被认为存在缺陷。
我不想一丝不苟地设置测试条件(例如在运行测试之前人工创建一堆用户图像),因为:(1)这只是逻辑的重复,(2)它增加了事情破裂的可能性。
无需人工设置测试条件(灯具)。如果您确定它们的质量,即使从当前测试的结果中也可以从现有环境中提取灯具。
自动化测试中自然会出现冗余和重言式,它们没有任何问题。通过适当管理灯具和共享代码,可以对DRYer进行测试。
恰恰相反,总是会累积错误。创建错误先决条件的测试可能会通过,但另一个测试将失败,从而产生调试难题。
答案 2 :(得分:2)
我已经用--testNamePattern
标志完成了。这是过程。
让我们说您有两组测试:
DevTest
用于开发环境中的测试ProdTest
用于在生产环境中进行测试如果您只想测试开发环境所需的那些功能,则必须添加DevTest
来测试描述
describe('(DevTest): Test in dev environment', () => {
// your test
})
describe('(ProdTest): Test in production environment', () => {
// your test
})
describe('Test everywhere', () => {
// your test
})
之后,您可以将命令添加到package.json
:
"scripts": {
"test": "jest",
"test:prod": "jest --testNamePattern=ProdTest",
"test:dev": "jest --testNamePattern=DevTest",
"test:update": "jest --updateSnapshot"
}
命令npm test
将运行所有测试,因为您没有使用标志--testNamePattern
。如果要运行其他测试,请仅使用npm run test:dev
。
尽管要命名测试组,但要小心,它们会在测试描述中使用正则表达式进行搜索,并且您不希望此命令与其他单词匹配。