我是Cucumber的新手,我正在使用cucumber-java。黄瓜功能文件看起来很棒。但是,步骤定义的重用确实会妨碍组织步骤定义代码。对我来说,组织步骤定义最直观的方法就是遵循功能文件的组织,即一个功能的一个类。但是,如果两个特征文件中有两个相同的步骤,则这种方式会被搞砸,因为您将错过其中一个类中的一个步骤,这会破坏整个结构的一致性。但是,我无法说服自己现在就采用其他方式。那么,在使用cucumber-java时组织步骤定义的合理方法是什么?
非常感谢。
答案 0 :(得分:3)
从您已经开始的方式开始,一旦您认识到某个步骤被重复使用,请将其移至类ReUsableSteps
或其他内容。这样,如果某个步骤在其类中不存在,那么它应该在ReUsableSteps
中。只是一个想法。
答案 1 :(得分:1)
您可以将单独的包作为占位符,用于定义常用步骤的类。将该包添加为DB::setFetchMode(PDO::FETCH_CLASS);
。
答案 2 :(得分:0)
使用黄瓜的最佳方法是尽量减少步骤定义的重复。在编写步骤定义时我们应该关注的是避免在StepDefinition类的步骤方法中特定于类或功能的任何代码,因为这种方式不能一概而论,它应该具有可用于不同步骤和代码的公共代码传播到单独的类,其中每个步骤的具体逻辑应该位于单独的类中。这样我们就可以避免重复。
实施例: - 假设我们有组件特征文件,其中包含步骤“组件A必须接收响应”,其实现类是ComponentStepDefinition类,当我们在步骤定义中实现它时,我们不应该使用任何逻辑来迭代或计算响应对于组件A,而不是将值传递给执行A相关任务的类,这样就必须实现“组件B必须接收响应”然后可以使用相同的步骤定义和B的逻辑将在另一个类中。
答案 3 :(得分:0)
按照与您的域相关的常用功能对步骤定义进行排序。它们不必链接到特定的功能文件。
例如,我们的一项功能是为我们的合作伙伴提供分数(他们在我们的平台上的表现如何)。我们在ScoreSteps文件中有与这些分数相关的几个步骤定义。我们可能有其他与合作伙伴相关的步骤,这些步骤将在PartnerSteps文件中。这也使得更容易使用与某个域对象相关的辅助方法。
根据您的域名,这些文件会完全不同。
另请注意,IDE将知道是否已定义步骤(至少在未定义的IntelliJ步骤中标记为黄色)。
答案 4 :(得分:0)
重复使用步骤对于维护原因至关重要。这并不意味着尝试在这里和那里采取措施,而是在可重用性和理解之间找到平衡点。如上所述,将它们安排到Common或Reusable包中是个不错的主意。这是你要去做的事情,因为你并不总是知道一个步骤是否会被重用。从这个意义上说,频繁重构步骤定义将是很正常的。实际上它是代码活力的指标,因此请不要犹豫,进行任何更改,以使测试方案足够清晰,测试代码尽可能干净。它就是同样众所周知的编码原理,适用于测试。
帮助我完成这项任务的一件事是实用类(实际上它是一组类),它让我知道存在哪些步骤和步骤定义,定义步骤定义的类,特征文件和使用它们的测试场景等。您甚至可以实现高级选项,例如搜索包含此类和此类关键字的步骤或步骤定义,或者了解不再使用的步骤定义,等等。字典。
可以通过处理属于'glue'文件夹的java类并收集与小黄瓜注释相关联的所有正则表达式,或者通过在Gherkin解析器的帮助下解析特征文件来实现。虽然您可能希望实施这两种方法,因为它们不是互斥的;相反,它们相互补充。
这只是一些测试场景时您可能不需要的东西。但随着这个数字变得越来越大,你会发现这种机制非常有价值。
答案 5 :(得分:0)
通过为多个要素文件使用多个测试运行器类,可以轻松完成此操作。
只要在测试运行器中指定胶水代码,就可以为不同的功能创建相同的步骤。 Glue将确保黄瓜仅在执行期间为步骤指定的路径中进行检查。
然后,您可以维护一个类似于TestNG.xml的套件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)
我组织我的黄瓜测试的方式就像我有一个黄瓜功能的java包,我将有步骤定义类,功能文件,测试数据文件和Hooks类。
优点是,当我尝试在步骤类中查找步骤定义时,我知道确切地查看的位置,并且获得步骤定义冲突的可能性为零,除非您在该包中添加了相同的定义两次