Jestjs 如何按顺序运行Jest测试?
我正在通过Jestjs 如何按顺序运行Jest测试?,jestjs,Jestjs,我正在通过npm-test运行Jest测试。默认情况下,Jest并行运行测试。有没有办法让测试按顺序运行 我有一些调用依赖于更改当前工作目录的第三方代码的测试。也可以通过运行命令jest--help来访问 您将看到您正在寻找的选项:。我仍然对Jest很熟悉,但似乎描述块是同步运行的,而测试块是异步运行的。我正在一个外部描述中运行多个描述块,该描述类似于: describe describe test1 test2 describe
npm-test
运行Jest测试。默认情况下,Jest并行运行测试。有没有办法让测试按顺序运行
我有一些调用依赖于更改当前工作目录的第三方代码的测试。也可以通过运行命令jest--help来访问
您将看到您正在寻找的选项:。我仍然对Jest很熟悉,但似乎描述块是同步运行的,而测试块是异步运行的。我正在一个外部描述中运行多个描述块,该描述类似于:
describe
describe
test1
test2
describe
test3
module.exports = {
testSequencer: "./__e2e__/jest/customSequencer.js",
projects: [{
"rootDir": "<rootDir>/__e2e__",
"displayName": "end-to-end",
...
在这种情况下,test3
在test2
完成之前不会运行,因为test3
位于包含test2的descripe块之后的descripe块中,这对我来说很有效,确保了顺序运行与模块很好分离的测试:
1) 将测试保存在单独的文件中,但命名中不包含spec/test
|__testsToRunSequentially.test.js
|__tests
|__testSuite1.js
|__testSuite2.js
|__index.js
2) 带有测试套件的文件也应如下所示(testSuite1.js):
3) 将它们依次导入testor.test.js
并使用--runInBand
运行:
import { testSuite1, testSuite2 } from './tests'
describe('sequentially run tests', () => {
testSuite1()
testSuite2()
})
使用串行测试运行程序:
npm install jest-serial-runner --save-dev
设置jest以使用它,例如在jest.config.js中:
module.exports = {
...,
runner: 'jest-serial-runner'
};
您可以使用项目功能将其仅应用于测试的子集。请参见从中复制的
test.spec.js
import { signuptests } from './signup'
import { logintests } from './login'
describe('Signup', signuptests)
describe('Login', logintests)
export const signuptests = () => {
it('Should have login elements', () => {});
it('Should Signup', () => {}});
}
export const logintests = () => {
it('Should Login', () => {}});
}
signup.js
import { signuptests } from './signup'
import { logintests } from './login'
describe('Signup', signuptests)
describe('Login', logintests)
export const signuptests = () => {
it('Should have login elements', () => {});
it('Should Signup', () => {}});
}
export const logintests = () => {
it('Should Login', () => {}});
}
login.js
import { signuptests } from './signup'
import { logintests } from './login'
describe('Signup', signuptests)
describe('Login', logintests)
export const signuptests = () => {
it('Should have login elements', () => {});
it('Should Signup', () => {}});
}
export const logintests = () => {
it('Should Login', () => {}});
}
虽然--runInBand
可以工作,但它的功能比您需要的稍多—根据Jest的文档:
在当前进程中连续运行所有测试,而不是创建运行测试的子进程的工作进程池(…)
通常,Jest使用一个父调度程序进程运行,该进程将子进程作为有效地并行运行测试的工作进程进行调度runInBand
似乎通过将所有内容压缩到一个进程中来打破这种体系结构
为了保留核心范例并按顺序运行,您可以使用--maxWorkers 1
,这将简单地将并发运行的worker数量限制为1(从而产生顺序运行):
jest--maxWorkers 1
jest-w1
也可以作为别名使用
这样做的好处是,如果可能的话,您不必像对待runInBand
(例如,在各种配置/环境设置文件中)那样,在所有假设中都采用任何特殊的JS上下文,这将使您更加安全。是的,您还可以按照特定的顺序运行所有测试,尽管通常情况下,您的测试应该是独立的,所以我强烈警告不要依赖任何特定的顺序。话虽如此,可能存在控制测试顺序的有效案例,因此您可以这样做:
- 在运行jest时添加
--runInBand
作为选项,例如在package.json
中。这将按顺序而不是并行(异步)运行测试。使用--runInBand
可以防止一组测试中的设置/拆卸/清理等问题与其他测试发生冲突:
“scripts”:{“test”:“jest--runInBand”}
- 将所有测试放在单独的文件夹中(例如,
\uuuuu tests\uuuuu
下的一个单独文件夹,名为test\u suites
):
\uuuu测试
测试套件
test1.js
import { signuptests } from './signup'
import { logintests } from './login'
describe('Signup', signuptests)
describe('Login', logintests)
export const signuptests = () => {
it('Should have login elements', () => {});
it('Should Signup', () => {}});
}
export const logintests = () => {
it('Should Login', () => {}});
}
test2.js
import { signuptests } from './signup'
import { logintests } from './login'
describe('Signup', signuptests)
describe('Login', logintests)
export const signuptests = () => {
it('Should have login elements', () => {});
it('Should Signup', () => {}});
}
export const logintests = () => {
it('Should Login', () => {}});
}
- 在
package.json
中配置jest以忽略此test\u suites
文件夹:
“jest”:{“testPathIgnorePatterns”:[“/test_suites”]}
- 在
\uuuu tests\uuuu
下创建一个新文件,例如tests.js
——这是目前唯一实际运行的测试文件
- 在
tests.js
中,要求按照要运行的顺序运行各个测试文件:
require('./test_suites/test1.js')代码>
require('./test_suites/test2.js')代码>
注意-这将导致在所有测试完成后运行测试中的afterAll()
。本质上,它打破了测试的独立性,应该在非常有限的场景中使用。来自笑话:
Jest在执行之前执行测试文件中的所有描述处理程序
任何实际测试。这是进行安装和调试的另一个原因
在*之前*和*之后*处理程序内部而不是在
描述块
默认情况下,描述块完成后
Jest按顺序连续运行所有测试
在收集阶段遇到的问题,正在等待每个问题的完成和解决
在出发前先整理一下
看看jest站点给出的示例。以防有人想在package.json选项中保留所有jest配置
runInBand似乎不是有效的配置选项。这意味着您可以在下面的设置中结束,该设置似乎并非100%完美
"scripts": {
"test": "jest --runInBand"
},
...
"jest": {
"verbose": true,
"forceExit": true,
"preset": "ts-jest",
"testURL": "http://localhost/",
"testRegex": "\\.test\\.ts$",
...
}
...
但是,您可以使用maxWorkers选项添加runInBand,如下所示:
"scripts": {
"test": "jest"
},
...
"jest": {
"verbose": true,
"maxWorkers": 1,
"forceExit": true,
"preset": "ts-jest",
"testURL": "http://localhost/",
"testRegex": "\\.test\\.ts$",
...
}
...
我需要它来处理端到端测试和常规测试,而runInBand
解决方案对我来说是不够的。是的:它确保在测试套件/文件中顺序有效,但文件本身的运行顺序基本上是由Jest为并行化选择的,并且不容易控制。如果您需要测试套件本身的稳定顺序,这就是您可以做到的
因此,除了--runInBand
,我还做了以下工作。顺便说一句,我在一个存储库中使用不同的项目
我的jest.config.js
如下所示:
describe
describe
test1
test2
describe
test3
module.exports = {
testSequencer: "./__e2e__/jest/customSequencer.js",
projects: [{
"rootDir": "<rootDir>/__e2e__",
"displayName": "end-to-end",
...
这个组合按照Jest喜欢的方式运行所有常规测试,但总是在alp的末尾运行端到端测试