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的末尾运行端到端测试