使用java时如何组织步骤定义?

使用java时如何组织步骤定义?,java,cucumber,cucumber-jvm,Java,Cucumber,Cucumber Jvm,我对Cucumber是新手,我正在使用Cucumber java。cucumber功能文件看起来很棒。然而,步骤定义的重用实际上阻碍了组织步骤定义代码。对我来说,组织步骤定义最直观的方法就是按照要素文件的组织方式,即一个要素对应一个类。但是,如果两个要素文件中有两个相同的步骤,则这种方法是错误的,因为您将错过其中一个类中的一个步骤,从而破坏整个结构的一致性。然而,我现在无法说服自己使用其他方法。那么,在使用java时,组织步骤定义的合理方法是什么 非常感谢。从您已经做过的事情开始,一旦您意识到某

我对Cucumber是新手,我正在使用Cucumber java。cucumber功能文件看起来很棒。然而,步骤定义的重用实际上阻碍了组织步骤定义代码。对我来说,组织步骤定义最直观的方法就是按照要素文件的组织方式,即一个要素对应一个类。但是,如果两个要素文件中有两个相同的步骤,则这种方法是错误的,因为您将错过其中一个类中的一个步骤,从而破坏整个结构的一致性。然而,我现在无法说服自己使用其他方法。那么,在使用java时,组织步骤定义的合理方法是什么


非常感谢。

从您已经做过的事情开始,一旦您意识到某个步骤被重用,请将其移动到类
可重用步骤
或其他地方。这样,如果一个步骤在它的类中不存在,那么它应该在可重用的步骤中。只是一个想法。

您可以使用一个单独的包作为定义公共步骤的类的占位符。将该包添加为
glue

使用cucumber的最佳方法是最小化步骤定义的重复。在编写步骤定义时,我们应该关注的是避免在StepDefinition类的steps方法中出现任何特定于类或功能的代码,因为这样它就不能被泛化,它应该具有可用于不同步骤的通用代码,以及用于传播到单独类的代码,每个步骤的特定逻辑应该位于单独的类中。这样我们可以避免重复

例如:-
假设我们有一个组件特征文件,其中包含步骤“组件A必须接收响应”,它的实现类是ComponentStepDefinition类,当我们在步骤定义中实现它时,我们不应该使用任何逻辑来迭代或计算组件A的响应,而是将值传递给执行相关任务的类,通过这种方式,您必须实现“组件B必须接收响应”,然后可以使用相同的步骤定义,并且B的逻辑将在另一个类中。

根据与域相关的通用功能对步骤定义进行排序。它们不必链接到特定的要素文件

例如,我们的功能之一是向合作伙伴提供分数(他们在我们的平台上表现如何)。我们在ScoreSteps文件中有几个与这些分数相关的步骤定义。我们可能有其他与合作伙伴相关的步骤,这些步骤将在PartnerSteps文件中。这也使得使用与特定域对象相关的帮助器方法变得更容易

这些文件对您来说完全不同,这取决于您的域


还请注意,IDE将知道步骤是否已定义(至少在IntelliJ中,未定义的步骤标记为黄色)。

重用步骤对于维护非常重要。这并不意味着尝试在这里和那里束缚步骤,而是在可重用性和理解性之间找到平衡。如上所述,将它们安排到一个通用或可重用的包中是一个非常好的主意。这是一件在执行过程中必须完成的事情,因为您并不总是知道某个步骤是否将被重用。从这个意义上讲,频繁重构步骤定义是很正常的。实际上,它是代码有效性的一个指标,所以不要犹豫,要做出任何更改,以使测试场景足够清晰,测试代码尽可能干净。这与应用于测试的众所周知的编码原理是一样的

帮助我完成此任务的一件事是一个实用程序类(实际上是一组类),它允许我知道存在哪些步骤和步骤定义,定义步骤定义的类,使用它们的功能文件和测试场景,您甚至可以实现高级选项,例如搜索包含此类关键字的步骤或步骤定义,或者了解不再使用的步骤定义,等等。类似于字典

它可以通过处理属于“glue”文件夹的java类并收集与小黄瓜注释相关联的所有正则表达式,或者在小黄瓜解析器的帮助下解析特征文件来实现。尽管您可能希望实现这两种方法,因为它们不是相互排斥的;相反,它们是相辅相成的


当只有几个测试场景时,这可能是您不需要的。但随着这个数字越来越大,您会发现这样一种机制非常有价值。

这可以通过为多个功能文件使用多个测试运行器类轻松实现

只要在测试运行程序中指定粘合代码,就可以为不同的功能创建相同的步骤Glue将确保CUMBURE只在执行过程中检查步骤指定的路径。

然后,您可以维护一个套件xml配置,如TestNG.xml,以运行我想要的所有功能

@RunWith(Cucumber.class)
@CucumberOptions(monochrome = true, features = "src/test/java/com/abc/batch/xyz/payout/bbq/monthly",
    plugin = { "pretty", "html:target/cucumber-html-reports" }, strict = true, glue = {"com.abc.batch.xyz.payout.bbq.monthly" })
@Rollback(false)
我组织cucumber测试的方式就像我有一个用于cucumber特性的java包,其中我将有这些测试的步骤定义类、特性文件、测试数据文件和钩子类

优点是,当我尝试在step类中查找步骤定义时,我知道要查看的确切位置,并且获得步骤定义冲突的机会为零,除非您在该包中添加了两次相同的定义