运行黄瓜测试的抽象级别是什么?

时间:2015-11-14 22:07:43

标签: cucumber bdd cucumber-jvm

Given a java web application
And that it has a restful back-end
And serves a single page html/js front-end
When I use cucumber to test my application
Then which layer should I drive my tests through?

可能的选择:

1)域层:StepsDefs直接委托给服务和存储库

2)REST层:StepsDefs委托给REST客户端,该客户端在容器部署的应用程序中触发HTTP请求

3)用户界面:StepsDefs委托给网络驱动程序,如selenium,并操纵用户界面。

PS)随意用当时的符号表示你的答案:)

1 个答案:

答案 0 :(得分:1)

我认为你要问两个单独的问题,一个在标题中,另一个在正文中。

1)什么是正确的'抽象程度?

可执行规范应使用对所有相关利益相关方(尤其是非技术性)有意义的领域/无处不在的语言编写。每个方案通常应验证单个行为,文本应仅包含相关信息 - 应省略冗余或偶然的细节。

正确性的测试是"阅读此场景的人是否对此感兴趣?"如果答案是"是",您可能会从他们那里得到有价值的反馈。如果答案是"否"然后,您需要协作优化您的域语言,并专注于他们感兴趣的行为。

您可能会发现您有各种利益相关者,他们有不同的兴趣。没关系。将场景分成不同的功能文件,每个功能文件都针对您的利益相关者的一部分。将这些视为大型印刷手册中不同级别的细节。

技术团队想要编写的任何非技术利益相关者似乎对此感兴趣的测试都可以使用您最喜欢的"单位"测试框架。您可以使用Cucumber / Gherkin,但是为这些测试维护域语言的成本是否值得?你需要决定。

2)StepDef应该如何与应用程序交互?

这个问题与1)正交。答案是,一如既往,取决于它。我应用测试金字塔方法并且支持测试,这些测试在很少的应用程序中运用是有意义的。如果我正在测试组件的行为,我希望通过它提供的最简单的界面与该组件进行交互。当我向上移动金字塔时,我开始测试组件之间的协议,最后我确保整个应用程序已正确部署并且“挂在一起”。

有时唯一可用的界面是UI。这很糟糕,但如果应用程序已经已经构建的方式,那么我们必须忍受它。这通常会导致需要大量维护的缓慢而脆弱的可执行规范。下一次,从外部驱动开发,并确保您有在UI下运行应用程序的方法。

@everzet和我从不同方向到达的技术是使用标签来改变StepDefs与应用程序的交互方式。域语言保持不变,但标签向测试代码发出信号,表明它是否应通过UI,REST API或直接调用代码进行交互。

他在"modeling by example"记录了他的方法。我在与rebuild trust between dev & test相反的方向上使用了相同的技术,并在The Cucumber for Java Book

中进行了描述