我已经设置了一些UIAutomation脚本,这些脚本最终将成为詹金斯测试。 UIAutomation脚本不会以jenkins友好的格式输出,因此我正在使用tuneup_js,特别是此failure exception。
如果测试失败,我可以抛出一个自定义的FailureException
。可以正常捕获异常,并正确记录故障输出。输出为Error: FailureException: "hello world"
。
当我尝试将相同的FailureException
放在onAlert
处理程序UIATarget.onAlert = function onAlert(alert) {...}
中时,会发生我的问题。在我的onAlert
函数中,如果标题与某个正则表达式匹配,则抛出FailureException
,但是FailureException
从未被捕获,并且测试崩溃,并显示以下输出:
Script threw an uncaught JavaScript error: hello world on line 18 of assertions.js
有什么想法可以将
FailureException
扔到onAlert
处理程序中并正确处理吗?好像onAlert
在不同于其余测试的范围内处理,但是我不确定如何纠正它。 最佳答案
此处的核心问题是js异常实际上无法与事件循环之类的异步代码一起使用(这就是为什么您很少在“现代javascript”代码中看到抛出的异常,而人们使用错误回调的原因)。
如果您查看tuneup_js中的test
函数,它将捕获fail
引发的异常,然后调用UIALogger.logFail
。 UIATarget.onAlert
将响应一些顶级警报事件,并在测试功能之外的上下文中运行,因此在那里触发异常意味着test
中的try / catch块不会捕获该异常。
起作用的一件事是使用闭包将数据返回给调用方,例如:
test("My UI Test", function(app, target) {
var failureName = null;
setupOnAlert(function(name) {
failureName = name;
});
// do something that might trigger a UIAlert
if (failureName) {
fail(failureName);
}
});
function setupOnAlert(fail_callback) {
UITarget.onAlert = function(alert) {
// do something that may fail, if it fails:
fail_callback("Some kind of error");
}
}
希望有帮助!