测试驱动开发与行为驱动开发中的测试先行方法
Gil Zilberfeld将在 Agile Practitioners会议上举办小型研讨会,讨论测试先行(test first)方法,测试驱动开发(TDD)和行为驱动开发(BDD)的基础。
\\\\\Test-First是一个很优秀的工具。它能促进团队内更好的理解力和生产力。其结果是高质量的代码——无论是早期成功发现 bug还是正确实现特性方面。
\
Agile Practitioners 2016会议将于1月26-27日在以色列特拉维夫举行,InfoQ将会覆盖本次会议的新闻,Q\u0026amp;As和文章。
\\\\\(……)今年我们的主题是亲身实践敏捷。我们知道没有老师能够传授亲身体验,因此我们举办了很多研讨会和实用讲座,会议参加者可以亲身体验、听到和看到敏捷活动是如何在许多成功企业内实施的。
\
InfoQ采访了 Zilberfeld,关于测试先行方法的优势,测试驱动开发和行为驱动开发概念,团队使用 BDD和 TDD的实例,以及如何在不编写任何代码的情况下探索 BDD和 TDD。
\\InfoQ:“测试先行”方法的优势是什么?
\\\\\Zilberfeld:测试驱动开发是从90年代末的极限编程从业者开始的。但事实上,人们在编写代码的数十年前已经开始编写测试了。
\\其理念是这样的:当程序员编写代码时,他们通常在代码中解决复杂问题。但是,这种方式常常使得结果同样复杂,并且含有远远超过实际需要解决的问题(假设重要的东西已经被编码)。
\\这意味着需要测试更多的代码。测试有时需要改变“已经工作”的代码,这会引入风险。最终导致要么根本没有进行测试,因为没有时间测试,或者是次优的测试,因为无法覆盖我们想要覆盖的范围。
\\测试先行定义了工作需求。因为我们有测试形式的定义,它定义了为了解决具体问题我们需要编写什么样的代码。仅仅通过运行测试就可以非常简单地知道我们是否有可工作的功能。
\\这种方式会扩大测试覆盖率,因为测试成为优先开发活动,而不会被迫推到最后。
\\另外,编写这些测试和制定场景的时候,我们会更深入地探索问题空间,因为会出现许多问题。而在事后测试(test after)中,有时不会发生这些讨论,开发人员以他们的思维编码,而不是以解决方案的需求编码。
\
InfoQ:你能简单介绍一下行为驱动开发(BDD)和测试驱动开发(TDD)的概念吗?
\\\\\Zilberfeld:在 TDD和 BDD中,你先将问题分解成多个情境,也就是例子。我们的头脑更容易专注小情境,而不善于解决大的、复杂的问题。
\\然后开始著名的红-绿-重构循环,就像这样:
\\
- 编写一个失败的情境。失败是因为编译或者因为代码不存在。无论如何,该测试是代码如何被外部模块使用的案例。 \\
- 努力让测试通过。重点是可工作的功能而不是形式,也就是编写最小的实现,让它通过测试。更进一步,它应该通过迄今为止我们编写的整个测试套件。 \\
- 改进代码。现在一切都是绿色的,使用测试安全网我们可以重写代码。如果我们破坏了什么,我们会立即知道。 \
将问题分解成更小的部分,然后以增量的形式开发需要的代码,并且在流程中加入急需的刹车。这有助于我们思考我们遗漏的情境,而不是“我们知道解决方案是什么样子”。
\\BDD开始于2000年代中期,更进一步地将 TDD推向产品空间。通过使用产品用途案例,我们可以仅仅开发情境所需的代码。我们可以专注对业务重要的情境。然后可以使用 TDD编写实际代码。
\\BDD最大的优势是沟通。如果你将“三个同伴”——业务分析师、开发人员和测试人员——集中到一个房间,讨论我们希望看到的行为案例,那么在编写代码之前,我们将会得到最好的提出和解决问题的观点。
\\而这就是 BDD——讨论商定的行为案例。这些案例可以写成自动化测试(但这不是要求),然后编码使测试通过,最后重构代码。
\\显然,BDD情境的详细程度比更精细的 TDD测试还要宽泛。尽管我发现在某些方面它们是相互关联的,但是在 TDD和 BDD情境中编写测试还是需要不同的技能。
\
InfoQ:你有与合作团队使用 BDD和 TDD的案例吗?
\\\\\Zilberfeld:在 BDD中,由谁编写情境是有区别的,但是我合作的大多数团队中,都是测试人员编写情境。这些案例的讨论通常在编写代码之前。测试人员和开发人员并行工作——测试人员专注高水平的自动化测试,开发人员专注代码和单元测试(测试优先与否)。一旦完成就会对情境进行评审。然后在某个时候对开发和测试进行集成,以确保测试通过。
\\BDD和 TDD在迭代中非常“敏捷”,这使得情境“完成”与否非常的明显。BDD情境要么“符合”迭代,要么就是故事过于冗长。
\\在实现上 TDD稍有不同。培训之后,开发人员会对等待他们的代码妥协。通常这些都是遗留代码,这与干净的测试先行代码不同。
\\我常开玩笑说 TDD中最后一个 D是纪律。因为它对测试先行的实现最重要。它与我们被教导的不同也更难,因此在看到价值之前我们需要团队的支持。这就是为什么大部分团队最终不做 TDD,勉强接受事后测试的缘故。
\\熬过困难的前期之后,开始清理自己的代码,添加更多的覆盖率。代码变得更加容易维护。并且从社会角度来看,新加入团队的开发人员会带着“这就是我们的工作方式”理念加入 TDD。这是一个正面的反馈循环。
\
InfoQ:你能给 InfoQ读者提前透露一下 Agile Practitioners会议上研讨会的内容吗?以及向参会者展示如何在不编写任何代码的情况下探索 BDD和 TDD?
\\\\\Zilberfeld:这次研讨会背后还有一个故事。几年前,我打算在比利时 Testing Days会议上举办“TDD a spaceship”研讨会(我打算三月在荷兰的 Agile Testing Days会议上举办)。它是为开发人员设计的,但是参与者都是测试人员,拥有极少的编码经验。因此研讨会变成解释测试先行的理念,并且是在没有实际编码的情况下。很自然地,我被吸引到星球大战的例子,我们交谈、做课堂笔记,并讨论了验收标准,以及如何知道故事已经完成。
\\那次研讨会之后,我考虑如何以一种经验的方式实现它。碰巧,我被介绍给GIF制作软件工具,突然之间我们有了能够帮助的工具。这是一个创建型工具,人们可以提前写电影“脚本”,构建并运行,并能够立即获得反馈。
\\很棒的是我们可以应用敏捷开发原则和经验。因为你所想象的电影样式跟实际结果总是会有出入,所以我们构建了一个新的版本。
\\另一个案例是处理遗留代码。其中一个练习是在电影中更换演员,但是因为电影已经编辑,因此我们只能在开头或者结尾添加场景。鉴于需求与代码不能分开考虑,如何更改需求与已经构建完成的代码之间的冲突这一理念就非常有启发性。
\
InfoQ:你同时还是agile practitioners会议的组织者之一,你能提前透露一下会议议程吗?
\\\\\Zilberfeld:这是我们第五年举办该会议,自创立以来无论是规模还是质量都得到了提升。它被列为以色列最好的敏捷会议是因为:
\\我们围绕“亲身实践”主题会议。我们将有全天的专题报告、小型研讨会,甚至演讲都具有实际用途。我们旨在让人们亲身体验,然后回归工作,开始实施他们学到的内容。
\\我们为不同类型的参与者准备了内容——Scrum Master,测试人员,开发人员,产品经理,团队领袖等任何你能够想到的。但是,该会议不仅仅是拓宽你的角色知识。它是以一种“亲身实践”的方式让你学习别人如何做的。
\
查看英文原文:Test First Approaches With Test Driven Development and Behavior Driven Development
相关文章:

