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

