Cucumber框架使用Unit runner时@AfterAll钩子不执行如何解决
问题原因
你导入的org.junit.jupiter.api.AfterAll是JUnit Jupiter框架的生命周期注解,仅作用于JUnit直接管理的测试类生命周期。Cucumber的Glue类(存放钩子、步骤定义的类)的生命周期独立于JUnit的测试类生命周期,因此Cucumber不会识别和触发JUnit的@AfterAll注解。而io.cucumber.java.After是Cucumber原生的场景后钩子,属于Cucumber自身的生命周期管理范畴,所以可以正常执行。
解决方案
根据你使用的Cucumber版本选择对应方案即可:
方案1:Cucumber 7及以上版本(推荐)
Cucumber 7开始原生提供全局前后钩子注解,直接替换导包、将方法声明为静态即可:
import io.cucumber.java.After; // 替换为Cucumber自带的AfterAll注解 import io.cucumber.java.AfterAll; // 注意必须声明为static方法 @AfterAll public static void foo(){ // 所有测试运行结束后执行的逻辑 } @After public void bar(){ // 每个场景运行结束后执行的逻辑 }
方案2:Cucumber 6及以下版本
旧版本Cucumber没有提供全局后钩子,你可以将@AfterAll注解加在Cucumber的JUnit启动类上,利用JUnit的Suite生命周期实现全局执行:
import org.junit.platform.suite.api.ConfigurationParameter; import org.junit.platform.suite.api.IncludeEngines; import org.junit.platform.suite.api.SelectPackages; import org.junit.platform.suite.api.Suite; import org.junit.jupiter.api.AfterAll; import static io.cucumber.junit.platform.engine.Constants.PLUGIN_PROPERTY_NAME; import static io.cucumber.junit.platform.engine.Constants.GLUE_PROPERTY_NAME; @Suite @IncludeEngines("cucumber") @SelectPackages("你的feature文件所在包路径") @ConfigurationParameter(key = PLUGIN_PROPERTY_NAME, value = "pretty") @ConfigurationParameter(key = GLUE_PROPERTY_NAME, value = "你的glue代码所在包路径") public class RunCucumberTest { // 同样需要声明为static方法 @AfterAll public static void foo(){ // 所有测试运行结束后执行的逻辑 } }
注意事项
- Cucumber原生的
@AfterAll/@BeforeAll注解修饰的方法必须为静态方法,否则会触发启动报错 - 不要混淆JUnit和Cucumber的同命名注解,导包时确认注解的包路径是
io.cucumber.java下的才属于Cucumber生命周期管理范畴
内容的提问来源于stack exchange,提问作者user1167642
相关产品推荐
相关产品推荐

