在Katalon中使用Extent Reports时,如何在测试失败后继续执行
Katalon中Extent Reports标记失败后测试停止执行的解决办法
在Katalon中使用Extent Reports时,调用test.fail()标记测试失败后,代码中剩余的测试步骤会停止运行,当前每个测试用例包含6个测试步骤。
相关代码
switch (query) { Case 'Y': def ret2 = WebUI.getAttribute(findTestObject('...'), '...') def som = ret2.contains('...') println som if (som == true) { test.pass('...')} else { String base64Code = CustomKeywords.'(...).screenshot.takeScreenshotBase64'() test.fail(MediaEntityBuilder.createScreenCaptureFromBase64String(base64Code).build()) .info('...')} break Case 'N': def ret3 = WebUI.getAttribute(findTestObject('...']), 'class') def som3 = ret3.contains('column-checkbox-disabled') print som3 if (som3 == true) { test.pass('...')} else { String base64Code = CustomKeywords.'(...).screenshot.takeScreenshotBase64'() test.fail(MediaEntityBuilder.createScreenCaptureFromBase64String(base64Code).build()) .info('...')} break }
注:代码整体被try块包裹,外层还有for循环,extent.flush()是代码的最后一行(在两者之外),该逻辑针对每个要测试的权限重复了5次
问题原因
默认情况下test.fail()不会直接终止测试执行,但以下情况会导致后续步骤停止:
- 代码中存在未捕获的异常(比如截图方法抛出异常、语法错误)
- Katalon的测试执行上下文因断言失败被中断
test.fail()后的链式调用(如.info())出现异常未处理
解决办法
1. 修复语法错误
原代码中存在括号不匹配问题:findTestObject('...']应改为findTestObject('...'),这类语法错误会直接抛出异常终止执行。
2. 捕获报告逻辑中的异常
将test.fail()及相关操作放在try-catch块中,避免报告过程中的异常阻断测试流程:
switch (query) { case 'Y': // Groovy中case需小写,大小写敏感 def ret2 = WebUI.getAttribute(findTestObject('...'), '...') def som = ret2.contains('...') println som if (som) { // 简化判断,无需写som == true test.pass('测试通过描述') } else { try { String base64Code = CustomKeywords.'(...).screenshot.takeScreenshotBase64'() // 明确传递失败描述和截图媒体 test.fail('权限验证失败', MediaEntityBuilder.createScreenCaptureFromBase64String(base64Code).build()) test.info('继续执行后续测试步骤') } catch (Exception e) { // 捕获异常并记录,不终止执行 test.warning('生成失败报告时出错: ' + e.getMessage()) } } break case 'N': def ret3 = WebUI.getAttribute(findTestObject('...'), 'class') def som3 = ret3.contains('column-checkbox-disabled') print som3 if (som3) { test.pass('测试通过描述') } else { try { String base64Code = CustomKeywords.'(...).screenshot.takeScreenshotBase64'() test.fail('权限验证失败', MediaEntityBuilder.createScreenCaptureFromBase64String(base64Code).build()) test.info('继续执行后续测试步骤') } catch (Exception e) { test.warning('生成失败报告时出错: ' + e.getMessage()) } } break }
3. 确保外层循环不受单个失败影响
外层的for循环和try块要确保单个权限测试失败后,不会中断整个循环。可以在外层try块中添加catch逻辑,捕获单个迭代的异常,继续执行下一个权限测试:
for (def permission : permissionList) { try { // 你的switch逻辑代码 } catch (Exception e) { test.warning('权限【' + permission + '】测试出现异常: ' + e.getMessage()) // 不抛出异常,继续下一个循环 } } extent.flush()
4. 分离测试执行与报告逻辑
先完成所有测试步骤的断言,收集所有失败信息,最后统一生成报告,避免报告操作影响测试流程:
def failures = [] // 执行所有测试步骤 switch (query) { case 'Y': def ret2 = WebUI.getAttribute(findTestObject('...'), '...') def som = ret2.contains('...') if (!som) { failures.add(['type': 'Y', 'msg': '权限验证失败']) } break case 'N': def ret3 = WebUI.getAttribute(findTestObject('...'), 'class') def som3 = ret3.contains('column-checkbox-disabled') if (!som3) { failures.add(['type': 'N', 'msg': '权限验证失败']) } break } // 统一生成报告 failures.each { fail -> String base64Code = CustomKeywords.'(...).screenshot.takeScreenshotBase64'() test.fail(fail.msg, MediaEntityBuilder.createScreenCaptureFromBase64String(base64Code).build()) test.info('已记录失败,继续执行') }
内容的提问来源于stack exchange,提问作者RhetCon Conjure
相关产品推荐
相关产品推荐

