文档章节

TDD问答录

开源中国驻成都办事处
 开源中国驻成都办事处
发布于 2014/01/22 22:09
字数 2046
阅读 44
收藏 0
点赞 0
评论 0

最近被要求强制使用TDD。这里总结下个人的认识。

为什么需要UT测试?

为什么需要测试就不用回答了。为什么选中UT来做TDD呢?第一点是测试的代价。在嵌入式、分布式环境中进行测试的成本(时间成本、资源成本、人力成本等)非常高,而UT的成本相比而言很低。第二点是可用性。直接验证的是实现,非常底层。更加容易定位问题的根源。所在的层次越高,组合膨胀越大。测试就可能存在死角。而且使用UT一般都是非常便捷的,不需要设备,不需要去搭建复杂的环境。第三点是根源问题。我们测试的是自己编写的CODE,UT是对CODE最直接验证形式。

UT测试有哪些实用性?

1. 测试是对预期行为研究的过程。我们可能对解决的问题有了一个大概的认识,但真正固化到代码的时候有许多细节需要考虑。UT测试帮助我们逐步理解问题,并且指导、辅助设计。在设计的过程中引入测试思维,我们就会去考虑类是否去有强内聚性,耦合是否恰当,因为差的设计会让测试也变得很差。

2. 为重构提供安全网。

其实不仅仅是重构了,为维护Bug Fix同样提供安全网。

TDD有两个循环,第一个是CASE FAIL -> CODE -> CASE PASS,这个循环在于实现一个又一个的新的功能。另一个循环:CASE PASS -> REFACTORING -> CASE PASS。这个循环的作用在于改善代码的结构,是从内部质量出发,考虑维护性、扩展性的举措。其实还有一个隐含的循环,对于同一个CASE我们还是会继续前面的第一个循环。因为抛弃这一隐含循环的TDD只是一个理想,写出完备的CASE也是根本做不到的。CASE的完备的过程同样需要CODE完备的过程,两者相辅相成。

第一个循环应该是可部署的。循环的成果应该组织为测试套件,进而提供自动化测试。

另一方面,UT的开发其实也是集体智慧的固化。它让CODE的最初编写者为后续者提供了一道安全屏障,让其他人也能享用。这些其他人可能考虑问题没有那么全面,知识不那么完备。这是TDD遗留下来的最重要的宝贝。

3. UT测试是一种文档。

UT测试是对使用场景的描述性文档。

UT测试是对如何使用代码的最好范例

4. 减少调试时间。

因为UT的使用会让自己更加了解自己的设计,更加熟悉自己的代码。非常容易找到问题的根源。对于修复缺陷和避免缺陷都有很好的效果。

5. UT使开发过程更加可预测

这点还是得益于对设计和代码的掌控程度。因为代码质量和个人知识有了好的提升,对管理层来说开发就更加透明。

TDD为什么指导的是UT?

广义上讲,我们一直都在TDD。写代码,测试,调试,再写,重复的过程就是TDD。桌面编程可以非常方便不停重复这一过程。然后,随着程序规模的扩大,领域不同的限制,各种外部因素决定了我们不能非常便捷的进行测试。而UT给我们来一个方向。UT除去了很多运行环境因素的限制,比如硬件条件、网络条件等。因为无论在哪,UT肯定都是运行在你熟悉的平台,绝大多数都是Windows。

UT非常容易做CI。因为自动化UT成本很低。相比自动化IT而言,成本极其低廉。

我没有代码,写测试测什么呢?

这是一个鸡生蛋蛋生鸡的问题。

直觉是,有了代码才能去测。这种思维认为测试是一种验证,而不是表达意图。反之,TDD其实是一种意图导向的方法。我们应该抛弃传统的测试验证思维,通过测试来表现意图,从而来看我们的意图是否达到。

还有一个经典的事实:问题可能比答案更为复杂(对我们来说最直观的反应是,测试代码往往比实际代码多)。举个例子,e=Σ1/n!。如果给你后面的级数,你来计算。这个问题可能不是那么简单,还有派啦。正是存在很多问题复杂但答案简单的问题,我们才需要去深入研究问题。测试促使我们检查对问题的理解。

UT和集成测试应该如何分配?

