【问题标题】:How to run a single test with Mocha?如何使用 Mocha 运行单个测试?
【发布时间】:2012-06-05 14:49:26
【问题描述】:

我使用 Mocha 来测试我的 JavaScript 内容。我的测试文件包含 5 个测试。是否可以运行特定测试(或一组测试)而不是文件中的所有测试?

【问题讨论】:

    标签: javascript mocha.js


    【解决方案1】:

    尝试使用mocha's --grep option

        -g, --grep <pattern>            only run tests matching <pattern>
    

    您可以使用任何有效的 JavaScript 正则表达式作为 &lt;pattern&gt;。例如,如果我们有test/mytest.js

    it('logs a', function(done) {
      console.log('a');
      done();
    });
    
    it('logs b', function(done) {
      console.log('b');
      done();
    });
    

    然后:

    $ mocha -g 'logs a'
    

    运行单个测试。请注意,此 greps 跨越所有 describe(name, fn)it(name, fn) 调用的名称。

    考虑使用嵌套的describe() 调用命名空间,以便于定位和选择特定集合。

    【讨论】:

    • 谢谢!我的印象是 --grep 仅从 @ 标签中过滤出来。
    • 以编程方式使用 Mocha 时(例如从 Grunt 中),有一个问题:grep 选项需要是 'RegExp()' 对象。如果是字符串,会被转义。
    • 这是唯一对我有用的解决方案。在命令行 (mocha some/test.js) 上指定文件根本不起作用。谢谢!
    • 有什么方法可以避免同时运行包含logs a 子字符串的logs a bcd?正则表达式^$ 不适用于 0.10.2。
    • 谢谢。如果我没有将目录指定为 mocha -g 'logs a' 会出现一些错误。
    【解决方案2】:

    根据您的使用模式,您可能只想使用 only。我们使用 TDD 风格;它看起来像这样:

    test.only('Date part of valid Partition Key', function (done) {
        //...
    }
    

    只有这个测试将从所有文件/套件中运行。

    【讨论】:

    • BDD 的工作方式相同。当您进行单个测试时,这非常有用。它也可以在套件/描述级别使用
    • 使用 chai 并期望语法为 it.only
    • 这个答案更好,因为当从业力等内部使用摩卡时它也可以工作。
    • it.only 不能与mocha-testdatagiven 一起使用。以后很容易忘记将其删除。
    • eslint-plugin-mocha 有一个规则 no-exclusive-tests,如果你忘记删除 .only,它会抓住你。
    【解决方案3】:

    如果您使用 npm test(使用 package.json 脚本),请使用额外的 -- 将参数传递给 mocha

    例如npm test -- --grep "my second test"

    编辑:看起来--grep 可能有点挑剔(可能取决于其他参数)。你可以:

    修改package.json:

    "test:mocha": "mocha --grep \"<DealsList />\" .",
    

    或者使用--bail,这似乎不那么挑剔

    npm test -- --bail
    

    【讨论】:

    • 为我工作。谢谢:)
    • @Andy --grep 可能有点麻烦 - 尝试在 npm 脚本条目中将其放在 mocha 之后。否则 npm test -- --bail 可用于在第一次失败测试后退出
    • --grep 之前传递额外的破折号拯救了我的一天!非常感谢。 PS。我在 Windows 上,运行 npm test -- --grep @tag
    【解决方案4】:

    不确定为什么在使用 npm 测试时 grep 方法对我不起作用。这虽然有效。由于某种原因,我还需要指定测试文件夹。

    npm test -- test/sometest.js
    

    【讨论】:

      【解决方案5】:

      您好,以上解决方案对我不起作用。 运行单个测试的另一种方式是

      mocha test/cartcheckout/checkout.js -g 'Test Name Goes here'
      

      这有助于从单个文件和特定名称运行测试用例。

      【讨论】:

      • 使用对-g 具有足够选择性的表达式,您无需指定文件名。如果你不能编写一个足够有选择性的表达式,那意味着你没有正确命名你的测试。
      【解决方案6】:

      您可以通过多种方式做到这一点。

      • 如果您只想从整个测试用例列表中运行一个测试,那么您可以在测试用例之前写only

        it.only('<test scenario name>', function() {
          // ...
        });
        

        或者你也可以执行下面的 mocha grep 命令

        mocha -g <test-scenario-name>
        
      • 如果你想运行一个描述部分中的所有测试用例,那么你也可以只写描述。

        describe.only('<Description of the tests under this section>', function() {
          // ...
        });
        
      • 如果您有多个测试文件并且只想运行其中一个,则可以按照以下命令进行操作。

        npm test <filepath>
        

        例如:

        npm test test/api/controllers/test.js
        

        这里的 'test/api/controllers/test.js' 是文件路径。

      【讨论】:

      • it.only() 语法真的很漂亮,尤其是如果您不想每次都修改您的package.json(即,当单元测试运行器是"scripts" 下的别名条目时)更改测试用例。更多上下文:medium.com/@cnadeau_/…
      【解决方案7】:

      运行单个测试——按文件名——

      实际上,如果您从mocha.opts,分别创建一个副本,没有:

      node_modules/.bin/mocha --opts test/mocha.single.opts test/self-test.spec.js
      

      这是我的 mocha.single.opts(只是缺少上述 glob 行不同)

      --require ./test/common.js
      --compilers js:babel-core/register
      --reporter list
      --recursive
      

      背景:虽然您可以覆盖 opts 文件中的各种开关(以 -- 开头),但您 can't override the glob。该链接也有 一些解释。

      提示:如果node_modules/.bin/mocha 让您感到困惑,请使用本地包 mocha。你也可以只写mocha,如果你已经全局安装了它。


      如果你想要package.json 的舒适感:仍然:从你的mocha.opts 中删除**/*-ish glob,将它们插入这里,用于所有测试,将它们留在单个测试中:

      "test": "mocha ./test/**/*.spec.js",
      "test-watch": "mocha -R list -w ./test/**/*.spec.js",
      "test-single": "mocha",
      "test-single-watch": "mocha -R list -w",
      

      用法:

      > npm run test
      

      分别

      > npm run test-single -- test/ES6.self-test.spec.js 
      

      mind the -- 将后面的任何文本链接到npm 脚本

      【讨论】:

      • $1 在我的设置中不需要,相反,它会导致如下警告:Warning: Could not find any test files matching pattern: $1
      【解决方案8】:

      调查https://mochajs.org/#usage 我们看到,只需使用

      摩卡测试/我的文件

      会起作用。您可以省略末尾的“.js”。

      【讨论】:

        【解决方案9】:

        将所有测试合并到一个 test.js 文件中,并将您的包 json 添加脚本为:

          "scripts": {
          "api:test": "node_modules/.bin/mocha --timeout 10000 --recursive api_test/"
        },
        

        在你的测试目录输入命令:

        npm run api:test
        

        【讨论】:

          【解决方案10】:

          你可以试试“it.only”

           it.only('Test one ', () => {
          
                      expect(x).to.equal(y);
                  });
          it('Test two ', () => {
          
                      expect(x).to.equal(y);
                  });
          

          这里只有第一个会执行

          【讨论】:

          • 如果在 CI / 构建服务器上没有通过 --forbid-only 执行测试,则很危险。 .only 倾向于潜入主分支并使其他测试静音,因为它们将不再执行。我开始想到更改代码以运行不同测试的工作流程是一种反特性。测试运行者应该确定应该执行哪些测试(也称为标记测试)而不是开发人员。
          • 我用它来测试我本地的一项功能,注意:不要将带有it.only 的代码提交给repo
          【解决方案11】:

          只需在“描述”、“它”或“上下文”之前使用 .only。我使用“$npm run test:unit”运行,它只执行带有 .only 的单元。

          describe.only('get success', function() {
           // ...
          });
          
          it.only('should return 1', function() {
            // ...
          });
          

          【讨论】:

          • 在浏览答案时切入正题。有用。好一个:)
          • 完美、快速且易于实施
          【解决方案12】:

          对于那些希望运行单个文件但他们无法使其工作的人,对我有用的是我需要将我的测试用例包装在如下描述套件中,然后使用描述标题,例如“我的测试描述”作为模式。

          describe('My Test Description', () => {
            it('test case 1', () => {
              // My test code
            })
            it('test case 2', () => {
            // My test code
            })
          })
          

          然后运行

          yarn test -g "My Test Description"

          npm run test -g "My Test Description"

          【讨论】:

            【解决方案13】:

            使用Mocha's --fgrep(或只是-f)可以选择包含字符串的测试,例如:

            mocha -f 'my test x'
            

            将运行所有包含it()describe()context() 块中的my test x 的测试。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-12-02
              • 1970-01-01
              • 1970-01-01
              • 2023-03-30
              • 1970-01-01
              • 2021-07-17
              • 1970-01-01
              • 2019-11-07
              相关资源
              最近更新 更多