在jupyter notebook中同时安装python2和python3
环境 win10 已安装anaconda3 How 1.安装python27> conda create -n py27 python2.72. conda install --prefixD:\pyenv\py27 ipykernel(python27 指定路径:D:\pyenv\py27)3. activate py27(查看 conda info --envs)4. python -m ipykernel install --user5.启动j…

简化代码的微小修改
可选参数和命名实参 可选参数如果操作需要多个值,而有些值在每次调用的时候又相同,这时可以使用可选参数声明可选参数并在调用时省略它们#region 13-1声明包含可选参数的方法并调用static void Dump(int x, int y 20, int z 30)//声明包含了可选参数的…

windows版本下使用xdebug
下载xdebug: http://www.xdebug.org/download.php 这个版本: http://www.xdebug.org/files/php_xdebug-2.2.0-5.3-vc9.dll拷贝到php的ext目录 配置php.ini extensionphp_xdebug-2.2.0-5.3-vc9.dll;xdebug.profiler_enable1;xdebug.profiler_output_dir"E:\PHPn…

LeetCode刷题-2
数组-26.删除有序数组中的重复项题目描述题目样例Java方法:双指针思路及算法代码执行结果复杂度题目描述 给你一个有序数组 nums ,请你原地删除重复出现的元素,使每个元素只出现一次 ,返回删除后数组的新长度。不要使用额外的数组…

