分组运行jest测试套件?

时间:2018-05-04 09:43:14

标签: javascript testing ecmascript-6 jest supertest

我正在通过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)

3 个答案:

答案 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

尽管要命名测试组,但要小心,它们会在测试描述中使用正则表达式进行搜索,并且您不希望此命令与其他单词匹配。