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

Java Junit与Cucumber统计测试通过/失败数量结果恒为0如何解决

问题原因
  • 核心是Cucumber和JUnit的生命周期注解混用,导致统计逻辑从未触发:
    • 你用来统计场景结果的@AfterEach是JUnit原生注解,Cucumber的测试生命周期无法识别该注解,afterScenario方法从未执行,两个计数器的值始终为初始的0
    • 你用来输出结果的@After是JUnit的单测试方法后置注解,且你给方法加了static修饰,JUnit的@After不支持静态方法,该方法也没有按照你的预期在所有测试结束后执行
  • 额外的注解使用错误:类中@Before如果是要在每个Cucumber场景前执行,也需要用Cucumber提供的对应注解,否则同样不会生效
修复方案
  1. 调整注解使用:
    • 每个场景执行后的统计逻辑改用Cucumber提供的io.cucumber.java.After注解
    • 所有测试结束后的结果输出逻辑改用JUnit的@AfterAll注解,该注解支持静态方法,会在全部测试跑完后触发
  2. 可选优化:如果开启了测试并行执行,需要把静态计数器改为线程安全的AtomicInteger避免计数错误

修复后代码示例:

import io.cucumber.java.Scenario;
import io.cucumber.java.Before;
import io.cucumber.java.After;
import org.junit.jupiter.api.AfterAll;

public class CucumberE2ETest {

    static int passedTest = 0;
    static int failedTests = 0;
    // 并行测试时替换为下面的线程安全实现
    // static AtomicInteger passedTest = new AtomicInteger(0);
    // static AtomicInteger failedTests = new AtomicInteger(0);

    @Before
    public void beforeScenario() {
        System.out.println("Before scenario start");
    }

    @After
    public void afterScenario(Scenario scenario) {
        if (scenario.isFailed()) {
            failedTests++;
            // 并行场景写法:failedTests.incrementAndGet();
        } else {
            passedTest++;
            // 并行场景写法:passedTest.incrementAndGet();
        }
    }

    @AfterAll
    public static void teardown() {
        System.out.println("Passed: " + passedTest + " Failed: " + failedTests);
        // 并行场景写法:System.out.println("Passed: " + passedTest.get() + " Failed: " + failedTests.get());
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 12:54:03