我已经设置了一些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.logFailUIATarget.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");
}
}

希望有帮助!

10-07 21:05