如何在多个文件中设置mocha测试用例的执行顺序

How to set execution order of mocha test cases in multiple files

我有两个 javascript 文件,其中包含 mocha 测试用例。

//----------abc.js -------------

describe("abc file", function(){
  it("test 1" , function(){
    assert.equal(20 , 20); 
  });
}); 

//---------xyz.js--------------
describe("xyz file", function(){
      it("test 1" , function(){
        assert.equal(10 , 10); 
      });
    });

我将它们放在一个名为 test 的文件夹中,当我执行 mocha 命令时,第一个文件 (abc.js) 总是在 xyz.js 之前执行。 我认为这可能是由于按字母顺序排列并将文件重命名为

abc.js => xyz.js
xyz.js => abc.js

但是,xyz.js(以前是 abc.js)的内容仍然会先执行。如何更改这些测试文件的执行顺序?

在第二个文件中,需要第一个:

--- two.js ---
require("./one")

Mocha 将 运行 按照 describe 调用执行的顺序进行测试。

Mocha 有一个 --sort(简称 -S)选项,用于对测试文件进行排序:

$ mocha --help

[...]
    -S, --sort                              sort test files
[...]

我对此采用完全独立的解决方案。

将所有测试放在名为 test/ 的文件夹中,然后 按照执行顺序

在根目录下创建文件tests.js
--- tests.js ---
require('./test/one.js')
require('./test/two.js')
require('./test/three.js')

并在测试文件 one.js、two.js 等中编写简单的 mocha 测试

如果你想按照你定义的顺序 运行 它们,那么 运行 mocha tests.js

如果您喜欢特定的顺序,您可以将文件(按顺序)列为 mocha 的 command-line 个参数,例如:

$ mocha test/test-file-1.js test/test-file-2.js

为避免每次要 运行 时输入大量内容,您可以将其转换为 npm 脚本 package.json:

{
  // ...
  "scripts": {
    "test": "mocha test/test-file-1.js test/test-file-2.js"
  }
  // ...
}

然后 运行 您的命令行套件:

$ npm test

或者如果您使用的是 Gulp,您可以在 gulpfile.js:

中创建一个任务
var gulp = require('gulp');
var mocha = require("gulp-mocha");

gulp.task("test", function() {
  return gulp.src([
      "./test/test-file-1.js",
      "./test/test-file-2.js"
    ])
    .pipe(mocha());
});

然后 运行 $ gulp test.

由于 mocha 按字母顺序对文件进行排序,我通常在测试文件名前加上数字,例如:

  • 0 - util.js
  • 1 - something low level.js
  • 2 - something more interesting.js

等等

除了非常容易维护(没有 gulp 咕噜声或任何废话,没有编辑你的 package.json...),它提供的好处是:

  • 阅读您的源代码的人会了解您的程序结构,从不太有趣的部分开始,向上移动到业务层
  • 当测试失败时,你有一些因果关系的迹象(如果在 1 - something.js 中失败但在 0 - base.js 中没有失败,那么它可能是 [=13 覆盖的层的错误=]

如果你在做真正的单元测试,当然顺序应该无关紧要,但我很少能够一路进行单元测试。

我的测试以特定顺序执行的方法是创建一个单独的 test.js 文件,然后为我想执行的每个 mocha 测试文件添加一个 describe .

test.js:

describe('test file 1', function() {
  require('./test1.js')
})

describe('test file 2', function() {
  require('./test2.js')
})

然后就运行mocha test.js

我正在导出一个包含所有必需文件的数组,这就是我通过包含所有测试文件的文件夹中的 index.js 文件告诉 mocha 执行顺序的方式:

const Login = require('../login');
const ChangeBudgetUnit = require('./changeBudgetUnit');
const AddItemsInCart = require('./addItemsInCart'); 

// if the order matters should export array, not object
module.exports = [
    Login,
    ChangeBudgetUnit,
    AddItemsInCart
];

mocha-steps 允许您以特定顺序编写 运行 的测试,并在第一次失败时中止 运行。它提供了 it 的直接替代品,称为 steps.

用法示例:

describe('my smoke test', async () => {
  step('login', async () => {})
  step('buy an item', async () => throw new Error('failed'))
  step('check my balance', async () => {})
  xstep('temporarily ignored', async () => {})
})

三年来回购activity很少见,但它在 Mocha 9 上运行良好。