前言:

  已经数月没有来园子了,写博客贵在坚持,一旦松懈了,断掉了,就很难再拾起来。但是每每看到自己博客里的博文的浏览量每天都在增加,都在无形当中给了我继续写博客的动力。最近这两天有听到Jbehave这个名词,上网查了一通,原来是和测试相关的,之前一直做开发,没有做过真正意义上的测试,对于测试的理解更是少之又少。通过这两天的查阅,现将自己的一些理解以及常见概念罗列出来。

正文:

  Behavior Driven Development行为驱动开发是一种敏捷软件开发的技术,它鼓励软件项目中的开发者、QA和非技术人员或商业参与者之间的协作。
在了解Behavior Driven Development之前,先介绍Test-Driven Development(TDD)测试驱动开发,它是一种测试先于编写代码的思想用于指导软件开发。测试驱动开发是敏捷开发中的一项核心实践和技术,也是一种设计方法论。TDD的原理是在开发功能代码之前,先编写单元测试用例代码,测试代码确定需要编写什么产品代码。
它的工作流程如下所示:

TDD方法的一些特点:

  • 有利于更加专注软件设计;
  • 清晰地了解软件的需求;
  • 很好的诠释了代码即文档。

我眼中的测试

  之前一直对于测试都是一个笼统的认知,觉得测试仅仅是一种验证,类似于部分企业中一些比较省事的测试方法,通常在代码写好之后再实施测试工作,用于验证developer的代码是否符合需求。稍微了解TDD、BDD之后才发现,测试不仅仅是一种对于代码的验证,找出几个bug或者一些诸如压力测试、负载测试,更是一种约束,一种规范,是与项目需求息息相关,还需要沟通协调客户、开发人员以及QA,从而帮助更加高效的完成软件设计开发工作。

  通过下面一幅图就可以发现对于测试也有不同的层次和流程:

  从图中可以发现,最下面的是单元测试白盒测试),主要用于测试开发人员编写的代码是否正确,这部分工作都是开发人员自己来做的。通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。再往上,就是BDD灰盒测试、黑盒测试),主要用于测试代码是否符合客户的需求,这里的BDD更加侧重于代码的功能逻辑

  从左边的范畴也可以看出,测试的范围也是逐层扩大,从单元测试的类到BDD里面的服务、控制器等,再到最上层的模拟实际操作场景的Selenium(Selenium也是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7、8、9)、Mozilla Firefox、Mozilla Suite等。)对于包括UI界面的测试。之前自己有做过这样的编码测试工作,通过写代码,可以打开IE、FF等浏览器,模拟用户点击、填写数据等操作,从而完成一整套的流程测试。整个测试从小到大,从函数、方法、类到功能模块乃至系统有着一系列严谨的体系。

再说BDD

  BDD是一种敏捷软件开发的技术。它对TDD的理念进行了扩展,在TDD中侧重点偏向开发,通过测试用例来规范约束开发者编写出质量更高、bug更少的代码。而BDD更加侧重设计,其要求在设计测试用例的时候对系统进行定义,倡导使用通用的语言将系统的行为描述出来,将系统设计和测试用例结合起来,从而以此为驱动进行开发工作。

  BDD的通用语言是一种近乎自然语言的描述软件的形式。传统的开发模式中,客户很难从技术层面理解问题,开发人员很难从业务需求考虑问题,基于这种通用语言形式可以尽可能的避免客户和开发者在沟通上的障碍,实现客户和开发者同时定义系统的需求。避免了因为理解需求不充分而带来的不必必要的工作量。

  BDD描述的行为就像一个个的故事(Story),系统业务专家、开发者、测试人员一起合作,分析软件的需求,然后将这些需求写成一个个的故事。开发者负责填充这些故事的内容,测试者负责检验这些故事的结果。通常,会使用一个故事的模板来对故事进行描述

  Story:

As a 角色
I want 特征
so that 利益

 

  As a标识出这个系统行为是为哪一个角色而定义的。

  I want和so that则指明了该角色想做的事, 以及想达到的目的。

  这三个断句定义了这个系统行为的参与者、范围。

  同样的一个Story,可能会有不同的场景。通过上面的模板描述了故事之后,再通过下面的模板对不同场景进行描述

  Scenario:

Given [上下文]
And [更多的上下文]
When [事件]
Then [结果]
And [其他结果]

 

  这些场景中的Given…When…Then…实际上就是设定该场景的状态、适用的事件,以及场景的执行结果。

  其实通过这样的Story描述和场景设置,基本就完成了一个完整测试的定义。

  BDD整个测试流程如图所示:

常见的BDD框架:

  • C – Cspec
  • C++ – CppSpec, Spec-CPP
  • .Net – NBehave, NSpecify, SpecFlow
  • Groovy – GSpec, easyb, Cuke4Duke
  • PHP – PHPSpec
  • Python – Specipy
  • Ruby – RSpec, Shoulda, Cucumber

与Java相关的BDD测试工具:

  • JBehave – Java annotations based, Test frameworks agnostic
  • Cuke4duke – Cucumber support for JVM
  • JDave – RSpec (Ruby) inspired, Mojo 2 & Hamcrest based
  • beanSpec – Java based
  • easyb – Java based, Specifications written in Groovy
  • instinct – BDD framework for Java, providing annotations for contexts. Inspired by Rspec
  • BDoc - Extracts behaviour from unit tests

友情赞助

