本节书摘来自异步社区《Cucumber:行为驱动开发指南》一书中的第2章,第2.2节,作者:【英】Matt Wynne , 【挪】Aslak Hellesy著,更多章节内容可以访问云栖社区“异步社区”公众号查看
2.2 创建一个特性
Cucumber测试都归类为特性(feature)。我们使用这个名字是希望用它描述用户运行程序时使用的一些特性。首先我们要创建一个目录,该目录存放程序文件以及我们即将编写的特性文件。
$ mkdir calculator
$ cd calculator
我们要让 Cucumber 引导整个计算器程序的开发过程,于是我们首先在这个空目录下运行一下cucumber命令:
$ cucumber
You don't have a 'features' directory. Please create one to get started.
See http://cukes.info/ for more information.
由于我们没有声明任何命令行参数,Cucumber会认为我们使用了默认的features文件夹存放测试。这没什么问题,只是目前我们还没有任何测试。我们遵循这一目录结构的约定来创建一个features目录:
$ mkdir features
然后再运行一下Cucumber:
$ cucumber
0 scenarios
0 steps
0m0.000s
每个 Cucumber 测试称为一个场景(scenario),每个场景都包含一些步骤(step),这些步骤告诉Cucumber具体做什么。上述的输出说明Cucumber现在已经能够正确扫描features目录了,不过它还没找到可运行的场景。下面我们来创建一个场景。
我们的用户调查显示,67%的数学运算是加法,因此加法是我们首先要支持的运算。你可以打开自己最喜欢的编辑器,创建一个名为featur``es/adding.feature的文本文件,在其中添加如下内容:
下载first_taste/01/features/adding.feature
Feature: Adding
Scenario: Add two numbers
Given the input "2+2"
When the calculator is run
Then the output should be "4"
这个.feature文件包含了计算器程序的第一个场景。我们将上一节的一个实例翻译成了Cucumber场景,以后我们可以让计算机一遍又一遍地运行这个场景。或许你已经看到,Cucumber对这个文件的结构实际上是有一些要求的,结构就是这里的Feature、Scenario、Given、When、Then等关键字,其他的所有内容都是文档。虽然书中这些关键字被标粗了(可能你的编辑器也会将它们标亮),但该文件只是简单的文本文件。这个结构就叫做Gherkin。
保存文件内容,然后运行cucumber,你应该能看到比上次多了好些输出:
$ cucumber
Feature: Adding
Scenario: Add two numbers # features/adding.feature:3
Given the input "2+2" # features/adding.feature:4
When the calculator is run # features/adding.feature:5
Then the output should be "4" # features/adding.feature:6
1 scenario (1 undefined)
3 steps (3 undefined)
0m0.003s
You can implement step definitions for undefined steps with these snippets:
Given /^the input "([^"]*)"$/ do |arg1|
pending # express the regexp above with the code you wish you had
end
When /^the calculator is run$/ do
pending # express the regexp above with the code you wish you had
end
Then /^the output should be "([^"]*)"$/ do |arg1|
pending # express the regexp above with the code you wish you had
end
If you want snippets in a different programming language,
just make sure a file with the appropriate file extension
exists where cucumber looks for step definitions.
哇,突然来了这么多输出!让我们看看究竟发生了什么。首先,我们能看到Cucumber找到了我们的特性并尝试运行它,这一步非常明白,因为Cucumber已经把这个特性的内容照搬到了终端上。你可能还注意到了输出摘要中原来的0 scenarios已经变成了1 scenario``(undefined),这表示Cucumber已经读取了我们的特性中的场景但还不知道如何运行它。
其次,Cucumber打印了三段代码,它们是用Ruby编写的步骤定义(step definition)样例代码,用来告诉Cucumber如何将日常英语描述的步骤翻译成一系列运行在我们应用程序之上的动作。下一步我们要做的就是将这些代码片段放入Ruby文件,然后开始丰富这些代码。
Gherkin特性是面向业务的,再往下一层是步骤定义,不过在探索这一层之前有必要快速看一看全局图,以防有人感到困惑。图2-1可以提醒我们各种元素是如何组织在一起的,我们从包含场景和步骤的特性开始,场景中的步骤会访问步骤定义,后者将Gherkin特性和我们构建的应用程序连接在一起。
图2-1 Cucumber测试集的主要层次
现在我们将实现一些步骤定义,那样场景就不再是未定义(undefined)的了。