我对特定项目的 nodeunit 测试具有以下文件夹结构:
/tests
/tests/basic-test.js
/tests/models/
/tests/models/model1-tests.js
/tests/models/model2-tests.js
我的问题是 - 如何让 nodeunit 自动执行测试文件夹中的所有测试,包括其中包含的子目录?
如果我执行nodeunit 测试,它只会执行 basic-test.js 并默认跳过子文件夹中的所有内容。
使用make
基于魔法(或基于外壳的魔法)。
test:
nodeunit $(shell find ./tests -name \*.js)
在这里,您将运行结果传递find ./tests -name \*.js
给nodeunit
应该递归运行所有 javascript 测试
Nodeunit 允许您传入运行测试的目录列表。我使用了一个名为diveSync 的包,它同步并递归地循环文件和目录。我将所有目录存储在一个数组中并将其传递给 nodeunit:
var diveSync = require("diveSync"),
fs = require("fs"),
nodeUnit = require('nodeunit'),
directoriesToTest = ['test'];
diveSync(directoriesToTest[0], {directories:true}, function(err, file) {
if (fs.lstatSync(file).isDirectory()) {
directoriesToTest.push(file);
}
})
nodeUnit.reporters.default.run(directoriesToTest);
虽然这不是如上所述的自动解决方案,但我创建了一个收集器文件,如下所示:
allTests.js:
exports.registryTests = require("./registryTests.js");
exports.message = require("./messageTests.js")
当我运行时nodeunit allTests.js
,它会运行所有测试,并指示层次结构:
? registryTests - [Test 1]
? registryTests - [Test 2]
? messageTests - [Test 1]
ETC...
虽然创建新的单元测试文件需要将其包含在收集器中,但这是一项简单的一次性任务,我仍然可以单独运行每个文件。对于一个非常大的项目,这也将允许收集器运行多个测试,但不是所有测试。
我正在寻找相同问题的解决方案。所提供的答案都不完全适合我的情况,其中:
所以对我来说最终的解决方案是结合 Ian 和 mbmcavoy 的想法:
// nodeunit tests.js
const path = require('path');
const fs = require('fs');
// Add folders you don't want to process here.
const ignores = [path.basename(__filename), 'node_modules', '.git'];
const testPaths = [];
// Reads a dir, finding all the tests inside it.
const readDir = (path) => {
fs.readdirSync(path).forEach((item) => {
const thisPath = `${path}/${item}`;
if (
ignores.indexOf(item) === -1 &&
fs.lstatSync(thisPath).isDirectory()
) {
if (item === 'tests') {
// Tests dir found.
fs.readdirSync(thisPath).forEach((test) => {
testPaths.push(`${thisPath}/${test}`);
});
} else {
// Sub dir found.
readDir(thisPath);
}
}
});
}
readDir('.', true);
// Feed the tests to nodeunit.
testPaths.forEach((path) => {
exports[path] = require(path);
});
nodeunit tests.js
现在,我只需一个命令即可运行所有新旧测试。
从代码中可以看出,测试文件应该在tests
文件夹中,并且文件夹不应该有任何其他文件。