我们正在考虑在我们的项目上使用 cucumber 进行验收测试。
当我们在 cucumber scenario
中编写feature
时,我们将编写Given
,When
和Then
语句的列表。
当我们使用cucumber-jvm项目时,Given
,When
和Then
语句与(JUnit)类中的Java方法相关。
我想知道在项目结构中与Given
/When
/Then
相关的代码的最佳组织是什么。我主要关心的是维护大型项目的 cucumber 测试,其中场景的数量非常重要,尤其是有关要素之间共享的项目。
我可以看到至少2种主要方法:
foo/bar/baz.feature
cucumber 文件,我将找到具有适当foo.bar.Baz
,@Given
和@When
注释方法的@Then
JUnit类。 @Given
,@When
和@Then
方法分离为“主题”类和程序包。例如,如果在我的 cucumber 方案中我有一条语句Given user "foo" is logged
,则带注释的@Given("^user \"([^\"]*)\" is logged$")
方法将位于foo.user.User
类方法中,但同一 cucumber 方案中稍后使用的@When
方法将位于不同的Java类和包中。 (让我们说foo.car.RentCar
)。 对我而言,第一种方法似乎很不错,因为我可以轻松地进行 cucumber 功能与Java代码之间的关系。但是缺点是我可以有很多冗余或代码重复。另外,可能很难找到一个可能的现有
@Given
方法,以避免重新创建它(IDE可以提供帮助,但是这里我们使用的是Eclipse,它似乎没有给出现有Given
语句的列表?)。从本质上讲,当您在多个 cucumber 功能中共享
Given
条件时,另一种方法似乎更好,因此我想避免代码重复。这里的缺点是很难在@Given
Java方法和Given
cucumber 语句之间建立链接(也许,IDE可以帮忙吗?)。我对 cucumber 还很陌生,所以也许我的问题不是一个好问题,并且由于时间和经验的原因,这种结构是不言而喻的,但是我希望获得有关其用法的良好反馈...
谢谢。
最佳答案
我建议根据代码所引用的对象对代码进行分组,类似于您在问题中提出的选项2。原因是:
想象一下您的产品代码中的这种事情-
SendEmail()
函数不会在名为NewEmailScreenCommands
的类中,对吗?它将是EmailActions
或类似的形式。所以这里同样适用。根据代码的用途而不是由谁使用来组织代码。
user
实体的代码在哪里,因此您可以更轻松地重用它。 在我们的项目中,我们使用该方法(即
BlogPostStepDefinitions
类),如果该类太大,则将代码进一步分为步骤类型(即BlogPostGivenStepDefinitions
)。