关于拆分Cucumber Step Definitions类的技术咨询
完全没问题,把你的步骤定义拆分到多个职责单一的类里,是Cucumber鼓励的最佳实践之一,能让代码结构更清晰、更易维护。下面逐个解答你的疑问:
是否可行?
绝对可行。Cucumber会自动扫描classpath中所有带有@Before/@After/@Given/@When/@Then等Cucumber注解的类,不管这些注解分散在多少个类中,只要它们处于Cucumber的扫描范围内(比如同一包下),就会被识别并关联到对应的Gherkin步骤。是否需要修改运行器类?
一般不需要。如果你的运行器类(比如带有@RunWith(Cucumber.class)或@CucumberOptions的类)没有特殊限制扫描范围,默认会扫描运行器所在包及其子包下的所有类。拆分后的类和原类在同一包下,自然会被自动扫描到。只有一种特殊情况需要修改:如果之前你在@CucumberOptions的glue属性里指定了具体的类名(而非包路径),那需要把新拆分的类也添加到glue列表中,但这种配置方式非常少见,大多数情况都是指定包路径,所以不用改动。是否需要对这些拆分后的类进行其他引用?
不需要额外手动引用。Cucumber的依赖注入机制(默认用PicoContainer,也可以集成Spring等)会自动管理这些步骤类的实例。如果原来的步骤类中有共享的测试状态(比如用户信息、页面对象实例),拆分后建议把这些共享状态抽成一个单独的上下文类(比如TestContext),然后在每个步骤类中注入这个上下文类,这样不同类的步骤方法就能共享数据了——这也是推荐的做法,避免步骤类之间直接耦合。调用feature文件中的Gherkin时是否直接生效?
是的,直接生效。只要拆分后的步骤方法上的注解文本(比如@Given("我输入了用户名{string}"))和feature文件里的Gherkin语句完全匹配,Cucumber就会自动找到对应的方法执行,完全不用关心这个方法在哪个类里。
小建议
拆分的时候尽量保持每个类的职责单一:比如专门用一个类存放@Before和@After(负责测试环境的初始化、清理),Given类存放所有前置条件步骤,When类存放操作行为步骤,Then类存放断言验证步骤——这样后续维护、查找步骤会非常方便。
内容的提问来源于stack exchange,提问作者snikt

