SerenityBDD+Java环境下如何实现检查点失败时标记步骤失败但程序继续运行
SerenityBDD+Java 软断言不中断执行实现方案
方案1:使用Serenity原生软断言(适配性最优)
Serenity框架本身内置了和步骤生命周期绑定的软断言能力,适配性优于第三方软断言库,不用额外引入依赖:
- 直接实例化
SerenitySoftAssertions对象用于所有检查点断言,示例代码如下:
import net.serenitybdd.assertions.SerenitySoftAssertions; import net.thucydides.core.annotations.Step; public class UserTestSteps { private final SerenitySoftAssertions softly = new SerenitySoftAssertions(); @Step("校验用户名") public void checkUsername(String actual, String expected) { softly.assertThat(actual).as("用户名校验").isEqualTo(expected); } @Step("校验用户年龄") public void checkUserAge(Integer actual, Integer expected) { softly.assertThat(actual).as("年龄校验").isEqualTo(expected); } // 统一在测试用例执行完成后调用一次assertAll public void assertAllChecks() { softly.assertAll(); } }
- 断言失败时不会抛出中断异常,Serenity会自动标记对应
@Step注解标注的步骤为失败状态,所有步骤执行完成后统一汇总所有失败信息输出到报告。
方案2:兼容已引入的第三方软断言库
如果已经使用了AssertJ SoftAssertions、TestNG SoftAssert等第三方软断言库,可以通过适配Serenity步骤状态管理实现需求:
- 核心逻辑:捕获软断言抛出的错误信息,主动上报给Serenity当前步骤,不向上抛出异常中断执行,示例代码如下:
import net.serenitybdd.core.Serenity; import org.testng.asserts.SoftAssert; @Step("校验用户手机号") public void checkPhone(String actual, String expected) { // 以TestNG SoftAssert为例 SoftAssert softAssert = new SoftAssert(); try { softAssert.assertEquals(actual, expected, "手机号校验失败"); softAssert.assertAll(); } catch (AssertionError e) { // 主动标记当前步骤为失败,保留错误栈信息 Serenity.getCurrentStep().setFailed(e); // 不抛出异常,后续步骤正常执行 } }
- 不要在步骤内部把断言异常往外抛,否则依然会触发Serenity的执行中断逻辑。
方案3:全局配置开启默认软断言
如果需要全量测试用例都走软断言不中断逻辑,可以直接修改全局配置,无需修改业务测试代码:
- 在项目的
serenity.properties配置文件中添加配置项:serenity.assertions.soft=true - 开启后所有Serenity原生断言默认采用软断言模式,所有检查点失败信息会统一收集,到测试用例执行结束后才汇总抛出,每个失败的检查点会自动关联到对应步骤标记为失败状态。
调试优化建议
- 所有断言建议通过
as()方法添加自定义检查点描述,Serenity报告中会精准展示每个失败检查点的描述、实际值和预期值,不用逐行排查代码 - 如果个别步骤需要失败后直接中断执行,手动抛出
AssertionError即可触发硬中断逻辑
内容的提问来源于stack exchange,提问作者LDT
相关产品推荐
相关产品推荐

