浅谈BDD下的自动化测试框架

转载本文需注明出处:微信公众号EAWorld,违者必究。

引言:

测试驱动开发(TDD)相信大家已经很熟悉了,而行为驱动开发(BDD)其实是TDD的一种演化。那什么是BDD,为什么要使用BDD, BDD下的自动化测试该如何做呢?本文将通过简单的例子,向大家展示如何使用Cucumber 描述需求,编写、执行测试用例,并输出测试报告。

目录:

一、什么是BDD

二、为什么要使用BDD

三、常用的BDD测试框架

四、BDD自动化测试框架Cucumber

一、什么是BDD

BDD(Behavior Driven Development),即行为驱动开发,是敏捷开发技术之一,通过自然语言定义系统行为,以功能使用者的角度,编写需求场景,且这些行为描述可以直接形成需求文档,同时也是测试标准。

二、为什么要使用BDD

传统模式下,从客户提出需求,到输出产品,我们会经历以下流程:

  • 客户:提出需求
  • 需求分析师:分析需求,形成开发可执行的具体 Feature、Story、Taks
  • 开发:实现需求
  • 测试:编写验证步骤,验证最终产品是否满足需求

通常,由于不同的人对需求的理解不同,最终可能导致产品与客户需求存在很大差距。

BDD是基于一种“通用语言”,可以让客户、产品经理等将需求通过同一种语言描述出来,很大程度上避免了因为理解或表达不一致带来的问题,大大提高产品的交付品质。由此BDD的优势也就体现出来了:

  • 更关注业务,以用户使用产品的角度,描述用户行为以及预期结果
  • 不同角色的人都可以参与需求定义及讨论,最终达成一致理解
  • 使用同一种语言描述需求,及测试用例,很大程度上避免了因理解差异导致实现功能与需求不一致的问题

三、常用的BDD测试框架

我们在前面提到过,BDD最终形成的文档即是需求文档,也是测试规范,那么我们如何基于这些测试规范实现自动化测试呢?目前,支持BDD自动化测试的框架有很多,且支持各种不同的语言,例如:

  • Cucumber:基于Ruby编写的自动化测试框架,支持Java和.Net等多种语言
  • Behave/Lettuce/Freshen: Python style的测试框架
  • Jbehave/ beanSpec :基于Java编写的自动化测试框架
  • SpecFlow:.Net测试框架

测试框架选型需要根据实际情况而定,例如项目组技术背景,用例覆盖范围,产品性能要求等等,接下来我们详细了解一下Cucumber。

四、BDD自动化

测试框架Cucumber

  • Cucumber简介

Cucumber是应用比较广的BDD自动化测试工具之一,它理解我们使用Gherkin语言编写的测试用例,自动解析场景对应的步骤定义,进行系统行为验证。Cucumber基于Ruby编写,支持Java和.Net等多种开发语言。

基于Cucumber的BDD的测试流程如下:

  • .feature:定义需求场景及步骤描述
  • 步骤定义:步骤描述的具体实现,即可执行的步骤代码
  • 运行测试:执行测试用例
  • 生成报告:Cucumber支持生成多种格式的测试报告
  • 如何编写feature文件

.feature文件用来描述功能,每个feature包含一个或多个Scenario,而每个Scenario

又包含一个或多个步骤描述,以下是示例代码:

当我们在eclipse中使用了Cucumber插件后,它会自动检测每个步骤描述是否有对应的实现,如果没有则会有警告提示。

Feature文件使用Gherkin语言编写,然后通过注解将Gherkin脚本与实际测试代码关联起来,比较常用Gerkin的关键字如下:

  • Feature:对需要的简要描述
  • Scenario/Scenario Outline:场景描述,即feature所包含的功能点
  • Given:预置条件
  • When:具体的动作,例如User Navigate to the LogIn Page
  • Then:预期结果
  • And/But:可以与Given、When、Then同时使用,使得step描述更清晰易懂

虽然Cucumber本身在技术上并不区分Given、When、Then这三个关键字,但在实际使用中还是推荐按照词组意思描述步骤。

  • 如何实现步骤定义(Step definition)

在实现测试步骤前,我们需要在maven项目中添加Cucumber相关依赖:

  • cucumber-java
  • cucumber-jvm-deps
  • cucumber-junit
  • selenium-java(由于示例需要打开浏览器,所以添加了selenium相关依赖)

使用Eclipse可以快速生成实现步骤的java方法,在feature文件上右键选择Run As/Cucumber Feature执行feature文件,当feature中存在未实现的步骤时,Console会打印对应的java方法,将代码拷贝到java文件中,完善测试步骤即可,以下是实现测试步骤的代码示例:

  • 如何执行用例

完成feature以及测试代码后,可以直接在Eclipse中通过以下方式执行用例:

  • 在feature文件点击右键,选择Run As > Cucumber Feature
  • TestRunner点击右键,选择Run As > JUnit Test,TestRunner定义如下:

也可以通过以下命令行执行测试用例:

  • Junit命令:java -cp [jar files separated by comma including junit jar file and your junit test case jar file] org.junit.runner.JUnitCore [your junit test case class]
  • Maven命令:mvn test,我们更推荐使用maven,因为它可以与jenkins集成,方便续持续集成。mvn test的运行结果如下图:

使用mvn test执行测试用例时,默认执行src/test/java目录及子目录下所有满足以下规则的类:

  • 以Test开头的java类(即Test*.java)
  • 以Test结尾的Java类(即*Test.java)
  • 以TestCase结尾的Java类(即*TestCase.java)
  • Cucumber测试报告