这个平衡需要自己把握。充分的UT能够保证函数、类实现的质量。但对于交互的考虑非常少。集成测试的进行,依赖于Mock对象,而且随着集成测试的边界不同,组合出来的测试数量也非常惊人。它们之间的平衡的把握应该根据具体的环境来决定。

其他的一些观点:

如果测试的考虑是周全的,代码也会是完整的,避免了冗余和浪费。测试覆盖率也会很好。

TDD是作用于个体的软件方法,不可作用于团队。代码最终肯定会出自一个人只手,可能还会有其他一两个人的思想在里面,但真正写来下,CHECK IN,应该只有一个人。从这点上讲,TDD作用于个体。

测试代码与产品代码都是同一语言。

TDD可以带来编写代码的心理满足感。一般情况下有副漫画很好的描述了程序员的心理:不明白为什么不过?不明白为什么过了?一直都在疑惑恐惧外加一丝丝兴奋的状态下(大家去找这幅画吧)。TDD的情况:Fail -> PASS。成就感和兴奋明显要多于疑惑和恐惧。从长期的生理角度看,TDD也还是不错。

xUnit,其实可以做一个主题来讲了。针对不同的语言,都有一个xUint。Java、C、C++、C#、Python等等都有。已经成为了UT测试的代名词了。很多讲解TDD的都会使用JUnit。Java的反射、标注提供了很好的机制。

Mock框架可以帮助我们减轻创建Mock的无聊枯燥的工作。

TDD与模式:模式趋向于增加委托来清晰化对象结构,但委托的增加会使测试变得困难。Mock Object可以解决这一问题。

最后讲个笑话:乌龟的下面

一个科学家举行了一个天文学的公开演讲,主要讲地球如何围绕太阳转,太阳如何围绕银河系中心转。研究结束后,一个老太太站起来说:“你刚才说的都是废话,世界其实是由一个乌龟的后背所支撑的一个平板。”

“那这只乌龟站在什么上面呢?”

“你是一个非常聪明的年轻人,乌龟站在乌龟上,一直向下......”

© 著作权归作者所有

共有 人打赏支持
开源中国驻成都办事处
粉丝 84
博文 287
码字总数 335913
作品 0
成都
程序员
docker-4-Dockerfile配置文件详解

dockerfile官方文档 注意:一行注释一行目录,不要乱注释,否则可能出现命令无效的情况,详情看dockerfile官方文档 文中加粗的是常用命令,一个命令可能有多种格式,注意!!> # escape= 指定...

yr_linux运维
2017/12/28
0
0
docker-1-docker-起手式-安装docker-ce

