Cucumber测试项目中@Before与@After钩子不执行如何解决?
解决Cucumber Hooks不执行的问题
以下是几个针对性的排查和解决方向:
检查注解包是否正确
必须确保@Before和@After注解来自io.cucumber.java包,而非JUnit的org.junit包。Cucumber仅识别自身包下的钩子注解,用错包会导致钩子完全不触发。移除方法的static修饰符
Cucumber会通过实例化Hooks类来调用钩子方法,static方法不属于实例方法,几乎不会被执行。修改后的代码示例:@Before("@Tag") public void before() { System.out.println("Hooks inicando o driver"); driver = DriverTypeFactory.getDriver(DriverTypeFactory.GECKO_DRIVER); } public WebDriver getDriver(){ return driver; } @After public void after() { System.out.println("Hooks encerrando o driver"); driver.close(); }如果需要在其他类中获取driver,可以考虑用ThreadLocal存储driver,保证多线程测试的安全性。
确认测试场景带有对应标签
你的@Before("@Tag")仅对带有@Tag标签的场景生效,如果feature文件中的场景未添加@Tag,这个Before钩子不会运行。示例feature代码:@Tag Cenário: 测试场景示例 Dado 我打开页面 Quando 我执行操作 Então 验证结果若要让Before对所有场景生效,直接写
@Before()不带标签即可。确保Hooks类被Cucumber扫描到
检查测试运行器的@CucumberOptions中glue参数是否包含Hooks类所在的包。示例配置:@RunWith(Cucumber.class) @CucumberOptions( features = "src/test/resources/features", glue = {"com.yourpackage.steps", "com.yourpackage.hooks"} ) public class TestRunner {}若
glue未包含Hooks所在包,Cucumber无法找到该类,钩子自然不会执行。排查是否有其他初始化逻辑干扰
如果@Given步骤中已经初始化了WebDriver,或者存在优先级更高的钩子(如@BeforeAll),可能会覆盖当前钩子的执行。可以暂时注释掉Given中的driver初始化代码,测试钩子是否正常触发。
内容的提问来源于stack exchange,提问作者GabrielAraujo
相关产品推荐
相关产品推荐

