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

Posted

技术标签:

【中文标题】如何在多个文件中设置mocha测试用例的执行顺序【英文标题】:How to set execution order of mocha test cases in multiple files 【发布时间】:2015-03-29 13:07:50 【问题描述】:

我有两个包含 mocha 测试用例的 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)的内容仍然首先执行。如何更改这些测试文件的执行顺序?

【问题讨论】:

【参考方案1】:

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 () => )
)

该 repo 三年来没有太多活动,但它与 Mocha 9 配合得很好。

【讨论】:

【参考方案2】:

我正在导出一个包含所有必需文件的数组,这就是我通过包含所有测试文件的文件夹中的 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
];

【讨论】:

【参考方案3】:

按特定顺序执行我的测试的方法是创建一个单独的 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

【讨论】:

【参考方案4】:

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

将所有测试放在名为 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

【讨论】:

【参考方案5】:

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

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

等等

除了非常易于维护(无需 gulp grunt 或任何废话,无需编辑您的 package.json...),它还提供以下好处:

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

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

【讨论】:

这是最准确的答案。我最终这样做了。虽然不优雅是确保特定执行顺序的最佳方式,因为默认情况下文件是按字母顺序测试的。谢谢djfm!! 这样做的问题是 10 运行在 2 之前。 @Matt 我相信作者的意思是为“级别”而不是“步骤”提供数字。我最终也给我的步数编号,现在面临同样的问题 - 在 2 之前运行 10 次。 用零填充(如 001-067)有帮助【参考方案6】:

如果您喜欢特定的顺序,您可以将文件(按顺序)列为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

【讨论】:

我不确定这是不是真的。我通过在命令行中传入 3 个文件来测试这一点,然后 mocha 以非顺序执行它们。 它试图将它们全部作为一个文件读取,这对我不起作用。 警告:找不到任何匹配模式mocha test1.js test2.js“未找到测试文件”的测试文件 嗯,可能是 Mocha 的行为发生了变化。也有可能我误解了它的行为,而这只是发生对我有用。【参考方案7】:

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

$ mocha --help

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

【讨论】:

按文件名字母顺序排列。 谢谢,我假设但想确认。 如果我不对它们进行排序,你能告诉我这些文件的执行顺序吗? @Alexander,可能 «目录顺序» 非常依赖于您的文件系统。在 Linux 下,可能是创建文件的顺序。在 MS-Windows 上,它可能是随机的(好吧,可能不是,但我不确定 NFS 目前做了什么)。在 Mac OS/X 上,它将被排序。文件系统会自动执行此操作以加速 Finder 记住:1、11、2、3、4【参考方案8】:

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

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

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

【讨论】:

我喜欢这个,干净多了。将对此进行测试。这样做有什么影响吗(测试文件之间的变量范围?) 对于那些和我问同样问题的人:“如果所需的测试已经与 mocha 运行选项匹配,是否会执行两次?”,答案是“否”。所以这个解决方案似乎比执行随机的字母顺序要好得多。 @Gnucki 按字母顺序,根据定义,不是随机的。 这里的随机是指字母顺序没有理由与测试顺序匹配(除非您在文件名前加上前缀,这肯定是一件坏事)。 这是最好的解决方案,因为它允许您自动将事物按依赖顺序排列。我要问的唯一问题是,您是否可以做些什么来利用它来使运行测试取决于(一个或多个?)所需文件中的测试的成功(我可能不需要测试拉取数据例如,如果我的登录测试失败)。

以上是关于如何在多个文件中设置mocha测试用例的执行顺序的主要内容,如果未能解决你的问题,请参考以下文章

selenium测试用例的执行顺序

unittest用例执行的顺序

python自动测试Pytest中Fixture装饰器

测试套件

使用配置表+Mocha动态生成用例的JSAPI自动化测试

接口自动化之pytest——用例设计原则及执行顺序