能否将Soft Assert对象作为方法参数?测试框架软断言改造咨询
解决方案
完全可以在测试方法中创建Soft Assert对象并逐层传入,实现所有断言复用同一个实例,不会因单个断言失败终止测试。下面是具体改造步骤:
核心思路
- 在顶层测试方法中创建
SoftAssert实例,逐层传递到InterfaceToVerifyAttributes和VerifyAttributes类中 - 将
VerifyAttributes中所有Assert静态方法替换为SoftAssert的实例方法 - 所有断言执行完成后,调用
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
相关产品推荐
相关产品推荐

