Protractor 量角器-在执行expect之前,等待异步调用完成
我正在运行以下程序:Protractor 量角器-在执行expect之前,等待异步调用完成,protractor,Protractor,我正在运行以下程序: it('should be able to run sql', function () { var success = true; var testsCompleted; for (var i = 0; i < sqlToRun[1].length; i++) { sql.runEtlQuery(config, sqlToRun, i).then(function () { testsCompleted+
it('should be able to run sql', function () {
var success = true;
var testsCompleted;
for (var i = 0; i < sqlToRun[1].length; i++) {
sql.runEtlQuery(config, sqlToRun, i).then(function () {
testsCompleted++;
}).catch(function (err) {
console.log(err);
success = false;
});
}
expect(testsCompleted == sqlToRun[1].length).toBeTruthy();
expect(success).toBeTruthy();
});
控制台输出如下所示:
[13:12:42] I/launcher - Running 1 instances of WebDriver
[13:12:42] I/local - Starting selenium standalone server...
[13:12:43] I/local - Selenium standalone server started at http://10.197.244.125:62251/wd/hub
Started
..F
Failures:
1) ETL tests should be able to run sql
Message:
Expected false to be truthy.
Stack:
Error: Failed expectation
---<removed stacktrace>---
3 specs, 1 failure
Finished in 270.903 seconds
#17: CDW_Test - Passed
#15: CDW_LabTestName - Passed
#4: CDW_removed - Passed
#5: CDW_removed - Passed
#1: CDW_moreremoved - Passed
#30: CDW_Stuff - Passed
<ect>
[13:12:42]I/launcher-运行WebDriver的1个实例
[13:12:42]I/local-正在启动selenium独立服务器。。。
[13:12:43]I/local-Selenium独立服务器已在启动http://10.197.244.125:62251/wd/hub
起动
F
失败:
1) ETL测试应该能够运行sql
信息:
期望虚假成为真实。
堆栈:
错误:预期失败
------
3个规格,1个故障
以270.903秒完成
#17:CDW_测试-通过
#15:CDW_LabTestName-已通过
#4:CDW_已移除-通过
#5:CDW_已移除-通过
#1:CDW_More已删除-通过
#30:CDW_材料-通过
我试图弄清楚如何让它在检查测试是否失败或通过之前等待所有sql查询完成
我曾经使用过它,这样它在第一个错误时就会失败,但我想更改它,以便它在测试失败之前继续处理sql查询,以获得所有失败的列表。首先,这是一个很好的例子,说明为什么我不喜欢测试中出现多个
expect
。。。因为我不知道你的expect
s中哪个失败了
也就是说,假设失败的不是您runEtlQuery
方法,那么您可能会遇到问题
TLDR;可以使用来确保索引按预期绑定
it('should be able to run sql', function () {
var success = true;
var testsCompleted;
for (var i = 0; i < sqlToRun[1].length; i++) {
(funciton(index) {
sql.runEtlQuery(config, sqlToRun, index).then(function () {
testsCompleted++;
}).catch(function (err) {
console.log(err);
success = false;
});
})(i);
}
expect(testsCompleted == sqlToRun[1].length).toBeTruthy();
expect(success).toBeTruthy();
});
it('应该能够运行sql',函数(){
var成功=真;
var测试完成;
对于(var i=0;i
我确实找到了让它正常工作的方法,即使它不是最优雅的解决方案:
it('should be able to run sql', function (done) {
sql.recursiveRunEtlQuery(config, sqlToRun, sqlToRun[1].length - 1).then(function () {
done();
}).catch(function (err) {
success = false;
done.fail(err);
});
然后RecursiveUnetlQuery函数如下所示:
runEtlQuery: function (config, sqlToRun, i) {
var defer = protractor.promise.defer();
var connection = new sql.ConnectionPool(config, function (err) {
var request = new sql.Request(connection);
request.query(sqlToRun[1][i], function (err, recordset) {
if (err) defer.reject("#" + i + ": " + sqlToRun[0][i] +"\x1b[31m Error: \x1b[0m" + err);
else {
console.log("#" + i + ": " + sqlToRun[0][i] + " - \x1b[32mPassed\x1b[0m");
defer.fulfill();
connection.close();
}
});
});
return defer.promise;
},
recursiveRunEtlQuery: function (config, sqlToRun, i) {
var defer = protractor.promise.defer();
if (i >= 0) {
module.exports.recursiveRunEtlQuery(config, sqlToRun, i - 1).then(function () {
module.exports.runEtlQuery(config, sqlToRun, i).then(function () {
defer.fulfill();
}).catch(err => {
defer.reject(utilities.stringFormat("Error Running ETL: \x1b[36m{0}\x1b[0m:\nSQL:\n\x1b[33m{1}\x1b[0m\nError:\n\x1b[31m{2}\x1b[0m", sqlToRun[0][i], sqlToRun[1][i], err));
});
}).catch(err => {
module.exports.runEtlQuery(config, sqlToRun, i).then(function () {
defer.reject(err);
}).catch(err2 => {
defer.reject(utilities.stringFormat("Error Running ETL: \x1b[36m{0}\x1b[0m:\nSQL:\n\x1b[33m{1}\x1b[0m\nError:\n\x1b[31m{2}\x1b[0m\n{3}", sqlToRun[0][i], sqlToRun[1][i], err2, err));
});
});
}
else defer.fulfill();
return defer.promise;
此解决方案的主要问题是,它强制它同步运行,而不是异步运行,这将导致它运行更长时间,因为某些查询需要一段时间才能完成。是的,我通常会注释掉其中一个“expect”,而
testsCompleted
行基本上只用于调试代码以确保在运行预期之前完成所有工作。不管是否有sql错误,只要有success
行,测试总是会成功的。我只是试着在中运行它,当它应该成功时它仍然失败,当它应该失败时它仍然成功(即第一个expect将导致它失败,第二个expect将导致它成功,即使有错误),因此,在完成第一个sql之前,它仍在运行expect。