如何组织黄瓜中的规格定义?

我们正在考虑在我们的项目中使用Cucumber进行验收测试。

当我们在黄瓜中写一个时,我们写一个列表,和语句。scenariofeatureGivenWhenThen

当我们使用 cucumber-jvm 项目时,和 语句与 (JUnit) 类中的 Java 方法相关。GivenWhenThen

我想知道项目结构中与/ /相关的代码的最佳组织是什么。我主要关心的是维护一个大项目中的黄瓜测试,其中场景的数量非常重要,特别是关于在要素之间共享的项目。GivenWhenThen

我可以看到至少2种主要方法:

  1. 每个功能都与其自己的 JUnit 类相关。因此,如果我有一个黄瓜文件,我会找到具有足够和注释方法的相关JUnit类。foo/bar/baz.featurefoo.bar.Baz@Given@When@Then

  2. 将 和 方法分离到“主题”类和包中。例如,如果在我的黄瓜场景中我有一个语句,那么带注释的方法将位于类方法中,但可能,稍后在同一黄瓜场景中使用的方法将位于不同的Java类和包中(假设)。@Given@When@ThenGiven user "foo" is logged@Given("^user \"([^\"]*)\" is logged$")foo.user.User@Whenfoo.car.RentCar

对我来说,第一种方法似乎很好,因为我可以很容易地在我的cucumber功能和我的Java代码之间建立联系。但缺点是我可以有很多冗余或代码重复。此外,可能很难找到一个可能的现有方法,以避免重新创建它(IDE可以提供帮助,但在这里我们使用的是Eclipse,它似乎没有给出现有语句的列表?)。@GivenGiven

另一种方法似乎更好,当你在几个黄瓜功能之间共享条件时,因此我想避免代码重复。这里的缺点是很难在Java方法和cucumber语句之间建立链接(也许,IDE可以提供帮助?)。Given@GivenGiven

我对黄瓜很陌生,所以也许我的问题不是一个好问题,随着时间的推移和经验,结构将是不言而喻的,但我想得到关于其用法的良好反馈......

谢谢。


答案 1

我建议根据代码引用的对象对代码进行分组,类似于您在问题中提出的选项#2。原因是:

  • 根据代码的使用方式和位置来构建代码是一个很大的禁忌。它实际上是在功能文件和代码之间创建耦合。
    想象一下,在你的产品代码中有这样的东西 - 函数不会在一个名为的类中,对吧?它将在或诸如此类。
    因此,这同样适用于这里;根据代码的作用来构建代码,而不是根据使用它的人来构建代码。SendEmail()NewEmailScreenCommandsEmailActions

  • 第一种方法会使重新组织特征文件变得困难;每当更改功能文件时,都必须更改代码文件。

  • 保持代码按主题分组使DRYYING变得更加容易;您确切地知道处理实体的所有代码的位置,因此您更容易重用它。user

在我们的项目中,我们使用这种方法(即类),如果类变得太大,则进一步将代码分离到步骤类型(即)。BlogPostStepDefinitionsBlogPostGivenStepDefinitions


答案 2

我们也开始使用Cucumber-JVM进行验收测试,并且在组织代码方面也遇到了类似的问题。我们选择为每个功能使用 1 步定义类。目前这很好,因为我们正在测试的功能不是很复杂而且非常独立,我们的功能几乎没有重叠。

我认为您提到的第二种方法会更好,但是将几个不同的步骤定义类绑定在一起通常具有挑战性。我认为,一旦你开始添加更多功能并像往常一样重构,最好的项目结构就会变得更加清晰。

与此同时,这里有一个用于黄瓜的Eclipse插件,

https://github.com/matthewpietal/Eclipse-Plugin-for-Cucumber

它具有语法突出显示以及编写功能时现有可用步骤的列表。


推荐