发表完《初识Cucumber》,有读者评论,说自己也在学习cucumber,但是苦于公司没有网络,学习资源匮乏,学习进度一拖再拖。这不禁让我想起了当初学习Selenium的经历。
老东家安全制度极严,即不能拎包入内,也无法访问网络,连可怜的4G信号几乎都屏蔽了。没有学习资料,也没有前辈为我答疑解惑,两个字——干学。迫不得已时,只好请教远在印度的合作伙伴,吐鲁番味儿的英语着实让我每天都在问与不问中纠结。然而,工作进度像鞭子一样抽着人往前走,硬着头皮写了一堆堆的测试脚本,却无法对整个框架进行系统的学习。好在,遇到了Manish,一位印度的自动化测试大牛,一位和蔼可亲的导师,一直能够耐心地为我解答问题。终于在他的帮助下,对selenium自动化的学习有了起色,也尝出了印度英语别样的味道。
遇到Manish的确是我最大的幸运,我不聪明,但是师父领进门,修行在个人,希望勤奋能够弥补一些无法改变的客观条件,比如并不聪颖的天资,以及被限制掉的网络。也希望我的订阅号能帮助更多被屏蔽了网络资源的初学者。
鸡汤喝完,回归正题,一起来编写第一个Cucumber Test。
本文我们选用cucumber的经典案例-calculator。
把大象塞进冰箱分为三步:a.开冰箱门; b.把大象塞进去; c.关门。
创建一个Cucumber Test也分为三步:a.创建features folder; b.编写.feature文件; c.编写step definitions.
Step 1: 新建cucumber project
Cucumber测试用例集存储在features文件目录中,因此我们需要为project新建一个包含features的工作目录。
(1). 首先新建一个名为calculator的project:$ mkdir calculator
(2). 进入目录文件:$ cd calculator
(3).这里我打算用cucumber来引导构建calculator project,为了清楚的理解构建过程,我们先在这个空目录下执行cucumber命令:$ cucumber
执行cucumber命令时,由于并未指定命令行参数,所以cucumber假定我们使用常规的features文件夹来存储测试脚本。此时cucumber识别出project中缺少features文件夹。接下来,我们需要按照提示,使用cucumber --init来初始化工作目录,生成features文件夹。
Step 2: 初始化cucumber project,生成features folder
(1). 初始化cucumber工作目录:$ cucumber --init
初始化成功,用ls命令查看,你会发现在calculator project中自动生成了以下目录文件:
features
features/step_definitions
features/support
features/support/env.rb
(2). 再次执行cucumber命令:$ cucumber
每个cucumber test 被称为Scenario,每个Scenario中的step会告诉cucumber要做什么。执行cucumber命令时,会扫描features文件目录,这时cucumber发现没有任何可以执行的Scenario,所以将结果标记为0 scenarios, 0 steps。因此我们需要在features里新建一个Adding.feature文件,并在Adding.feature文件中编写第一个Scenario及其step。
Step 3: 编写feature/Adding.feature
(1). 进入features目录:$ cd features
(2). 使用vi编辑器新建、编辑并保存Adding.feature文件:$ vi Adding.feature
(*Tips:vi编辑器中,按“i”键开始编辑,按ESC键结束编辑,输入”:wq"退出并保存编辑)
(3). 回到上级目录: $ cd ..
(4). 再次执行cucumber命令: $ cucumber
哇呜,有好多黄色的log,上期我们讲过,绿色指通过,红色指失败,黄色指未定义。仔细观察我们发现些端倪:
a. cucumber执行features文件夹,并识别出了一个scenario(包含三个step), 但是cucumber不知道该如何来执行,所以将其标记为“undefined”.
b. cucumber已经给出一个用ruby编写的step definitions小片段,来指导我们如何将自然语言翻译成可执行的ruby脚本。
上期讲述cucumber原理时,我们提到,运行cucumber命令时,会扫描features中的文件,每个feature中包含多个Scenario, Scenario中的step会调用step definitions中的编写的测试代码。所以接下来我们要完成具体的step definitions。
Step 4: 编写step definitions
初始化cucumber时,已经生成了features/step_definitions文件目录,这里直接进入该目录并新建一个ruby文件,命名为calculator_steps.rb。编辑并保存该ruby文件。
(1). 进入features/step_definitions目录:$ cd step_definitions
(2). 使用vi编辑器新建并保存calculator_steps.rb文件:$ vi calculator_steps.rb
如果你不懂ruby,可以暂时不考虑ruby脚本的意义,直接将step 3 中最后提示的ruby小片段复制粘贴到calculator_steps.rb文件中,然后保存并退出编辑。执行cucumber命令将会指导你该怎么做。
(3). 返回到calculator目录,再次执行cucumber命令: $ cucumber
仔细观察下就会发现,原本的undefined变成了pending。为什么呢?这表示cucumber已经开始执行scenario中的step了,但是我们的step是复制粘贴的pending,表明这个scenario还在进行中,处于未完成状态。因此我们需要将pending 改成具体的代码实现。
(4). 修改脚本: $ vi calculator_steps.rb
(5). 执行cucumber命令观察结果。
可以看到, 1 failed, 1 skipped, 1 passed.(passed-绿色标记,skipped-蓝色标记,failed-红色标记)。step 1 passed之后,继续执行step 2,不幸的是step 2 failed了,所以cucumber会跳过step 3, 结束该scenario的执行。当然,执行结果清晰表明step 2 失败的原因:cal.rb不存在。所以接下来,我们创建calc.rb文件.
(6). 我们暂时先创建一个空的features/support/calc.rb文件来完成cucumber Test。
Mac可以采用touch命令新建calc.rb文件。
其次,修改step 2 中的路径,以保持一致性。为了方便观察整个project结构,此处附IntelliJ的截图。
(7). 执行cucumber命令,我们的第一个Cucumber Test就通过啦。
PS: 微信小程序上线了,所有的推送都被微信小程序刷爆了,我也迫不及待地想要体验一番了。