首次尝试测试驱动开发的体会

测试驱动开发的定义

  测试驱动开发(Test-driven development)是现代计算机软件开发方法的一种。利用测试来驱动软件程序的设计和实现。测试驱动开始流行于20世纪90年代。测试驱动开发是极限编程中倡导的程序开发方法,方法主要是先写测试程序,然后再编码使其通过测试。测试驱动开发的目的是取得快速反馈并使用“illustrate the main line”方法来构建程序。

  测试驱动开发的比喻。开发可以从两个方面去看待:实现的功能和质量。测试驱动开发更像两顶帽子思考法的开发方式,先戴上实现功能的帽子,在测试的辅助下,快速实现正确的功能;再戴上重构的帽子,在测试的保护下,通过去除冗余和重复的代码,提高代码重用性,实现对质量的改进。可见测试在测试驱动开发中确实属于核心地位,贯穿了开发的始终。

  最近在学习《重构》,里面强调,实施重构的一个前提是,必须建立一个可靠的测试环境。里面还提到了测试驱动开发,以及测试驱动开发的好处。正好最近在开发一个小的项目,所以便在这个项目中尝试了一下测试驱动开发,感觉不错,这里分享一下我的体会。

  我开发使用的是C++,我使用的测试框架是Google的c++开源测试框架gtest。另外Google也有一个mock的开源框架gmock,可以和gtest一起使用。至于gtest的使用,可以参照我以前转载的一个系列文章:玩转Google单元测试框架gtest系列

  首先谈一下测试框架gtest。总体感觉gtest使用起来还算比较方便的,而且他们能够自动运行所有的测试用例,这一点非常重要。在《玩转Google单元测试框架gtest系列》这个系列的文章中,没有看到测试框架对private方法测试的描述。后来我看了一下官方网站的说明,它是支持的。另外,这个测试框架的一个不好的地方就是,它主要是通过检查函数返回值来判断测试成功或失败的,对于返回值为void的方法,要判断执行成功与失败,则非常的不方便,有的时候,根本无法判断。不过从总体上来看,这个测试框架还是比较不错的。

  其次那,谈一下测试驱动开发带来的好处。

  1、提高软件质量。毋容置疑,有单元测试保障的软件产品质量肯定要比没有经过单元测试的软件产品质量要好。

  2、开发速度。测试驱动开发主张在编码之前首先编写测试代码,这种做法会降低编码的速度。但是在整个软件开发过程中,编码所占用的时间是很少的,我们大部分的时间在调试,定位bug,修改bug。测试驱动对开发速度的提升在于,它可以减少后者的时间,从而在整体上提升开发速度。

  3、重构。构建一个可靠的测试环境,可以让我们大胆的进行重构,而不用担心会引入潜伏下来的bug。

  4、增量开发。使用测试驱动开发,我们可以实现软件产品的增量开发,而不用担心增量开发会对原有的功能造成破坏。

  5、促进优良的设计:低耦合,高内聚。测试驱动开发一个非常重要的好处就是它可以促进优良的设计。糟糕的设计,一般情况会非常难以进行测试。测试驱动有助于促进低耦合,高内聚的设计,因为这样的设计才会易于测试。

  6、真正实现面向接口编程。

  7、避免过度设计。当你构建好测试用例后,也就提供了一个完成设计的目标:让所有的测试用例测试通过。这样可以避免过度设计。

  虽然测试驱动开发有这么多的好处,但是要在研发人员的推行这个开发方式,面临的挑战还是非常大的,毕竟它带来的是一种全新的开发思路和模式。不过我相信,只要开发人员乐于去尝试这种开发方式,他一定会喜欢上它的。

本文出自seven的测试人生公众号最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-09-27 12:04:57

首次尝试测试驱动开发的体会的相关文章

在C和C++开发过程中应用测试驱动开发的理念

测试驱动开发和现在流行敏捷开发的是分不开的,测试驱动开发是敏捷开发的一个强有力工具,可以帮助我们从简单的设计开始,逐步地有保护重构设计直至完善设计过程.测试驱动开发是 Kent 提出的一种新的软件开发流程,现在已广为人知,这种开发方法依赖于极短重复的开发周期,面对开发需求,http://www.aliyun.com/zixun/aggregation/7155.html">开发人员要先开发代码测试用例,这些代码实现的测试用例定义了工程要实现的需求, 然后去开发代码快速测试通过这这些用例,这

Android测试驱动开发实践1

