You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否将Soft Assert对象作为方法参数?测试框架软断言改造咨询

解决方案

完全可以在测试方法中创建Soft Assert对象并逐层传入,实现所有断言复用同一个实例,不会因单个断言失败终止测试。下面是具体改造步骤:

核心思路

  1. 在顶层测试方法中创建SoftAssert实例,逐层传递到InterfaceToVerifyAttributes和VerifyAttributes类中
  2. 将VerifyAttributes中所有Assert静态方法替换为SoftAssert的实例方法
  3. 所有断言执行完成后,调用SoftAssert的assertAll()方法统一校验所有断言结果

改造后的代码示例

1. 测试类(TestClass)

在测试方法中创建SoftAssert,传入后续调用的方法:

import org.testng.asserts.SoftAssert;

public class TestClass extends BaseTest {

    @Test(description="test to verify if the keyboard and mouse attributes are generated")
    public void testKeyboardMouseAttributes(String os, String browser, String device){
        // User performs some keyboard and mouse actions
        SoftAssert softAssert = new SoftAssert();
        InterfaceToVerifyAttributes verifyAttr = new InterfaceToVerifyAttributes("testKeyboardMouseAttributes",os,browser,device);
        verifyAttr.keyboardAttributes(softAssert);
        
        // 最后统一校验所有断言
        softAssert.assertAll();
    }
}

2. 中间层类(InterfaceToVerifyAttributes)

修改方法接收SoftAssert参数,传递给VerifyAttributes:

public class InterfaceToVerifyAttributes {
    private String os, browser, device, testcase;

    public InterfaceToVerifyAttributes(String tc, String os, String browser, String device) {
        this.os = os;
        this.browser = browser;
        this.device = device;
        this.testcase=tc;
    }

    // 修改方法,接收SoftAssert参数
    public void keyboardAttributes(SoftAssert softAssert){
        VerifyAttributes verifyAttr = new VerifyAttributes(testcase, os, browser, device);
        verifyAttr.verifyUnknownSession(false, softAssert);
        verifyAttr.verifyKeyboardPageElements(softAssert);
    }
}

3. 断言执行类(VerifyAttributes)

所有断言方法接收SoftAssert实例,替换原静态Assert为实例方法:

import org.testng.asserts.SoftAssert;

public class VerifyAttributes{
    private String os, browser, device, testcase, orgId;
    // getters and setters

    // 接收SoftAssert参数,替换原Assert方法
    public void verifyUnknownSession(boolean expected, SoftAssert softAssert) {
        softAssert.assertNotNull(api.getSpecifiedParameter("unknown_session"),
                " ** should be unknown session ** " + testcase + " " + os + " " + browser + " org_id " + orgId);
    }

    public void verifyKeyboardPageElements(SoftAssert softAssert) {
        softAssert.assertNotNull(/* attribute is present */);
        softAssert.assertTrue(/* attribute value is equal to something */);
        // 其他断言都用softAssert实例方法
    }

    public void verifyMouseElements(SoftAssert softAssert) {
        softAssert.assertNotNull(/* attribute is present */);
        softAssert.assertTrue(/* attribute value is equal to something */);
        // 其他断言都用softAssert实例方法
    }

    public void verifyPasswordType(SoftAssert softAssert) {
        softAssert.assertNotNull(/* attribute is present */);
        softAssert.assertTrue(/* attribute value is equal to something */);
        // 其他断言都用softAssert实例方法
    }
}

关键说明

  • 所有断言都通过同一个SoftAssert实例执行,即使前面的断言失败,后续断言仍会继续运行
  • 必须在测试方法最后调用assertAll(),否则所有失败的断言不会被抛出
  • 如果使用JUnit的SoftAssertions,思路完全一致,只是类名和方法调用略有不同

内容的提问来源于stack exchange,提问作者Divya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 11:43:18