Java 如何在Cucumber中组织规范定义?
我们正在考虑在我们的项目中使用黄瓜进行验收测试 当我们在CucumberJava 如何在Cucumber中组织规范定义?,java,cucumber,acceptance-testing,cucumber-jvm,cucumber-junit,Java,Cucumber,Acceptance Testing,Cucumber Jvm,Cucumber Junit,我们正在考虑在我们的项目中使用黄瓜进行验收测试 当我们在Cucumber功能中编写一个场景时,我们编写一个给定的列表,当和然后语句 当我们使用project时,给定的、When和Then语句与(JUnit)类中的Java方法相关 我想知道与相关的代码在项目结构中的最佳组织是什么。我主要关心的是在一个大项目上维护cumber测试,其中场景的数量非常重要,特别是关于功能之间共享的项目 我可以看到至少两种主要方法: 每个特性都与其自己的JUnit类相关。因此,如果我有一个foo/bar/baz.fea
功能中编写一个场景
时,我们编写一个给定的列表
,当
和然后
语句
当我们使用project时,给定的、When
和Then
语句与(JUnit)类中的Java方法相关
我想知道与相关的代码在项目结构中的最佳组织是什么。我主要关心的是在一个大项目上维护cumber测试,其中场景的数量非常重要,特别是关于功能之间共享的项目
我可以看到至少两种主要方法:
每个特性都与其自己的JUnit类相关。因此,如果我有一个foo/bar/baz.feature
cucumber文件,我将找到相关的foo.bar.baz
JUnit类,该类具有适当的@给定的,@当和@然后注释的方法
将@给定的
、@当
时和@然后
方法分离为“主题”类和包。例如,如果在我的cucumber场景中记录了一条语句给定用户“foo”
,那么@Given(“^user\”([^\“]*)”将记录$”)
带注释的方法将位于foo.user.user
类方法中,但在同一场景中稍后使用的@When
方法可能位于不同的Java类和包中(比如foo.car.RentCar
)
对我来说,第一种方法似乎很好,因为我可以很容易地处理cucumber特性和Java代码之间的关系。但缺点是我可能会有很多冗余或代码重复。此外,可能很难找到一个可能存在的@给定的
方法,以避免重新创建它(IDE可以提供帮助,但这里我们使用的是Eclipse,它似乎没有给出现有给定的语句的列表?)
另一种方法在几个Cumber特性之间共享给定的
条件时基本上更好,因此我希望避免代码重复。这里的缺点是很难在@Given
Java方法和Given
Cumber语句之间建立链接(也许IDE也能帮上忙?)
我对cucumber很陌生,所以我的问题可能不是一个好问题,随着时间和经验的推移,结构将不言而喻,但我想从它的使用中得到良好的反馈
谢谢。我们也开始使用Cucumber JVM进行验收测试,在组织代码方面也有类似的问题。我们为每个功能选择了一个步骤定义类。目前这很好,因为我们正在测试的功能不是很复杂,也不是很独立,我们的功能几乎没有重叠
我认为,您提到的第二种方法会更好,但将几个不同的步骤定义类绑定到一个场景中往往是一个挑战。我认为,一旦您开始添加更多功能并像往常一样进行重构,最好的项目结构就会变得更清晰
同时,这里有一个用于cucumber的Eclipse插件
在编写功能时,它具有语法突出显示以及现有可用步骤的列表。我建议根据它所指的对象对代码进行分组,类似于您在问题中提出的选项2。原因如下:
- 根据代码的使用方式和使用地点来构建代码是一个很大的禁忌。它实际上是在功能文件和代码之间建立耦合。
想象一下,在你的产品代码中有这样一个东西,sendmail()
函数不会在名为NewEmailScreenCommands
的类中,是吗?它会在EmailActions
或类似的类中。
因此,同样的道理也适用于这里;根据代码的功能而不是使用它的人来构造代码
- 第一种方法会使重新组织功能文件变得困难;无论何时更改功能文件,都必须更改代码文件
- 按主题对代码进行分组使其更容易干燥;您确切地知道处理
用户
实体的所有代码的位置,因此更容易重用它
在我们的项目中,我们使用这种方法(即BlogPostStepDefinitions
类),如果类太大,则进一步将代码分离为步骤类型(即BlogPostGivenStepDefinitions
)
在对可能性进行了一点修改之后,我们选择的是您公开的两种解决方案的混合
- 在以主题为中心的通用步骤类中重新组合步骤
- 应用程序启动步骤
- 安全检查步骤
- [此处放置随机特征关注点]步骤
- 以及场景类(在某些情况下甚至是功能)特定步骤
这是为了在同一时间有一组分解的代码,这是很容易识别的,它的什么,行踪和什么。
然而,它不允许用过于特定的代码将这些公共类弄乱
所有这些类之间的连接都是由spring处理的(cucumber spring一旦掌握了窍门,它会做得很好)。注意,我不认为这是这个问题的重复:谢谢。我已经在使用Eclipse插件,但还不是很满意(当然,它可以改进)您是否可以选择切换到IntelliJ(有一个免费的社区版);这对建议现有的STEP定义非常有帮助。