这是一个示例,改编自您的原始代码,它为每个测试方法执行 setup 方法:
function doExpensiveSetupForModuleA() {
console.log("setup A");
}
function testA1() {
console.log("testA1");
start();
}
function testA2() {
console.log("testA2");
start();
}
function testA3() {
console.log("testA3");
start();
}
function doExpensiveSetupForModuleB() {
console.log("setup B");
}
function testB1() {
console.log("testB1");
start();
}
function testB2() {
console.log("testB2");
start();
}
function testB3() {
console.log("testB3");
start();
}
QUnit.module("A", { setup: doExpensiveSetupForModuleA });
asyncTest("A.1", testA1);
asyncTest("A.2", testA2);
asyncTest("A.3", testA3);
QUnit.module("B", { setup: doExpensiveSetupForModuleB });
asyncTest("B.1", testB1);
asyncTest("B.2", testB2);
asyncTest("B.3", testB3);
这将独立于执行测试的顺序,也独立于每个方法终止所花费的时间。
对 start() 的调用将确保仅在方法的该点收集测试结果。
更详细的示例可以在 QUnit Cookbook 中找到:http:
//qunitjs.com/cookbook/#asynchronous-callbacks
更新:
如果您不希望在每个测试方法之前执行昂贵的方法,但实际上每个模块只执行一次,只需在代码中添加控制变量以检查模块是否已设置:
var moduleAsetUp = false;
var moduleBsetUp = false;
function doExpensiveSetupForModuleA() {
if (!moduleAsetUp) {
console.log("setting up module A");
moduleAsetUp = true;
}
}
...
function doExpensiveSetupForModuleB() {
if (!moduleBsetUp) {
console.log("setting up module B");
moduleBsetUp = true;
}
}
...
在此示例中,输出将是:
setting up module A
testA1
testA2
testA3
setting up module B
testB1
testB2
testB3
这样,您就可以使用昂贵的方法作为模块设置,而不是测试方法设置。
单元测试应该是原子的、独立的、隔离的,因此它们运行的顺序不应该是相关的。
Qunit 并不总是以相同的顺序运行测试,无论如何,如果你希望你的测试以特定的顺序运行,你可以告诉 QUnit 不要重新排序它们:
QUnit.config.reorder = false;
这样您可以确保 testA 将在 testB 之前运行。