如何在Cucumber中组织规范定义?

时间:2012-10-17 09:33:02

标签: java cucumber acceptance-testing cucumber-jvm cucumber-junit

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

当我们在黄瓜scenario中写feature时,我们会写一份GivenWhenThen语句的列表。

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

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

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

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

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

  3. 对我来说,第一种方法看起来很好,我可以很容易地处理我的黄瓜功能和我的Java代码之间的关系。但缺点是我可能会有很多冗余或代码重复。此外,可能很难找到可能的现有@Given方法,以避免重新创建它(IDE​​可以提供帮助,但在这里我们使用Eclipse,它似乎没有给出现有{{1的列表声明?)。

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

    我对黄瓜很新,所以也许我的问题不是一个好问题,而且随着时间和经验,结构将是不言而喻的,但我希望得到关于其使用的良好反馈... < / p>

    感谢。

2 个答案:

答案 0 :(得分:2)

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

  • 根据使用方式和位置来构建代码是一个很大的禁忌。它实际上是在您的功能文件和代码之间创建耦合 想象一下产品代码中的这种情况 - SendEmail()函数不会出现在名为NewEmailScreenCommands的类中,是吗?这将是EmailActions或其他一些 所以这同样适用于此;根据代码的作用构建代码,而不是谁使用代码。

  • 第一种方法会使重新组织您的要素文件变得困难;每当更改要素文件时,都必须更改代码文件。

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

在我们的项目中,我们使用该方法(即BlogPostStepDefinitions类),如果类太大,则将代码进一步分离为步骤类型(即BlogPostGivenStepDefinitions)。

答案 1 :(得分:1)

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

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

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

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

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