执行测试用例时,Cucumber默认在console中输出测试结果,当然也可以根据需要,通过配置Cucumber Options的Plugin参数,修改报告输出格式,当前支持的报告格式有以下几种:

  • Pretty Report
  • HTML Reports
  • JSON Report
  • JUNIT XML Report

Pretty Report:使得Console输出的log更具可读性,需要设置CucumberOptions的Plugin参数为pretty。

运行结果如下:

HTML Reports:将测试结果输出到html文件中, plugin参数配置如下:

HTML格式测试报告:

JSON Report:测试结果以JSON格式输出,plugin参数配置如下:

JSON报告示例:

Junit XML Report:测试结果以XML格式输出,plugin参数配置如下:

HTML报告示例:

  • Cucumber与Jenkins集成

用例编写完成且测试通过后,如何与Jenkins集成并定时触发执行,得到测试结果呢?

首先需要配置Jenkins全局工具配置(JDK和Maven):

然后安装Cucumber reports :

插件安装完成后,在Jenkins中创建Maven项目,做如下配置且保存:

打开项目,并点击“立即构建”,待构建完成后,即可从项目首页查看报告:

Jenkins 的 Cucumber reports 插件可以从不同维度统计测试结果,以下是从 feature的角度统计的结果,例如 Features、Tags、Steps 等。

点击 Feature 名称,即可查看报告详情。

以上便是我们如何基于 Cucumber 完成自动化测试的简单例子,希望能给大家带来帮助。

精选提问:

问1:Cucumber 单元测试和集成测试都是用了这个框架?

答:功能测试和集成场景测试使用了这个框架,单元测试是开发做的,没有用这个框架。

问2:微课堂前面提到的story和taks是什么意思?

答:story 是用户故事,在敏捷中使用As xxx So that xxx去描述用户场景,而BA会根据story进行插卡,讲stroy拆分成可开发的小卡(task)供dev开发使用。

问3:为什么选择了Cucumber?有没有做API自动化测试?使用的什么工具框架robootframework?

答:Cucumber可以将测试用例描述和测试用例执行整合在一起,用自然语言描述出来的测试用例,直接被执行,也就是Gherkin。同时Gherkin对于测试人员并没有什么技术要求,只要精通业务即可,所以我们选择使用Cucumber。

API自动化测试,我们用的rest-assured这个框架,另外也可以使用postman,将测试好的api导出json,再通过npm安装newman这个包,就可以直接运行json文件了。

问4:BDD与敏捷Scrum的关系是什么?

答:BDD是行为驱动开发,是敏捷开发技术,鼓励所有的角色all in 互相协作。scrum是软件开发管理上方法论。

关于作者:卢亚婷,普元产品支持中心测试开发工程师,现主要从事普元EOS Platform测试工作。曾在中软,Tibco担任高级软件工程师。

原文发布于微信公众号 - EAWorld(eaworld)

原文发表时间:2018-08-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏加米谷大数据

Kafka性能测试

耗时:18秒 总体文件大小:2193.45MB 最大处理量:163.6659MB/S TPS:171616.1767条

35420
来自专栏无题

各RDB与Nosql性能与特点总结

最近考虑到数据库包括各种缓存到底面对高并发情况性能到底是怎么样的,所以多方收集整理成此篇,以后也会持续更新。 mysql: 1.性能从10万条规模升到100万...

420110
来自专栏自由而无用的灵魂的碎碎念

让fedora也可以播放音乐文件

本人自从开始使用linux/unix,发现windows并非唯一最佳选择,这不,linux下什么也都干干。

11820
来自专栏竹清助手

深入理解什么是RESTful API ?

越来越多的人开始意识到,网站即软件,而且是一种新型的软件。   这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(hig...

11220
来自专栏轮子工厂

C/C++、Java和Python开发工具一网打尽

在我们埋头于代码死磕的时候,会发现一个好的开发工具往往会起到事半功倍的效果,本帖子总结了C语言与Java几个比较流行的开发工具,希望能对大家有用。

21120
来自专栏轮子工厂

Wox一款国产开源的快捷启动器辅助工具神器

如果你也不喜欢电脑桌面上满是程序的快捷方式,如果你也喜欢博主这样干干净净的桌面,甚至喜欢高效的键盘操作,那么你需要一款好用的快速启动器软件。

10010
来自专栏高性能服务器开发

(八)高性能服务器架构设计总结4——以flamigo服务器代码为例

二、架构篇 一个项目的服务器端往往由很多服务组成,就算单个服务在性能上做到极致,支持的并发数量也是有限的,举个简单的例子,假如一个聊天服务器,每个用户的信息是1...

51740
来自专栏北京马哥教育

超实用:小团队如何从零搭建一个自动化运维体系?

如下图,现在行业内各巨头自动化运维架构的最终样子大家都知道了,但是如何根据自己团队当前的情况一步步向这个目标演进?

16000
来自专栏blackheart的专栏

[解读REST] 6.REST的应用经验以及教训

衔接上文[解读REST] 5.Web的需求 & 推导REST,上文根据Web的需求推导出了REST架构风格,以及REST的详细描述和解释。自从1994年以来,R...

268100
来自专栏小狼的世界

Ajax与REST

REST(Representational State Transfer)是一种开发思想,互联网不断发展,富媒体越来越多的应用,不断地冲击着我们的应用,使应用的...

11020

扫码关注云+社区

领取腾讯云代金券