成组运行 Jest 测试套件

j_d*_*j_d 12 javascript testing supertest ecmascript-6 jestjs

我正在通过 Jest 和 supertest 为新 API 编写大量测试。在运行测试之前,我正在设置一个测试数据库并用用户填充它:

测试命令

jest --forceExit --config src/utils/testing/jest.config.js
Run Code Online (Sandbox Code Playgroud)

文件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',

}
Run Code Online (Sandbox Code Playgroud)

所以我从一些用户的数据库开始进行测试。问题是这样的:

我的一些测试依赖于其他测试的成功。在这个应用程序中,用户可以上传图像,并将它们分组。所以我的分组端点套件取决于我的图像上传套件的成功,等等。

我很清楚很多人可能会说这是不好的做法,并且测试不应该依赖于其他测试。话虽如此,我真的宁愿通过以下方式保留所有测试supertest,而不是进入依赖注入等。我不想精心设置测试条件(例如,在运行之前人为地创建一堆用户图像)测试),因为:(1)这只是逻辑的重复,并且(2)它增加了某些破坏的可能性。

有什么办法可以将 Jest Suite 分组吗?例如,要按顺序运行套件:

jest run creationSuite
jest run modificationSuite
Run Code Online (Sandbox Code Playgroud)

这样,我所有的“creationSuite”测试都可以同时运行,并且所有测试的成功都会触发“modificationSuite”以快速失败的方式运行等。

或者,在测试套件内部指定对其他测试套件的依赖会很棒:

describe('Grouping endpoint', () => {
    // Somehow define dependencies
    this.dependsOn(uploadSuite)
Run Code Online (Sandbox Code Playgroud)

Eug*_*lov 13

您可以使用jest-runner-groups分组来定义和运行测试。安装并添加到 Jest 配置后,您可以使用 docblock 符号标记您的测试,如下所示:

/**
 * Foo tests
 *
 * @group group1/subgroup1
 * @group unit/foo
 */

describe( 'Foo class', () => {
    ...
} );
Run Code Online (Sandbox Code Playgroud)
/**
 * Bar tests
 *
 * @group group1/subgroup2
 * @group unit/bar
 */

describe( 'Bar class', () => {
    ...
} );
Run Code Online (Sandbox Code Playgroud)

更新你的 jest 配置以指定一个新的跑步者:

// jest.config.js
module.exports = {
    ...
    runner: "groups"
};
Run Code Online (Sandbox Code Playgroud)

然后要运行特定组,您需要使用--group=参数:

// Using the Jest executable
jest --group=mygroup

// Or npm
npm test -- --group=mygroup
Run Code Online (Sandbox Code Playgroud)

您还可以使用多个--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
Run Code Online (Sandbox Code Playgroud)


Vla*_*vić 7

我已经用--testNamePattern国旗做到了。这是程序。

假设您有两组测试:

  • DevTest 用于在开发环境中测试
  • ProdTest 用于生产环境测试

如果您只想测试开发环境所需的那些功能,则必须添加DevTest到测试描述中:

describe('(DevTest): Test in development environment', () => {
  // Your test
})

describe('(ProdTest): Test in production environment', () => {
  // Your test
})

describe('Test everywhere', () => {
  // Your test
})
Run Code Online (Sandbox Code Playgroud)

之后,您可以向package.json文件中添加命令:

  "scripts": {
    "test": "jest",
    "test:prod": "jest --testNamePattern=ProdTest",
    "test:dev": "jest --testNamePattern=DevTest",
    "test:update": "jest --updateSnapshot"
  }
Run Code Online (Sandbox Code Playgroud)

Commandnpm test将运行您的所有测试,因为您没有使用 flag --testNamePattern。如果您想运行其他测试,只需使用npm run test:devexample。

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


Est*_*ask 2

Jest 测试套件在多个线程中执行,这是它的主要优点之一。通过这种方式可以更快地完成测试运行,但设计时并未保留测试序列。

可以使用选项禁用此功能runInBand

可以使用选项根据测试和套件的名称来选择测试和套件,或者使用选项testNamePattern根据其路径来选择测试和套件。testPathPattern

由于一个套件依赖于另一个套件,因此它们可能可以按照预期的运行顺序组合成一个套件。它们仍然可以驻留在不同的文件中(确保它们不被 Jest 匹配),例如:

// foobar.test.js
describe(..., () => {
  require('foo.partial-test.js');
  require('bar.partial-test.js');
});
Run Code Online (Sandbox Code Playgroud)

问题是这样的:

我的一些测试依赖于其他测试的成功。

这是真正的问题。在任何类型的自动化测试中,依赖于先前测试状态的方法都被认为是有缺陷的。

我不想精心设置测试条件(例如,在运行测试之前人为地创建一堆用户图像),因为:(1)这只是逻辑的重复,(2)它增加了可能性某物破裂。

无需人为设置测试条件(夹具)。可以从现有环境中提取夹具,如果您确定其质量,甚至可以从当前测试的结果中提取夹具。

  • 自动化测试中自然会出现冗余和同义反复,这并没有什么问题。通过正确管理装置和共享代码,可以进行 DRYer 测试。

  • 恰恰相反,错误总是会累积的。创建错误先决条件的测试可能会通过,但另一个测试将失败,从而产生调试难题。