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

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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-testdata 的given 一起使用。以后很容易忘记将其删除。 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 的测试。

【讨论】:

以上是关于如何使用 Mocha 运行单个测试?的主要内容,如果未能解决你的问题,请参考以下文章

您如何安装和运行 Mocha,Node.js 测试模块?安装后获取“mocha:找不到命令”

如何在 vs 代码中使用 mocha 生成覆盖率报告?

如何适当地重用 mocha 测试的 describe 块?

运行 mocha 测试后如何杀死 nodemon 进程?

如何在单个命令中使用 mochawesome 和 mocha-sonarqube-report?

如何在 Mocha 单元测试中访问命名空间的 Vuex getter