如何使用Mocha运行单个测试?

436

我使用Mocha来测试JavaScript代码。我的测试文件包含5个测试用例。是否有可能只运行特定的一个测试用例,或一组测试用例而不是运行文件中所有的测试用例?

15个回答

497

尝试使用mocha的--grep选项

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

您可以使用任何有效的JavaScript正则表达式作为<pattern>。例如,如果我们有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'

运行单个测试。请注意,这会搜索所有describe(name, fn)it(name, fn)调用的名称。

考虑使用嵌套的describe()调用进行命名空间分组,以便更轻松地定位和选择特定的测试集。


6
在编程中使用Mocha(例如从Grunt中),有一点需要注意:grep选项需要是一个´RegExp()´对象。如果它是一个字符串,那么它将被转义处理。 - h-kippo
1
这是唯一对我有效的解决方案。在命令行上指定文件(mocha some/test.js)根本不起作用。谢谢! - hraban
2
有没有办法避免运行包含“logs a”子字符串的“logs a bcd”?正则表达式“^$”在0.10.2上不起作用。 - Ciro Santilli OurBigBook.com
谢谢。如果我不指定目录,会遇到一些错误,正确的命令是 mocha -g 'logs a'。 - kta
对于任何Windows用户:测试名称需要用双引号括起来,至少这是对我有效的。 - Krispies
是的,它对我有效。npm run test --grep ./test/bootstrap.test.js ./test/integration/controllers/AccountManagementController-v2.test.js - Neel Rathod

225

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

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

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


5
BDD的工作方式是相同的。这对于你在单个测试中工作时非常有用。它也可以在suite/describe级别使用。 - andyzinsser
31
使用chai和expect语法,可以使用it.only来实现。 - elkelk
4
这个答案更好,因为它在从karma内部使用mocha等情况下也可以工作。 - Vivek Kodira
3
it.onlymocha-testdatagiven 不兼容。而且很容易忘记后来将其删除。 - Tr1et
6
eslint-plugin-mocha有一个规则叫做no-exclusive-tests,如果你忘记移除.only,它将会提示你。 - dostu
显示剩余3条评论

125
如果您正在使用npm test(使用package.json脚本),请使用额外的--将参数传递给mocha。
例如:npm test -- --grep"my second test" 编辑:看起来--grep可能有点棘手(可能取决于其他参数)。 您可以:
修改package.json:
"test:mocha": "mocha --grep \"<DealsList />\" .",

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

npm test -- --bail

2
@Andy --grep 可能有点挑剔 - 尝试将其放在 npm 脚本条目中的 mocha 之后。否则,npm test -- --bail 在第一个失败的测试后退出很有用。 - Ashley Coolman
2
--grep之前添加额外的破折号,救了我的一天!非常感谢。附注:我正在Windows上运行npm test -- --grep @tag - Mykola

89

只需在“describe”,“it”或“context”之前使用“.only”。我通过"$npm run test:unit"运行,它只执行带有.only的单元测试。

describe.only('get success', function() {
 // ...
});

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

这是正确的答案。 - glcheetham

38

运行单个测试-通过文件名-

实际上,您也可以通过文件名(而不仅仅是通过“it()-string-grepping”)来运行单个mocha测试,如果您从mocha.opts中删除全局模式(例如./test/**/*.spec.js),或者创建一个没有全局模式的副本。

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文件中的各种开关(以--开头),但是您无法覆盖全局匹配模式。该链接也有一些解释。

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


如果您想要使用package.json:仍需从mocha.opts中删除类似于**/*的全局匹配模式,在此处插入它们进行全部测试,对于单个测试,请将它们留空。

"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 

注意使用--,它会将其后的任何文本链接到npm脚本


在我的设置中不需要$1,相反,它会导致警告,如下所示:“警告:找不到与模式$1匹配的任何测试文件。” - Merijn Vogel

36

有多种方法可以做到这一点。

  • 如果您只想运行测试用例列表中的一个测试,那么您可以在测试用例前加上only

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

您还可以按以下方式执行mocha grep命令

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

  • 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”是文件路径。


    1
    it.only() 语法非常巧妙,特别是当你不想每次更改测试用例时修改 package.json(即当单元测试运行器是 "scripts" 下的别名条目时)更是如此。更多上下文请参见:https://medium.com/@cnadeau_/mocha-running-a-single-test-in-dev-64f2dc509f99 - kip2

    16

    你可以尝试使用 "it.only"

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

    只有第一个会执行


    2
    如果在 CI / 构建服务器上没有通过 --forbid-only 执行测试,会产生一定的风险。.only 很容易出现在主分支中,从而使得其他测试失效,因为它们不再被执行。我认为将更改代码以运行不同的测试的工作流程视为反功能特性。测试运行器应该确定哪些测试应该被执行(即标记测试),而不是开发人员。 - k0pernikus
    我在本地使用它来测试一个功能, 注意:不要将带有 it.only 的代码提交到代码库。 - Bikesh M

    11

    您好,上述解决方案对我无效。运行单个测试的另一种方法为

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

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


    2
    使用足够具有选择性的表达式来使用 -g,就不需要指定文件名。如果无法编写足够具有选择性的表达式,则意味着您未正确命名测试。 - Louis

    9

    查看文档,我们发现只需使用以下命令:

    mocha test/myfile
    

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


    5

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

    mocha -f 'my test x'
    

    将运行包含my test x的所有测试,无论是在it()describe()还是context()块中。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接