【问题标题】:How to set execution order of mocha test cases in multiple files如何在多个文件中设置mocha测试用例的执行顺序
【发布时间】: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)的内容仍然首先执行。如何更改这些测试文件的执行顺序?

【问题讨论】:

    标签: javascript node.js tdd mocha.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 按字母顺序,根据定义,不是随机的。
            • 这里的随机是指字母顺序没有理由与测试顺序匹配(除非您在文件名前加上前缀,这肯定是一件坏事)。
            • 这是最好的解决方案,因为它允许您自动将事物按依赖顺序排列。我要问的唯一问题是,您是否可以做些什么来利用它来使运行测试取决于(一个或多个?)所需文件中的测试的成功(我可能不需要测试拉取数据例如,如果我的登录测试失败)。
            猜你喜欢
            • 1970-01-01
            • 2012-04-01
            • 2018-04-23
            • 2018-03-10
            • 2019-09-02
            • 2013-07-08
            • 2014-05-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多