行为驱动开发: Cucumber的目录结构和执行过程

简介:

Cucumber是Ruby世界的BDD框架,开发人员主要与两类文件打交到,Feature文件和相应的Step文件。Feature文件是以feature为后缀名的文件,以Given-When-Then的方式描述了系统的场景(scenarios)行为;Step文件为普通的Ruby文件,Feature文件中的每个Given/When/Then步骤在Step文件中都有对应的Ruby执行代码,两类文件通过正则表达式相关联。笔者在用Cucumber+Watir做回归测试时对Cucumber工程的目录结构执行过程进行了研究。

安装好Cucumber后,如果在终端直接执行cucumber命令,得到以下输出:

输出结果表明:cucumber期待当前目录下存在名为features的子目录。建好features文件夹后,重新执行cucumber命令,输出如下:

Cucumber运行成功,但由于features文件夹下没有任何内容,故得到上述输出结果。

网上大多数关于Cucumber的教程都建议采用以下目录结构,所有的文件(夹)都位于features文件夹下。

Feature文件(如test.feature)直接位于features文件夹下,可以为每个应用场景创建一个Feature文件;与Feature文件对应的Step文件(如test.rb)位于step_definitions子文件夹下;同时,存在support子文件夹,其下的env.rb文件为环境配置文件。在这样的目录结构条件下执行cucumber命令,会首先执行env.rb做前期准备工作,比如可以用Watir新建浏览器窗口,然后Cucumber将test.rb文件读入内存,最后执行test.feature文件,当遇到Given/When/Then步骤时,Cucumber将在test.rb中搜索是否有相应的step,如果有,则执行相应的Ruby代码。

这样的目录结构只是推荐的目录结构,笔者通过反复的试验得出了以下结论:对于Cucumber而言,除了顶层的features文件夹是强制性的之外,其它目录结构都不是强制性的,Cucumber将对features文件夹下的所有内容进行扁平化(flatten)处理和首字母排序。具体来说,Cucumber在运行时,首先将递归的执行features文件夹下的所有Ruby文件(其中则包括Step文件),然后通过相同的方式执行Feature文件。但是,如果features文件夹下存在support子文件夹,并且support下有名为env.rb的文件,Cucumber将首先执行该文件,然后执行support下的其它文件,再递归执行featues下的其它文件。

比如有如下Cucumber目录结构:

为了方便记录Cucumber运行时的文件执行顺序,在features文件夹下的所有Ruby文件中加上以下代码:

puts File.basename(__FILE__)

此行代码的作用是在一个Ruby文件执行时输出该文件的名字,此时执行cucumber命令,得到以下输出(部分)结果:

上图即为Ruby文件的执行顺序,可以看出,support文件夹下env.rb文件首先被执行,其次按照字母排序执行c.rb和d.rb;接下来,Cucumber将features文件夹下的所用文件(夹)扁平化,并按字母顺序排序,从而先执行a.rb和b.rb,而由于other文件夹排在step_definitions文件夹的前面,所以先执行other文件夹下的Ruby文件(也是按字母顺序执行:先f.rb,然后g.rb),最后执行step_definitions下的e.rb。

当执行完所有Ruby文件后,Cucumber开始依次读取Feature文件,执行顺序也和前述一样,即: a.feature --> b.feature --> c.feature

笔者还发现,这些Ruby文件甚至可以位于features文件夹之外的任何地方,只是需要在位于features文件夹之内的Ruby文件中require一下,比如在env.rb中。


最新内容请见作者的GitHub页:http://qaseven.github.io/

相关文章
|
Ubuntu 编译器 Linux
Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试
前面学习了驱动的基础框架,上一篇编译了gcc7.3.0,那么为了方便很好的熟悉流程,本篇,将使用ubuntu18.04,直接编译ubuntu18.04的驱动,然后做好本篇文章的相关实战测试。
|
Linux 编译器 C语言
Linux驱动开发笔记(一):helloworld驱动源码编写、makefile编写以及驱动编译基本流程
基于linux的驱动开发学习笔记,本篇是描述了一个字符驱动的基础开发流程,以便做嵌入式开发多年的应用或者系统学习驱动开发。
|
C语言
嵌入式(十四)——Makefile编写及多级目录
嵌入式(十四)——Makefile编写及多级目录
460 0
嵌入式(十四)——Makefile编写及多级目录
|
测试技术 Go 数据库
Go开发技巧和踩坑分享 | 代码结构 调试技巧 配置文件 元数据
分享一下最近使用GoFrame开发go项目的经验分享。
171 0
|
Ruby
《Cucumber:行为驱动开发指南》——2.3 创建步骤定义
现在在fetures/step_definitions目录下创建一个名为calculator_steps.rb的文件,只要这是一个Ruby文件,Cucumber并不介意你给这个文件起什么名字,但这里我们给这个文件起的名字其实不错。
2381 0
|
Ruby
《Cucumber:行为驱动开发指南》——2.5 运行程序
这段代码试图运行我们的计算器程序calc.rb,同时传入上一个步骤保存下来的输入,并用另一个实例变量保存输出。接下来它检查一个名字很特别的(实际上是很隐晦的)Ruby变量$?,来核实命令是否成功运行了,如果运行失败则抛出一个错误。
1569 0
|
Ruby
《Cucumber:行为驱动开发指南》——1.4 Cucumber如何工作
Cucumber是一个命令行工具。运行时它会从普通语言编写的称为特性(feature)的文本文件中读取你的规格说明,解析需要测试的场景(scenario),然后针对你的系统运行这些场景以达到测试的目的。
2152 0
《Cucumber:行为驱动开发指南》——1.3 活的文档
Cucumber测试同传统的规格说明文档一样能被利益相关人阅读和编写,然而其独特的优点在于,你可以在任何时刻给他们一台计算机让测试执行,结果会告诉你测试有多准确。在实际情况中,这意味着你的文档不再是一种写完后就慢慢过期的东西,而成为一种能随时反映项目真实状态的活的东西。
1560 0
|
前端开发 JavaScript 测试技术
《Cucumber:行为驱动开发指南》——2.2 创建一个特性
Gherkin特性是面向业务的,再往下一层是步骤定义,不过在探索这一层之前有必要快速看一看全局图,以防有人感到困惑。图2-1可以提醒我们各种元素是如何组织在一起的,我们从包含场景和步骤的特性开始,场景中的步骤会访问步骤定义,后者将Gherkin特性和我们构建的应用程序连接在一起。
2089 0