如何在多个文件中设置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测试用例的执行顺序的主要内容,如果未能解决你的问题,请参考以下文章