[设计模式]外观模式
1. 定义 外观模式 提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更加容易使用。 外观不仅简化了系统内接口的使用,也将客户从组件中的子系统中解耦,外观和适配器都可以包装很多类࿰…

Oralce中的to_date()函数
Oralce中的to_date()函数to_date( ".$params[ORDER_TIME].",YYYY-MM-DD) TO_DATE(:BEGIN_DATE,yyyy-mm-dd hh24:mi:ss)Oralce中的to_date()函数用于将字符串转换为日期对象,具体使用格式为:to_date( string, [ format_mask ] , [ nls_lan…

LeetCode刷题-3
数组-27. 移除元素题目描述题目样例Java方法:双指针思路及算法代码执行结果复杂度Java方法:双指针优化思路及算法代码执行结果复杂度题目描述 给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,并返回移除…

Ubuntu下ssh免password登录安装
1、首先在本机安装openssh-server和openssh-client. 命令:sudo apt-get install openssh-server openssh-client 2、在检查当前的文件夹下有没有.ssh这个文件。没有的话就mkdir下。 3、生成公钥与私钥。命令:ssh-keygen -t rsa 4、将.ssh文件里的id_isa_…

npm中package-lock.json的作用:npm install安装时使用
简单理解: XYZ 的格式 对应为: 主版本号.次版本号.修订号,版本号递增规则如下: 主版本号:当你做了不兼容的 API 修改, 次版本号:当你做了向下兼容的功能性新增, 修订号:当你做了向下兼容的问题修…

win7中Android开发环境搭建超详细(百度)
Android系统如火如荼,Android软件开发也相当流行,这里介绍如何一步步完成Android软件开发环境的搭建。 工具/原料 能联网的计算机Java环境搭建 1Android软建开发用的是Java语言,所以第一步当然要完成Java环境的搭建, Java环境搭建…

LeetCode刷题-4
数组-35. 搜索插入位置题目描述题目样例Java方法:二分查找思路及算法代码执行结果复杂度题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请…

Jquery和PHP Ajax JSON
无缓存,无错版$.ajax({ type: "GET", url: "index.php", cache: false, data: "conAdd&act_search&key" key"&id"id, dataType:"json", success: function(msg){ bindGroupList(msg)…

Web应用配置虚拟主机(www.baidu.com)
最终效果:浏览器地址栏输入www.baidu.com访问时,会显示自己的网页 1、创建文件 任意盘新建一个www.baidu.com文件,在该文件夹下新建WEB-INF文件、自己写的一个html文件,一张图片,然后在WEB-INF下新建一个classes文件、lib文件以及一个web.xml文件,在web.xml文件中输…

LeetCode刷题-5
数组-66. 加一题目描述题目样例Java方法:找出最长的后缀 9思路及算法代码执行结果复杂度题目描述 给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。 你可以假…

LeetCode 125 Valid Palindrome(有效回文)(*)
版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/50623165 翻译 给定一个字符串,确定它是否是回文的,仅仅考虑其中的数字和字符并忽…

Ubuntu命令终端查看使用过的命令
使用history命令cyfubuntu:~$ history但是这样会显示出所有使用过的命令,可以在history后加上lesscyfubuntu:~$ history | less会显示出类似vim编辑器的形式,再使用类vim中的操作,查找使用过的命令:/sed //查找使用过的sed相关的命令也可以直…

对象名和函数名同名引起的莫名错误
<html><head><script type"text/javascript">var Validator function(){alert("w")}//第一步校验function validator(){validator new Validator();return true;} function aa(){if(validator()false){alert("FF")}else{al…

【FE前端学习】第二阶段任务-基础
技能学习部分: 1.需要熟练掌握HTML标签以及CSS各个常用属性。 2.掌握CSS3 常用属性 3.掌握jquery的基本用法,对于JS基本逻辑语句需要熟练掌握 上文 【FE前端学习】第二阶段任务-提高 一、HTML标签 HTML是一种标记语言,标记语言是一套标记标签…

LeetCode刷题-6
数组-88. 合并两个有序数组题目描述题目样例Java方法:直接合并后排序思路及算法代码执行结果复杂度Java方法:双指针思路及算法代码执行结果复杂度Java方法:逆向双指针思路及算法代码执行结果复杂度题目描述 给你两个按非递减顺序排列的整数数…

Bootstrap 模态框上下居中
在bootstrap.js里面找到Modal.prototype.adjustDialog在里面添加: // 是弹出框居中。。。var $modal_dialog $(this.$element[0]).find(.modal-dialog);var m_top ($(window).height() - $modal_dialog.height()) / 2;$modal_dialog.css({ margin: m_top px auto…

Oracle自增列创建方法
最近在做Oracle的项目,由于以前没有接触过Oracle的开发,遇到了不少的问题,比如给Oracle表添加自增列,与SQL Server就不同。Oracle没有自增字段这样的功能,但是通过触发器(trigger)和序列(sequence)可以实现。 先建一个…

LeetCode刷题-7
数组-108. 将有序数组转换为二叉搜索树题目描述题目样例前言Java方法:中序遍历,总是选择中间位置左边的数字作为根节点思路及算法代码复杂度Java方法:中序遍历,总是选择中间位置右边的数字作为根节点思路及算法代码复杂度Java方法…

PS 拉伸大长腿
1.打开一个图片工具栏--图像--画布大小 2.选择矩形选框工具--框住要拉升退的位置--然后在按CtrlT,进行拉伸即可 转载于:https://www.cnblogs.com/dengqing9393/p/9481647.html

LeetCode刷题-8
数组-118. 杨辉三角题目描述题目样例Java方法:数学思路及算法代码复杂度题目描述 给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 题目样例 示例1: 输入…

php导出excel格式数据
解决2个问题: 1.身份证之类的文本数据自动转为科学计数法的问题。 2.中文乱码的问题 excel从web页面上导出的原理。当我们把这些数据发送到客户端时,我们想让客户端程序(浏览器)以excel的格式读取 它,所以把mime类型设…

[BZOJ2796][Poi2012]Fibonacci Representation
由于是斐波那契数列,所以$x_ix_j<x_k,i<j<k$ 所以猜测可以贪心选择两边近的数处理。 1 #include<cstdio>2 #include<algorithm>3 #define ll long long4 #define mid (lr>>1)5 using namespace std;6 ll f[505],tot1;7 inline ll findl(…

AppStore审核2.1被拒大礼包过审经历
本团队的iOS端迭代至今,经历过AppStore审核的数次调整,包括审核时长、严厉程度等,尝过各种花式的拒绝理由,但从没有像2018年初这次来得猛烈和漫长。从首次提交到最后过审几乎花费一个月的时间,下面的文字记录了整个过程…

oracle 小数点前零丢失的问题
1.问题起源 oracle 数据库字段值为小于1的小数时,使用char类型处理,会丢失小数点前面的0 例如0.35就变成了.352.解决办法:用to_char函数格式化数字显示 select to_char(0.338,fm9999999990.00) from dual; 结果:0.34 这里重点…

SQLServer查看存储过程的方法
使用 sp_helptext 查看存储过程的定义 在对象资源管理器中,连接到 数据库引擎实例,再展开该实例。在工具栏上,单击“新建查询”。在查询窗口中,输入下列语句。更改数据库名称和存储过程名称以引用所需的数据库和存储过程。USE yca…

数据文件u11
数组-136. 只出现一次的数字题目描述题目样例Java方法:位运算算法思路代码复杂度题目描述 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 题目样例 示例1: 输入: […