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

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

本文关键字:测试用例 摩卡 执行 顺序 设置 文件      更新时间:2023-09-26

我有两个包含摩卡测试用例的javascript文件。

//----------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")

或者,如果您使用的是 ES 模块:

--- two.js ---
import "./one"

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

我遵循一个完全独立的解决方案。

将所有测试放在名为 test/和在根目录中按执行顺序创建文件测试.js

--- tests.js ---
require('./test/one.js')
require('./test/two.js')
require('./test/three.js')

并在测试文件中编写一个简单的摩卡测试.js.js

等等

这样,如果您想按照定义的顺序运行它们,只需运行mocha tests.js

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

$ mocha --help
[...]
    -S, --sort                              sort test files
[...]

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

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

等。

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

  • 阅读您的源代码的人可以了解程序的结构,从不太有趣的部分开始,一直到业务层。
  • 当测试失败时,您有一些因果关系的迹象(如果某些东西在1 - something.js中失败,但0 - base.js没有失败,那么这可能是1 - something.js所覆盖的层的错误

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

如果您更喜欢特定的顺序,您可以将文件(按顺序)作为命令行参数列出以mocha,例如:

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

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

{
  // ...
  "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 .

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

测试.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 () => {})
})

该回购三年来没有太多活动,但它在 Mocha 9 上运行良好。