注:本文主要参考官方文档(https://docs.docker.com/engine/installation/)、docker问答录(https://blog.lab99.org/post/docker-2016-07-14-faq.html)而来,本人刚开始接触docker,再加上英语...

yr_linux运维
2017/12/28
0
0
Android答录机功能的编程实现

最近在做毕业设计,基于android平台, 现在想为软件增添一个自动答录的功能,希望大家提供相关的学习内容和示例代码。 具体需求是:打电话打进来,如果在设定的秒数内给来电没有被接听,那么...

万万没想到
2015/03/24
459
1
程序员不想让你知道的 5 件事,你知道吗?

并不是所有程序员都能尽职尽责地为你提供服务,当他们吐槽说开发过程中遇到了问题时,你就要学会自己辨识:他们说的问题真的是问题吗? 1、瀑布模型开发挂了 有些程序员是不会让你知道瀑布开...

达尔文
2016/12/28
3.8K
23
“你这不是测试驱动开发”

本文是从 “That’s Not TDD” 这篇文章翻译而来。 几个月前,我去一个客户那里,他们在使用测试驱动开发上遇到了很多问题。 “我们的单元测试用例要半个小时才能跑完,”他说。 “你们这不是...

红薯
2011/08/25
1K
7
单元测试要做多细

这篇文章主要来源是StackOverflow上的一个回答——“How deep are your unit tests?”。一个有13.8K的分的人(John Nolan)问了个关于TDD的问题,这个问题并不新鲜,最亮的是这个问题的Best ...

zhangyujsj
2015/09/06
4
0
软件开发中没有所谓正确的方法

驱动测试开发(TDD)是唯一能让你写出没有bug的程序的方法。只有结对编程是可行的。我们之所以成功就是因为我们使用的是远程开发人员。等等等等…… 像这样的话每天我都能看见。 像这样的风言风...

oschina
2013/05/09
2.5K
17
“单元测试要做多细?”

原文出处:酷壳 - CoolShell.cn 作者:陈皓 这篇文章主要来源是StackOverflow上的一个回答——“How deep are your unit tests?”。一个有13.8K的分的人(John Nolan)问了个关于TDD的问题,...

oschina
2012/09/03
2.5K
11
不要宗教化TDD(测试驱动开发)

敏捷编程的概念出来已经很久了,期间涌现出了很多名词,什么XP啊,Scrum啊,被很多人所推崇。 我想说的是TDD这个东西,也是被很多人认为是保证软件质量的法宝,一旦选择了TDD方式,就自动的获...

cnn237111
06/26
0
0
不重视 TDD 与 Code Review 的代价

近些年来,越来越多的人开始向我咨询测试驱动开发(TDD)的好处。所谓 TDD,就是在将代码进行部署之前,利用各种自动化测试来确保代码能够正常工作。在进行测试的时候,你需要寻找测试失败的...

局长
2016/12/21
3.6K
17

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式 Factory工厂模式 Singleton单例模式 Delegate委派模式 Strategy策略模式 Prototype原型模式 Template模板模式 Spring5 beans 接口实例化 代理Bean操作 ...

小致dad
13分钟前
0
0
SpringBoot | 第十章:Swagger2的集成和使用

前言 前一章节介绍了mybatisPlus的集成和简单使用,本章节开始接着上一章节的用户表,进行Swagger2的集成。现在都奉行前后端分离开发和微服务大行其道,分微服务及前后端分离后,前后端开发的...

oKong
今天
9
0
Python 最小二乘法 拟合 二次曲线

Python 二次拟合 随机生成数据,并且加上噪声干扰 构造需要拟合的函数形式,使用最小二乘法进行拟合 输出拟合后的参数 将拟合后的函数与原始数据绘图后进行对比 import numpy as npimport...

阿豪boy
今天
9
0
云拿 无人便利店

附近(上海市-航南路)开了家无人便利店.特意进去体验了一下.下面把自己看到的跟大家分享下. 经得现场工作人员同意后拍了几张照片.从外面看是这样.店门口的指导里强调:不要一次扫码多个人进入....

周翔
昨天
1
0
Java设计模式学习之工厂模式

在Java(或者叫做面向对象语言)的世界中,工厂模式被广泛应用于项目中,也许你并没有听说过,不过也许你已经在使用了。 简单来说,工厂模式的出现源于增加程序序的可扩展性,降低耦合度。之...

路小磊
昨天
202
1
npm profile 新功能介绍

转载地址 npm profile 新功能介绍 npm新版本新推来一个功能,npm profile,这个可以更改自己简介信息的命令,以后可以不用去登录网站来修改自己的简介了 具体的这个功能的支持大概是在6这个版...

durban
昨天
1
0
Serial2Ethernet Bi-redirection

Serial Tool Serial Tool is a utility for developing serial communications, custom protocols or device testing. You can set up bytes to send accordingly to your protocol and save......

zungyiu
昨天
1
0
python里求解物理学上的双弹簧质能系统

物理的模型如下: 在这个系统里有两个物体,它们的质量分别是m1和m2,被两个弹簧连接在一起,伸缩系统为k1和k2,左端固定。假定没有外力时,两个弹簧的长度为L1和L2。 由于两物体有重力,那么...

wangxuwei
昨天
0
0
apolloxlua 介绍

##项目介绍 apolloxlua 目前支持javascript到lua的翻译。可以在openresty和luajit里使用。这个工具分为两种模式, 一种是web模式,可以通过网页使用。另外一种是tool模式, 通常作为大规模翻...

钟元OSS
昨天
2
0
Mybatis入门

简介: 定义:Mybatis是一个支持普通SQL查询、存储过程和高级映射的持久层框架。 途径:MyBatis通过XML文件或者注解的形式配置映射,实现数据库查询。 特性:动态SQL语句。 文件结构:Mybat...

霍淇滨
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部