在正式进行Android测试驱动开发之前,不得不先提一下Android应用架构问题.在传统软件开发中,MVC架构得到了广泛的应用,然而在Android开发中,很少见应用采用了MVC架构(不要说Android及Widget全部采用的是MVC架构,那是系统的事,我们讲的是应用程序开发),究其原因可能是初期Android应用大多较为简单,没有采用的必要,而后期一直在沿用初期的习惯.但是遇到一些复杂的应用,例如同样的数据在多个Activity中显示,如果数据分散在多个Activity中,那么数据发生更新

《重构与模式(修订版)》—第1章1.4节测试驱动开发和持续重构

1.4 测试驱动开发和持续重构 重构与模式(修订版) 测试驱动开发[Beck, TDD]和持续重构,是极限编程诸多优秀实践中的两个,它们彻底改进了我开发软件的方式.我发现,这两个实践能够帮助我和公司降低过度设计和设计不足的几率,将时间用在按时地构造出高质量.功能丰富的代码上. 通过测试驱动开发(TDD)和持续重构,我们将编程变成一种对话1,从而高效地使可以工作的代码不断演变. 问:编写一个测试,向系统提问. 答:编写代码通过这个测试,回答这一提问. 提炼:通过合并概念.去芜存菁.消除歧义,提炼你

详尽讲述用Python的Django框架测试驱动开发的教程_python

测试驱动开发(TDD)是一个迭代的开发周期,强调编写实际代码之前编写自动化测试. 这个过程很简单:     先编写测试.     查看测试失败的地方     编写足够的代码以使测试通过.     再次测试.     代码重构 .     重复以上操作. 为什么要用TDD? 使用TDD,你将学会把你的代码拆分成符合逻辑的,简单易懂的片段,这有助于确保代码的正确性. 这一点非常重要,因为做到下面这些事情是非常困难的:     在我们的脑中一次性处理所有复杂的问题.     了解何时从哪里开始着手解决

用NUnit2.1简单实现.net的测试驱动开发(TDD)

用NUnit2.1简单实现.net的测试驱动开发(TDD)下面的例子很简单,就是实现两个整数的四则运算,TDD提倡测试优先,即先写测试用例,再写运行代码,刚下了个NUnit2.1,迫不及待的试了试--1最初的测试用例using System;using NUnit.Framework;namespace netshop{ /// <summary> /// 四则运算TestCls测试用例 /// Edit by spgoal /// </summary> [TestFixture]

网络相册开发(3)——测试驱动开发(TDD)

测试驱动开发的理论已经提出好多年了,在这里关于他的原理和优势我就不多说了,我将大略的写一下我在实际中运用TDD的过程. 补一个jar: commons-pool-1.4.jar 过程 1.搭建测试用例运行环境 2.编写接口类 3.针对接口类编写测试用例 4.实现接口类,编写对应的功能代码 5.运行测试 6.如不通过,修改直至通过 7.循环完成其他功能 搭建测试用例运行环境 spring采用的依赖注射技术带来的一个主要好处就是你的代码对容器的依赖性比传统的J2EE开发小得多.配合spring提供的

测试驱动开发实践之重构篇

前一篇文章 测试驱动开发实践-入门篇 我们我们讲了一些基本的测试驱动开发流程: 1.写单元测试使他亮红灯 2.写代码使测试变成绿灯 3.重构代码 接下来我们需要开始重构了,大家有可能会问,为什么需要重构,什么时候开始重构. 对与为什么需要重构,其实就是为了使代码结构清晰,去除一些重复的代码,比如我们执行sql语句操作,我们起初这样写 Code 1private connStr="server=.;database=TestDB;uid=sa;pwd=123" 2public int A

Android测试驱动开发实践2

在实际项目开发过程中,一般先实现核心功能,最后再做辅助性功能,这样可以尽快验证Idea的正确性,同时有助于让老板.投资人或客户看到可运行的产品,从而对产品充满信心,加大对项目的支持. 但是对于我们这个项目而言,我们首先需要得到一个Android应用MVC的架构体系,因此我们首先来实现一些典型功能,但是可以完整体现MVC架构的功能.在此我们选择任何应用程序在启动时都会显示的Splash页面,通常这个页面会显示一个应用图片,过30秒左右再显示程序的主界面,应用在这段时间完成数据加载等准备工作. 在这

Android测试驱动开发实践

在Android应用开发中,相信很少有人在坚持先由设计人员做完整的概要设计 .详细设计,然后交给程序员进行编码实现了.通常是在有一个大体框架的情况下,就开始进行具体编码开发了.在这种情形下,开发速度可以有很大的提高,但是最终代码质量却不可避免的降低了.如何能既保持开发速度,同时又能保证开发质量呢?相信测试驱动开发是一种比较可行的开发方法学. 测试驱动开发首先通过设计测试用例,对从用户需求到方法接口进行细化,在构想这些测试用例的过程,就是站在使用者角度上来思考系统的过程,而传统方法中设计人员通常是