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

如何在特定条件下终止代码执行且不导致测试失败

如何在满足特定条件时终止代码执行,但不会导致测试失败?

场景与代码说明

测试用例会调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 06:39:14