如何在特定条件下终止代码执行且不导致测试失败
如何在满足特定条件时终止代码执行,但不会导致测试失败?
场景与代码说明
测试用例会调用clickEditCappingButton方法,该方法内部依赖checkIfReportingFromAvailable。当checkIfReportingFromAvailable遍历完所有记录且未找到指定空字段时,需要终止后续代码执行,同时保证测试用例判定为通过。
现有相关代码:
public String checkIfReportingFromAvailable(){ String locatorBuilder = ""; List<WebElement> listOfRecords = driver.findElements(reportingFromField); List<WebElement> listOfPages = driver.findElements(recordPages); if (listOfRecords.size() <= 5 && listOfRecords.size() > 0 && listOfPages.size() == 0) { for (int i = 0; i < listOfRecords.size(); i++) { String counter = Integer.toString(i + 1); if (driver.findElement(By.xpath("//tbody/tr[" + counter + "][@class='ng-scope']//td[7]//span")).getText().equalsIgnoreCase("")) { locatorBuilder = Integer.toString(i + 1); break; } else if (i == listOfRecords.size() - 1) { //System.exit(); // 希望满足条件时终止执行 } } } return locatorBuilder; // 补充原代码缺失的返回语句 } public EditCappingWindow clickEditCappingButton(){ driver.findElement(By.xpath("//tbody/tr[" + checkIfReportingFromAvailable() + "][@class='ng-scope']//button[@tooltip='Edit Capping']")).click(); for (String winHandle : driver.getWindowHandles()) { driver.switchTo().window(winHandle); } return new EditCappingWindow(driver); }
可行解决方案
1. 返回特殊标记,在调用方终止执行
修改checkIfReportingFromAvailable,触发终止条件时返回特殊值,在调用方法中判断并跳过后续逻辑,测试用例无需额外断言即可通过。
修改后的checkIfReportingFromAvailable:
public String checkIfReportingFromAvailable(){ String locatorBuilder = ""; List<WebElement> listOfRecords = driver.findElements(reportingFromField); List<WebElement> listOfPages = driver.findElements(recordPages); if (listOfRecords.size() <= 5 && listOfRecords.size() > 0 && listOfPages.size() == 0) { for (int i = 0; i < listOfRecords.size(); i++) { String counter = Integer.toString(i + 1); if (driver.findElement(By.xpath("//tbody/tr[" + counter + "][@class='ng-scope']//td[7]//span")).getText().equalsIgnoreCase("")) { locatorBuilder = Integer.toString(i + 1); break; } else if (i == listOfRecords.size() - 1) { // 返回特殊标记表示需终止执行 return "TERMINATE"; } } } return locatorBuilder; }
修改clickEditCappingButton:
public EditCappingWindow clickEditCappingButton(){ String locator = checkIfReportingFromAvailable(); if ("TERMINATE".equals(locator)) { // 终止后续操作,返回null或空对象(根据测试需求调整) return null; } driver.findElement(By.xpath("//tbody/tr[" + locator + "][@class='ng-scope']//button[@tooltip='Edit Capping']")).click(); for (String winHandle : driver.getWindowHandles()) { driver.switchTo().window(winHandle); } return new EditCappingWindow(driver); }
测试用例中调用方法后,若返回null则直接结束测试,无需执行后续断言即可判定为通过。
2. 使用测试框架的跳过机制(推荐)
如果使用JUnit/TestNG等测试框架,可触发框架的跳过逻辑,让测试直接标记为"跳过"而非失败,这是最符合测试规范的做法。
以JUnit 5为例,修改checkIfReportingFromAvailable:
import org.junit.jupiter.api.Assumptions; public String checkIfReportingFromAvailable(){ String locatorBuilder = ""; List<WebElement> listOfRecords = driver.findElements(reportingFromField); List<WebElement> listOfPages = driver.findElements(recordPages); if (listOfRecords.size() <= 5 && listOfRecords.size() > 0 && listOfPages.size() == 0) { for (int i = 0; i < listOfRecords.size(); i++) { String counter = Integer.toString(i + 1); if (driver.findElement(By.xpath("//tbody/tr[" + counter + "][@class='ng-scope']//td[7]//span")).getText().equalsIgnoreCase("")) { locatorBuilder = Integer.toString(i + 1); break; } else if (i == listOfRecords.size() - 1) { // 触发测试跳过,自动终止当前测试且不判定失败 Assumptions.assumeFalse(true, "无符合条件的记录,跳过后续操作"); } } } return locatorBuilder; }
3. 抛出自定义受控异常,在测试用例中捕获
定义自定义异常,触发条件时抛出,测试用例捕获该异常后不做失败断言即可。
自定义异常:
public class TerminateExecutionException extends RuntimeException { public TerminateExecutionException(String message) { super(message); } }
修改checkIfReportingFromAvailable:
public String checkIfReportingFromAvailable(){ String locatorBuilder = ""; List<WebElement> listOfRecords = driver.findElements(reportingFromField); List<WebElement> listOfPages = driver.findElements(recordPages); if (listOfRecords.size() <= 5 && listOfRecords.size() > 0 && listOfPages.size() == 0) { for (int i = 0; i < listOfRecords.size(); i++) { String counter = Integer.toString(i + 1); if (driver.findElement(By.xpath("//tbody/tr[" + counter + "][@class='ng-scope']//td[7]//span")).getText().equalsIgnoreCase("")) { locatorBuilder = Integer.toString(i + 1); break; } else if (i == listOfRecords.size() - 1) { throw new TerminateExecutionException("无符合条件的记录,终止执行"); } } } return locatorBuilder; }
测试用例中捕获异常:
@Test public void testEditCapping() { try { yourPageObject.clickEditCappingButton(); // 后续测试代码 } catch (TerminateExecutionException e) { // 捕获异常后不执行失败断言,测试直接通过 System.out.println(e.getMessage()); } }
注意事项
- 禁止使用
System.exit(),它会直接终止JVM进程,导致整个测试套件停止,完全不符合需求。 - 优先选择测试框架的跳过机制,能清晰标记测试状态,贴合测试流程规范。
- 若使用特殊标记方案,需确保所有调用方都正确处理该标记,避免后续代码出现空指针或其他异常。
内容的提问来源于stack exchange,提问作者Sourabh wadhwa
相关产品推荐
相关产品推荐

