行为驱动开发: 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/

相关文章
|
程序员 Shell 数据格式
python股票量化交易(1)---K线图、均线与成交量绘制
python股票量化交易(1)---K线图、均线与成交量绘制
3410 0
python股票量化交易(1)---K线图、均线与成交量绘制
|
机器学习/深度学习
大模型训练loss突刺原因和解决办法
【1月更文挑战第19天】大模型训练loss突刺原因和解决办法
2920 1
大模型训练loss突刺原因和解决办法
|
缓存 Java API
【云原生】Spring Cloud Gateway的底层原理与实践方法探究
【云原生】Spring Cloud Gateway的底层原理与实践方法探究
|
消息中间件 分布式计算 大数据
大数据面经 字节跳动 (整理)
大数据面经 字节跳动 (整理)
944 0
|
算法 计算机视觉 开发者
OpenCV中使用Eigenfaces人脸识别器识别人脸实战(附Python源码)
OpenCV中使用Eigenfaces人脸识别器识别人脸实战(附Python源码)
983 0
|
11月前
|
消息中间件 Java Spring
MQ收发消息
本文介绍如何使用SpringAMQP实现RabbitMQ消息收发。RabbitMQ基于AMQP协议,支持跨语言通信。通过SpringBoot整合SpringAMQP,可快速实现消息发送与接收。文中演示了创建队列、配置生产者与消费者、使用RabbitTemplate发送消息及@RabbitListener监听消息的完整流程,并简要对比了推模式与拉模式的应用场景。
MQ收发消息
|
10月前
|
运维 监控 安全
阿里云服务器搭建新手手册:环境搭建、安全加固,到日常监控、故障处理指南
日常管理阿里云服务器时发现,多数用户在服务器上线后,常因缺乏系统的运维知识,陷入“环境配置混乱”“故障排查无思路”“安全防护缺失”等困境。阿里云服务器的稳定运行,并非仅依赖购买时的配置选型,更在于后期规范的运维管理——从基础环境搭建、安全加固,到日常监控、故障处理,每一个环节都直接影响业务连续性。本文结合2026年阿里云服务器最新特性、实测运维经验及行业最佳实践,从环境部署、安全防护、日常监控、故障排查、性能优化五个核心维度,用通俗技术语言拆解运维全流程。全程无营销表述,通过表格梳理关键操作与问题解决方案,提供可直接落地的实操技巧,帮助运维人员及服务器使用者建立系统的运维思维,保障服务器长期稳
811 4
|
10月前
|
NoSQL 关系型数据库 分布式数据库
2026年阿里云数据库产品活动解析:云数据库 RDS、云原生数据库 PolarDB等数据库特惠
阿里云数据库活动为新用户提供全方位优惠,覆盖关系型、NoSQL及数据仓库产品。RDS新用户享指定规格3折/年或全系6折/年,如MySQL基础版100GB存储首年2232元起;PolarDB新用户全系规格6折/年,分布式版低至2.8折;Redis开源版2GB倚天版399元/年起,MongoDB指定规格1999元/年起;AnalyticDB MySQL版首月6折。活动涵盖从基础到企业级需求,助力企业以高性价比构建数据平台,降低上云门槛。
|
10月前
|
存储 缓存 安全
阿里云服务器计算型、通用型、内存型实例选购指南:如何选择最适合您的云服务器实例规格
在阿里云的实例规格中,属于计算型实例规格的热门实例主要有计算型c9i、计算型c9a、计算型c8y、计算型c8i等实例规格,属于通用型实例规格的云服务器有通用型g9i、通用型g9a、通用型g8y、通用型g8i,属于内存型实例规格的云服务器有内存型r9i、内存型r9a、内存型r8y、内存型r8i等实例。不同实例规格的云服务器在架构、计算、存储、网络、安全等方面有着不同,因此,其适用场景也有所不同。本文为大家解析计算型、通用型、内存型实例的区别,并为您提供选择参考。
|
存储 JavaScript 开发者
探索鸿蒙新世界:ArkUI框架实战指南,解锁HarmonyOS应用UI设计的无限可能!
【10月更文挑战第19天】ArkUI框架是华为鸿蒙系统中用于开发用户界面的核心工具,支持ArkTS和eTS两种开发语言。本文介绍了ArkUI的基本概念、组件使用、布局管理和状态管理,通过示例代码帮助开发者轻松构建美观、高效的跨设备UI。
1515 3