如何为Cucumber的.feature文件指定对应StepDefinitions文件
解决Cucumber中@Before钩子跨测试执行的问题
问题原因
Cucumber运行测试时,会自动扫描并执行类路径下所有StepDefinitions类中的@Before钩子方法,不管这些方法所属的StepDefinitions是否和当前运行的feature测试相关。这就是你运行登录测试时,注册模块的@Before也会被触发的原因。
解决方案:用标签(Tags)限定钩子作用范围
这是最直接且推荐的方案,通过给feature/场景打标签,让@Before钩子只对特定标签的测试生效。
步骤1:给目标Feature添加专属标签
修改注册feature文件,在开头添加标签(比如@SignUp):
@SignUp Feature: Sign up As a user I want to create a new account So that I can use the application Background: Given I am on the sign up page Scenario Outline: User can create a new account When I fill name with "<first_name>" And I fill lastname with "<last_name>" And I fill email with "<email>" And I fill password with "<password>" And I fill password confirmation with "<password_confirmation>" When I click on Sign up Then I must be authenticated Examples: | first_name | last_name | email | password | password_confirmation | | Rita | A. Cheatham | RitaACyheatham@armyspy.com | 123456789 | 123456789 |
步骤2:修改@Before钩子,绑定标签
在注册的StepDefinitions类中,给@Before注解加上标签参数,让它只在带有@SignUp标签的测试运行时执行:
public class SignUpStepDefinitions { private SignUp signUp; // 仅对带有@SignUp标签的测试生效 @Before("@SignUp") public void before() { signUp = new SignUp(); signUp.beforeEach(); } // 后续步骤代码... }
对登录测试做同样处理
给登录的feature加上@Login标签,同时将登录StepDefinitions里的@Before修改为@Before("@Login")。这样运行登录测试时,只有登录模块的钩子会执行,注册模块的钩子不会被触发。
额外说明
- 如果有通用前置操作(比如初始化浏览器),可以单独写一个通用StepDefinitions类,里面的
@Before不加标签,让所有测试都执行;特定测试的前置操作则用标签限定。 - 标签支持逻辑运算,比如
@Before("@Login or @SignUp")可让钩子在两种标签的测试下都执行,灵活度很高。
内容的提问来源于stack exchange,提问作者raulpacheco2k
相关产品推荐
相关产品推荐

