【问题标题】:How to organize step definitions when using cucumber-java?使用 cucumber-java 时如何组织步骤定义?
【发布时间】:2014-04-05 09:58:08
【问题描述】:

我是 Cucumber 的新手,我正在使用 cucumber-java。黄瓜功能文件看起来很棒。但是,步骤定义的重用确实妨碍了组织步骤定义代码。对我来说,组织步骤定义最直观的方式就是按照功能文件的组织方式,即一个类对应一个功能。但是,如果两个特征文件中有两个相同的步骤,这种方式就搞砸了,因为你会错过其中一个类中的一个步骤,这会破坏整个结构的连贯性。但是,我现在无法说服自己使用其他方式。那么,在使用 cucumber-java 时,组织步骤定义的明智方法是什么?

非常感谢。

【问题讨论】:

    标签: java cucumber cucumber-jvm


    【解决方案1】:

    从您已经在做的方式开始,一旦您发现某个步骤被重用,请将其移至类ReUsableSteps 或其他东西。这样,如果一个步骤在其类中不存在,那么它应该在ReUsableSteps 中。只是一个想法。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        使用cucumber最好的方法是尽量减少步骤定义的重复。在编写步骤定义时,我们应该关注的是避免在 StepDefinition 类的步骤方法中使用任何特定于类或功能的代码,因为那样它不能被概括,它应该具有可用于不同步骤和代码的通用代码传播到单独的类,每个步骤的特定逻辑应该驻留在单独的类中。这样我们可以避免重复。

        示例:- 假设我们有一个包含步骤“组件A必须接收响应”的组件特征文件,它的实现类是ComponentStepDefinition类,当我们在步骤定义中实现它时,我们不应该使用任何迭代或计算响应的逻辑对于那里的组件A,而是将值传递给执行A相关任务的类,这样你必须实现“组件B必须接收响应”然后可以使用相同的步骤定义和B的逻辑将在另一个类中。

        【讨论】:

          【解决方案4】:

          按照与您的域相关的常见功能对您的步骤定义进行排序。它们不必链接到特定的功能文件。

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

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

          另外请注意,您的 IDE 会知道一个步骤是否已经定义(至少在 IntelliJ 中未定义的步骤标记为黄色)。

          【讨论】:

            【解决方案5】:

            出于维护原因,重用步骤至关重要。这并不意味着要在这里和那里硬塞步骤,而是要在可重用性和理解之间找到平衡。如上所述,将它们安排到 Common 或 Reusable 包中是一个不错的主意。这是你需要做的事情,因为你并不总是知道一个步骤是否会被重用。从这个意义上说,频繁地重构步骤定义是很正常的。实际上它是代码活跃度的一个指标,所以不要犹豫,做出任何改变以使测试场景足够清晰,测试代码尽可能干净。这与应用于测试的众所周知的编码原则相同。

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

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

            只有几个测试场景时,您可能不需要这些东西。但随着这个数字越来越大,你会发现这样的机制真的很有价值。

            【讨论】:

              【解决方案6】:

              这可以通过对多个特性文件使用多个测试运行器类来轻松完成。

              只要您在测试运行程序中指定胶水代码,您就可以为不同的功能创建相同的步骤。 Glue 将确保 cucumber 在执行期间仅检查为步骤指定的路径。

              然后你可以维护一个像 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 类。

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2022-08-19
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-07-23
                • 2017-01-05
                • 1970-01-01
                相关资源
                最近更新 更多