我们正在考虑在我们的项目中使用 Cucumber 进行验收测试。
当我们在黄瓜scenario
中写feature
时,我们会写一份Given
,When
和Then
语句的列表。
在我们使用cucumber-jvm项目时,Given
,When
和Then
语句与(JUnit)类中的Java方法相关。
我想知道项目结构中与Given
/ When
/ Then
相关的代码的最佳组织是什么。我主要担心的是在一个大项目中维护黄瓜测试,其中场景的数量非常重要,特别是关于功能之间共享的项目。
我至少可以看到两种主要方法:
每个功能都与它自己的JUnit类相关。因此,如果我有一个foo/bar/baz.feature
黄瓜文件,我将找到相应的foo.bar.Baz
JUnit类,其中包含足够的@Given
,@When
和@Then
注释方法。
将@Given
,@When
和@Then
方法分为“主题”类和包。例如,如果在我的黄瓜场景中我有一个语句Given user "foo" is logged
,那么@Given("^user \"([^\"]*)\" is logged$")
带注释的方法将位于foo.user.User
类方法中,但可能是@When
方法稍后在同一个黄瓜场景中使用的将是一个不同的Java类和包(请说foo.car.RentCar
)。
对我来说,第一种方法看起来很好,我可以很容易地处理我的黄瓜功能和我的Java代码之间的关系。但缺点是我可能会有很多冗余或代码重复。此外,可能很难找到可能的现有@Given
方法,以避免重新创建它(IDE可以提供帮助,但在这里我们使用Eclipse,它似乎没有给出现有{{1的列表声明?)。
当你在几个黄瓜功能之间共享Given
条件时,另一种方法似乎更好,因此我想避免代码重复。这里的缺点是很难在Given
Java方法和@Given
黄瓜语句之间建立链接(也许,IDE可以帮助吗?)。
我对黄瓜很新,所以也许我的问题不是一个好问题,而且随着时间和经验,结构将是不言而喻的,但我希望得到关于其使用的良好反馈... < / p>
感谢。
答案 0 :(得分:2)
我建议根据所引用的对象对代码进行分组,类似于您在问题中提供的选项#2。原因是:
根据使用方式和位置来构建代码是一个很大的禁忌。它实际上是在您的功能文件和代码之间创建耦合
想象一下产品代码中的这种情况 - SendEmail()
函数不会出现在名为NewEmailScreenCommands
的类中,是吗?这将是EmailActions
或其他一些
所以这同样适用于此;根据代码的作用构建代码,而不是谁使用代码。
第一种方法会使重新组织您的要素文件变得困难;每当更改要素文件时,都必须更改代码文件。
保持按主题分组的代码使得干燥更容易;您确切知道处理user
实体的所有代码的位置,因此您可以更轻松地重用它。
在我们的项目中,我们使用该方法(即BlogPostStepDefinitions
类),如果类太大,则将代码进一步分离为步骤类型(即BlogPostGivenStepDefinitions
)。
答案 1 :(得分:1)
我们也开始使用Cucumber-JVM进行验收测试,并且在组织代码时遇到类似的问题。我们选择为每个功能提供一步定义类。目前这很好,因为我们测试的功能不是很复杂且非常独立,我们的功能几乎没有重叠。
我认为您提到的第二种方法会更好,但将单个方案的几个不同的步骤定义类联系在一起往往具有挑战性。我认为,一旦开始添加更多功能并重构正常,最佳项目结构将变得更加清晰。
与此同时,这是一个用于黄瓜的Eclipse插件,
https://github.com/matthewpietal/Eclipse-Plugin-for-Cucumber
它具有语法突出显示功能以及编写功能时现有可用步骤的列表。