Assert.assertEquals 失敗即拋出 AssertionError,測試立即終止package com.baidu.www;
import org.testng.Assert;
public class AssertionUtil {
private static boolean flag = true; // 全局標誌位
/** 驗證兩值相等,可選錯誤信息 */
public static void verifyEquals(Object actual, Object expected) {
try {
Assert.assertEquals(actual, expected);
} catch (Error e) {
flag = false;
System.err.println("[Soft Assert Fail] " + e.getMessage());
}
}
public static void verifyEquals(Object actual, Object expected, String message) {
try {
Assert.assertEquals(actual, expected, message);
} catch (Error e) {
flag = false;
System.err.println("[Soft Assert Fail] " + message + " | " + e.getMessage());
}
}
/** 重置標誌位,每個 @Test 開始前調用 */
public static void reset() {
flag = true;
}
/** 斷言最終結果,失敗則標記測試失敗 */
public static void assertAll() {
Assert.assertTrue(flag, "存在軟斷言失敗,請查看上方日誌");
}
}
import org.testng.Assert;
import org.testng.annotations.Test;
public class SoftAssertDemoTest {
@Test
public void testMultipleChecks() {
AssertionUtil.reset(); // 1. 重置
int expected = 2;
for (int i = 0; i < 3; i++) {
System.out.println("斷言開始: i=" + i);
AssertionUtil.verifyEquals(i, expected, "驗證 i 與 expected 相等");
System.out.println("斷言結束: i=" + i);
}
AssertionUtil.assertAll(); // 2. 統一判定
}
}
i=0,1 失敗,i=2 通過Error,設置 flag=false,打印錯誤但不拋出assertAll(),檢測到 flag=false,拋出 AssertionError 標記測試失敗SoftAssert:SoftAssert sa = new SoftAssert(); sa.assertEquals(...); sa.assertAll();verifyTrue、verifyNull、verifyMatches 等常用斷言ThreadLocal<Boolean> 隔離標誌位軟斷言模式讓測試更具診斷價值,配合成熟框架工具,能顯著提升自動化測試的反饋效率。