使用 Mocha 在 Nightwatch 中循环测试
Looping through tests in Nightwatch using Mocha
我正在使用 Nightwatch 和 Mocha 编写一些自动化(动态)测试。动态的意思是我想动态加载一些用于循环测试用例的数据。请参阅下面的代码。我正在为三个项目而苦苦挣扎:
- 假设我的 testArray 中有 3 个项目。当它在测试 (it) 中循环时,它只打开一个浏览器,转到 google.com 并且不启动其他 2 个浏览器。我确定这与我遇到的一些异步问题有关,但我不知道如何解决。
- 从 #1 继续,第一个(也是唯一一个打开的浏览器)在结束时甚至没有关闭。使用 done() 的某些方面再次出现异步问题。
- 理想情况下,我想在 运行 时动态命名测试。即,而不是它("foo" ...我想要么围绕它循环并传递标题(我无法正常工作)或以某种方式在测试中更改它(它)动态编码。
请注意,我不需要将 Mocha 与 Nightwatch 一起使用,但我开始尝试使用 Mocha 的动态测试功能(新 TestCase),但我也无法使其正常工作。
这是我的代码的 scaled-down 版本。
var testArray = [];
describe('createArray', function() {
before(function(client, done) {
// do some async operations within a loop and create testArray entries
// loop {
testArray.push(foo); // let's say I end up with 3 items.
// }
done();
});
it('foo', function(client) {
console.log(testCaseArray);
testCaseArray.forEach(function(testCase) {
client.url("http://www.google.com"); // let's say here I would eventually want to have something like client.url("http://....." + testCase.value)
});
});
});
提前致谢。
你说得对,你需要异步处理测试用例。可以这样做:
it('foo', function(client, done) {
var testsLeft = testCaseArray.length;
function onTestComplete() {
testsLeft--;
if (testsLeft === 0)
done();
}
testCaseArray.forEach(function(testCase) {
client.url("http://" + testCase.value, onTestComplete);
});
});
我不熟悉 Nightwatch,所以您可能需要像这样使用 onTestComplete
:
client.url("http://" + testCase.value).end(onTestComplete);
此外,我意识到这是处理异步回调的一种非常冗长的方式。通常对于这种情况,使用 CallbackManager 之类的东西会很有帮助,这样您就不需要手动跟踪剩余的测试数量。
更新:
您还可以根据 Mocha documentation.
动态生成测试
我正在使用 Nightwatch 和 Mocha 编写一些自动化(动态)测试。动态的意思是我想动态加载一些用于循环测试用例的数据。请参阅下面的代码。我正在为三个项目而苦苦挣扎:
- 假设我的 testArray 中有 3 个项目。当它在测试 (it) 中循环时,它只打开一个浏览器,转到 google.com 并且不启动其他 2 个浏览器。我确定这与我遇到的一些异步问题有关,但我不知道如何解决。
- 从 #1 继续,第一个(也是唯一一个打开的浏览器)在结束时甚至没有关闭。使用 done() 的某些方面再次出现异步问题。
- 理想情况下,我想在 运行 时动态命名测试。即,而不是它("foo" ...我想要么围绕它循环并传递标题(我无法正常工作)或以某种方式在测试中更改它(它)动态编码。
请注意,我不需要将 Mocha 与 Nightwatch 一起使用,但我开始尝试使用 Mocha 的动态测试功能(新 TestCase),但我也无法使其正常工作。
这是我的代码的 scaled-down 版本。
var testArray = [];
describe('createArray', function() {
before(function(client, done) {
// do some async operations within a loop and create testArray entries
// loop {
testArray.push(foo); // let's say I end up with 3 items.
// }
done();
});
it('foo', function(client) {
console.log(testCaseArray);
testCaseArray.forEach(function(testCase) {
client.url("http://www.google.com"); // let's say here I would eventually want to have something like client.url("http://....." + testCase.value)
});
});
});
提前致谢。
你说得对,你需要异步处理测试用例。可以这样做:
it('foo', function(client, done) {
var testsLeft = testCaseArray.length;
function onTestComplete() {
testsLeft--;
if (testsLeft === 0)
done();
}
testCaseArray.forEach(function(testCase) {
client.url("http://" + testCase.value, onTestComplete);
});
});
我不熟悉 Nightwatch,所以您可能需要像这样使用 onTestComplete
:
client.url("http://" + testCase.value).end(onTestComplete);
此外,我意识到这是处理异步回调的一种非常冗长的方式。通常对于这种情况,使用 CallbackManager 之类的东西会很有帮助,这样您就不需要手动跟踪剩余的测试数量。
更新:
您还可以根据 Mocha documentation.
动态生成测试