如果你觉得博主的文章对你那么一点小帮助,恰巧你又有想打赏博主的小冲动,那么事不宜迟,赶紧扫一扫,小额地赞助下,攒个奶粉钱,也是让博主有动力继续努力,写出更好的文章^^。

    1. 支付宝                          2. 微信

                      

开发人员看测试之TDD和BDD的更多相关文章

  1. 开发人员看测试之细说JBehave

    上篇我们说到如何从Github上clone出一个JBehave项目,既是为了学习JBehava,也是为了熟悉下Github.从clone下来的项目看来,基本没什么问题,稍微捋一捋就可以运行,但是就cl ...

  2. 开发人员看测试之运行Github中的JBehave项目

    本文要阐述的主要有两点,一是介绍自动化测试框架JBehave,二是介绍如何在Github上拉项目,编译成myeclipse环境中的项目,并最终导入Myeclipse中运行. JBehave是何物? J ...

  3. 写给Android App开发人员看的Android底层知识(1)

    这个系列的文章一共8篇,我酝酿了很多年,参考了很多资源,查看了很多源码,直到今天把它写出来,也是战战兢兢,生怕什么地方写错了,贻笑大方. (一)引言 早在我还是Android菜鸟的时候,有很多技术我都 ...

  4. 写给Android App开发人员看的Android底层知识(2)

    (五)AMS 如果站在四大组件的角度来看,AMS就是Binder中的Server. AMS全称是ActivityManagerService,看字面意思是管理Activity的,但其实四大组件都归它管 ...

  5. 写给Android App开发人员看的Android底层知识(3)

    (七)App启动流程第2篇 书接上文,App启动一共有七个阶段,上篇文章篇幅所限,我们只看了第一阶段,接下来讲剩余的六个阶段,仍然是拿斗鱼App举例子. 简单回顾一下第一阶段的流程,就是Launche ...

  6. 写给Android App开发人员看的Android底层知识(5)

    (十)Service Service有两套流程,一套是启动流程,另一套是绑定流程.我们做App开发的同学都应该知道. 1)在新进程启动Service 我们先看Service启动过程,假设要启动的Ser ...

  7. 写给Android App开发人员看的Android底层知识(6)

    (十一)BroadcastReceiver BroadcastReceiver,也就是广播,简称Receiver. 很多App开发人员表示,从来没用过Receiver.其实吧,对于音乐播放类App,用 ...

  8. 写给Android App开发人员看的Android底层知识(7)

    (十二)ContentProvider (1)ContentProvider是什么? ContentProvider,简称CP. 做App开发的同学,尤其是电商类App,对CP并不熟悉,对这个概念的最 ...

  9. 写给Web开发人员看的Nginx介绍

    译者注:不知道其他开发者是否和我一样,参与或者写了很多Web项目,但是却没有真正的去完整的部署应用,很多时候都是交给ops即运维的同学帮忙来做.而作为一个有节操的开发者,我认为了解一些服务器方面的知识 ...

随机推荐

  1. 《利用Python进行数据分析》第5章学习笔记

    pandas入门 数据结构 Series Series是一种类似于一维数组的对象,它由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成.仅由一组数据即可产生最简单的Serie ...

  2. alert的换行问题

    一种比较复杂的方法,但这种方法使用起来对所有型号的浏览器都能任意分辨: //浏览器类型判定 function getOs() { if(navigator.userAgent.indexOf(&quo ...

  3. NativeScript 也能开发桌面应用 (nativescript-dotnet-runtime)

    自从看了NativeScript就甚是喜欢,心想要是也能开发桌面应用该多好.求人不如求己,开源组件很强大,差不多组装一下就行了,说干就干. Javascript 引擎用 Jint , 纯C#实现,集成 ...

  4. 团队项目——站立会议DAY10

    第十次站立会议记录: 参会人员:张靖颜,钟灵毓秀,何玥,赵莹,王梓萱 项目进展: 1.张靖颜:进一步完善程序代码,提出扩展性的建议,增加程序的功能. 2.钟灵毓秀:修改已完成代码出现的bug,完善代码 ...

  5. [.net 面向对象编程基础] (21) 委托

    [.net 面向对象编程基础] (20)  委托 上节在讲到LINQ的匿名方法中说到了委托,不过比较简单,没了解清楚没关系,这节中会详细说明委托. 1. 什么是委托? 学习委托,我想说,学会了就感觉简 ...

  6. jQuery基础之选择器

    摘自:http://www.cnblogs.com/webmoon/p/3169360.html jQuery基础之选择器 选择器是jQuery的根基,在jQuery中,对事件处理.遍历DOM和Aja ...

  7. linux奇技淫巧

    用着用着就发现,linux的每个命令都是那么的深奥而富有技巧,实用而淫荡..真可谓奇技淫巧.... 初学的真不易掌握... http://www.cnblogs.com/include/archive ...

  8. String的length()和Array的length

    String是个final修饰的最终类,不能被继承,String中属性都设置为private,方法为public,并不提供set方法,想要获得字符串的长度必须调用length()方法这个长度是确定的, ...

  9. Java中main()的args的知识点浅谈

    我们先来了解下Java中main()方法的默认定义格式: public static void main(String[] args){ }1.main方法是程序执行的入口,除了args这个形参变量可 ...

  10. 从零开始用gulp

    gulp是基于流的前端构件化工具.目前比较火的前端构建化工具还是挺多的,grunt gulp fis3等等. 这个鬼东西有什么用?请参考https://www.zhihu.com/question/3 ...