从测试角度对测试驱动开发的思考【转】

测试驱动开发(TDD)是极限编程的重要特点,它以不断的测试推动代码的开发,既简化了代码,又保证了软件质量。本文主要从测试角度出发,从需求分解等四个阶段阐述了测试人员在测试驱动开发中所发挥的促进作用

大家都知道,软件生命周期一般分为六个阶段:制定计划、需求分析、设计、编码、测试、运行和维护。在软件工程中,这个复杂的过程用软件开发模型来描述和表示,常见的软件开发模型有:瀑布模型、螺旋模型、V模型、W模型等。而这些传统的开发模型都以开发为主,测试常常扮演的是一个亡羊补牢的配角,这类开发模型已渐渐的不能满足现在项目组的需要。从而诞生了比较实用的、高效的、以测试为中心的软件过程开发方法—测试驱动开发(TDD)。

测试驱动开发,其基本思路就是通过测试来推动整个开发过程。在整个软件开发流程中,让测试先行,如将测试方案设计工作提前、将编写一小段的测试代码或产品代码提前、同时将测试方案当作开发行为的准绳,然后在软件后续的开发过程中实时进行验证,最终实现软件开发过程的“小步快走”。

且看下面两个泥瓦匠的工作方法:

  工匠1:先拉上一根水平线,砌每一块砖时,都与这根水平线进行比较,使得每一块砖都保持水平;

  工匠2:先将一排砖都砌完,然后拉上一根水平线,看看哪些砖有问题,再进行调整。

作为旁观者,你肯定也会觉得工匠1的方法要科学一些,的确如此。在软件项目中,在“砌砖”时以“水平线”为标准,是不是会降低开发与需求理解的偏差、降低开发过程中的缺陷率、并还会提高bug定位速度呢?答案当然是肯定的。

在软件整个过程中融入测试驱动开发,那到底从哪些阶段去驱动呢,从测试角度来看,我个人认为可以从需求分解、单元测试、集成测试、系统测试四个阶段来进行。

一、需求分解阶段

需求是软件开发的源头,无论是新开发项目还是持续迭代更新的项目,开发人员在开发功能和测试人员在进行测试的时候,都需要最先确定需求。

在需求发布到需求分析、需求理解及需求确认这一过程中,往往会出现以下现象:

(1)需求经常变更,在正在开发过程中突然需求又变了;

(2)需求理解偏差,开发或测试对需求理解的角度不同,会出现各种理解偏差;

(3)需求描述模糊或过于简单,开发人员和测试人员会分别花费较多时间去找产品人员确认需求;

(4)测试人员往往对需求的理解只停留在用户的角度,未深入从代码的角度去

思考,如该功能包含的边界范围、接口、异常情况、对其他函数或类的影响等等;

试想,如果能尽可能的避免上述现象的发生,那不就打响了测试驱动开发的“第一炮”了么?我认为从以下几个方面来进行,或许有些效果:

(1)测试人员、开发人员和产品共同参与需求的评审、更改、确认;

(2)测试人员对较大的需求(非简单的页面展示)进行分解成一个个小的功能点,编写成一个个小的产品代码(即所谓的测试用例),从而避免因为需求理解不一致导致偏差的问题;

(3)明确需求后,先预估本次需求对系统其他功能有没有附作用,把风险降到最低;

二、单元测试阶段

测试驱动开发的基本思想就是在开发功能代码之前,先编写测试代码。这是一个非常精典的理论,但是在实际项目过程中,这样实现可能会有一定的难度。既然有难度,那你还写这篇文章干嘛?请不要这样问我,我会很无奈,因为我只是一个菜鸟,菜鸟所理解的测试驱动开发肯定不能和专家的观点相提并论。

在此,我们还是先来回顾下软件开发模型中的W模型:

由图可以看出,W模型的主要特点是测试伴随着整个开发的生命周期,但其缺点就是把软件的开发视为需求、设计、编码等一系列串行的活动,无法支持迭代、自发性以及变更调整。

这种自上而下的只适合那种比较稳定、需求变更较少的大型项目(如军工项目、第三方测试机构测试项目),而不适用于需求变更频繁、迭代较快的航空B2C项目,以海航B2C项目为例,产品人员提供需求后,就会快速进入编码实现阶段,其中会省略了概要设计和详细设计两步。

那通过什么方式可以替代概要设计和详细设计两阶段?

试想一下,测试人员通过下面两种方式来进行弥补,是否有利于测试驱动开发呢?

步骤1:编写单元测试计划,明确测试目标

测试计划主要内容包括:

* 主要功能模块,及实现功能定义

* 测试时间、人员分配

* 每个模块包含哪些测试类型、测试方法

* 明确每个功能模块所属的类名、函数名和新添加字段(由开发完成)

* 测试用例(需求分解阶段的产品代码)

步骤2:测试人员在开发编码完成后进行单元测试

前提:

(1)测试人员与开发人员对接

(2)测试人员搭建开发环境,并熟悉代码结构

(3) 步骤1中的测试计划,都得测试人员和开发人员共同评审通过,并作为测试的标准

单元测试检查点:

(1)静态测试:检查代码语法、每个类代码行数等是否符合研发规范

(2)动态测试:运用junit测试框架,根据测试用例,检查每个函数输入输出的

正确性、代码分支覆盖率、异常处理等等

三、集成测试阶段

集成测试,即是对代码进行封装之后,对每一个功能模块进行的测试。

对于测试人员来说,在集成测试阶段又如何能发挥自己的作用,有效的做到测试驱动开发呢?

先来看下集成测试前提条件:编码完成—>单元测试通过—>发布代码,部署成功—>集成测试。

所以测试人员在进行集成测试阶段,以下几方面我认为有利于测试驱动开发:

(1)测试人员熟悉开发环境,熟悉代码内部结构,能运用测试思维,提前预估风险,规避部分测试风险;

(2)对部分难模拟场景,测试人员可以自己通过更改代码或配置,模拟相应测

试场景,喊少开发的工作量;

(3)测试人员在测试过程中发现bug之后,能快速定位bug,并能初步判断bug

引起原因,对开发更改bug减少跟踪时间;

四、系统测试阶段

系统测试,即是通过所有功能模块的相互连接,对整个系统进行连调测试。

在系统测试阶段,测试人员在测试驱动开发中又起到一个什么样的促进作用呢?

因为在前几个阶段,测试人员逐步参与需求理解、开发环境搭建、单元测试、集成测试,所有在系统测试阶段,测试人员有以下几个优势:

(1)对整个系统内部结构比较明了,对功能也很熟悉,能用较少的时间完成测试

(2)对不同功能之间调用的接口比较熟悉,在对系统进行接口方面的测试时有一定的优势

(3)若在测试过程中出现了环境问题,作为测试人员也会快速找到问题或解决方案

(4)测试人员可针对系统特定的功能点,精准的编写和优化自动化测试框架,

从而在以后的系统测试阶段,更加节约了人力成本和发现bug的效率

(5)通过对系统的理解,能在系统需要进行安全测试、压力测试时快速展开工作

以上几个测试阶段便是个人从测试角度对测试驱动开发的理解,本文所理解的测试驱动开发与Kent Beck所著的《Test-Driven De velopment》中的测试驱动开发有一定区别,仅供参考!

原文地址:https://www.cnblogs.com/louis-w/p/9516637.html

时间: 2024-12-28 01:48:35

从测试角度对测试驱动开发的思考【转】的相关文章

测试驱动开发(TDD)及测试框架Mocha.js入门学习

组里马上要转变开发模式,由传统的开发模式(Developer开发,QA测试),转变为尝试TDD(Test-driven development,测试驱动开发)的开发模型.由此将不存在QA的角色,或者仅存很少的QA用于系统模块间的集成测试. 因此代码的测试与开发都将由开发者(Developer)来保证. 这就需要借助优秀测试框架的帮助,尤其是支持TDD开发模式的自动化测试框架更为重要,因为我使用的编程是语言是Node.js,那么广泛使用的Mocha.js将成为我的首选. 在团队转型过程中,很多事情

从换位思考到测试驱动开发转

在人于人之间的相处中,换位思考有利于人们理解彼此的需求,进而促成共赢的局面.把换位思考用到软件的设计中,能够提升软件的质量.这是我在Michael Feathers的培训里,领悟到的最巧妙的一个思维方式.如果你对Michael的名字不熟悉,那么他写的Working Effectively with Legacy Code这本书,你可能听说过. 如何在软件的开发中做到换位思考?在回答这个问题之前,让我们看看换位思考为什么能提升软件质量. 不用不知道,一用吓一跳 你代码敲得很High,把属于你的那部

测试驱动开发(Test-Driven Development)

1.背景 一个高效的软件开发过程对软件开发人员来说是至关重要的,决定着开发是痛苦的挣扎,还是不断进步的喜悦.国人对软件蓝领的不屑,对繁琐冗长的传统开发过程的不耐,使大多数开发人员无所适从.最近兴起的一些软件开发过程相关的技术,提供一些比较高效.实用的软件过程开发方法.其中比较基础.关键的一个技术就是测试驱动开发(Test-Driven Development).虽然TDD光大于极限编程,但测试驱动开发完全可以单独应用.下面就从开发人员使用的角度进行介绍,使开发人员用最少的代价尽快理解.掌握.应用

浅谈测试驱动开发(TDD)

1. 优势 TDD的基本思路就是通过测试来推动整个开发的进行.而测试驱动开发技术并不只是单纯的测试工作. 需求向来就是软件开发过程中感觉最不好明确描述.易变的东西.这里说的需求不只是指用户的需求,还包括对代码的使用需求.很多开发人员最害怕的就是后期还要修改某个类或者函数的接口进行修改或者扩展,为什么会发生这样的事情就是因为这部分代码的使用需求没有很好的描述.测试驱动开发就是通过编写测试用例,先考虑代码的使用需求(包括功能.过程.接口等),而且这个描述是无二义的,可执行验证的. 通过编写这部分代码

(转)浅谈测试驱动开发(TDD)

测试驱动开发(TDD)是极限编程的重要特点,它以不断的测试推动代码的开发,既简化了代码,又保证了软件质量.本文从开发人员使用的角度,介绍了 TDD 优势.原理.过程.原则.测试技术.Tips 等方面. 2 评论: 李群 ([email protected])www.ihere.org 背景 一个高效的软件开发过程对软件开发人员来说是至关重要的,决定着开发是痛苦的挣扎,还是不断进步的喜悦.国人对软件蓝领的不屑,对繁琐冗长的传统开发过程的不耐,使大多数开发人员无所适从.最近兴起的一些软件开发过程相关

TDD(测试驱动开发)培训录

2014年我一直从事在敏捷实践咨询项目,这也是我颇有收获的一年,特别是咨询项目的每一点改变,不管是代码质量的提高,还是自组织团队的建设,都能让我们感到欣慰.涉及人的问题都是复杂问题,改变人,改变一个组织是个更复杂问题,这里可能涉及很多的非技术,非能力问题. 在2014年12月我在某企业内部推行TDD(测试驱动开发)培训,一共分4个课时完成一个特定需求的例子,看着大家一步一步的加深对TDD的理解,直到2014-12-31,也是2014的最后一天下午培训完TDD课程,经过一系列的总结过后,某参与人员

测试驱动开发实践

总是以为自己了解了测试驱动开发,其实做起来和了解根本不是一回事.原来觉得代码清晰得很,后来试验了一下才知道那是自己的错觉.这次,让我们抛却Eclipse的自动补全功能,来一场真正的测试驱动开发吧. 项目描述:这是一个很简单的项目,目标是扫描磁盘上所有特定格式的文件,将其路径存储下来,通过程序可以快捷搜索到文件路径并自动定位到该文件. 用户故事(简单点写了): 1.              扫描磁盘,将目录下的所有文件列出来,将特定格式的文件信息存储到磁盘. 2.              所有

测试驱动开发与Python

最近在看一本书<Test-Driven Development with Python>,里面非常详细的介绍了如何一步一步通过测试驱动开发(TDD)的方式开发Web项目.刚好这本书中使用了我之前所了解的一些技术,Django.selenium.unittest等.所以,读下来受益匪浅. 我相信不少开发都写单元测试,不过,一般是先写功能代码,然后,再写单元测试用例,在编写单元测试用例的过程中,可能需要调整功能代码,从而使单元测试用例通过.但是TDD就特别要求先写测试用例,后写实现代码.这一开始确

测试驱动开发笔记【初学者】

[基本步骤及流程]       1. 根据问题进行初始的需求分析,提取出初始而不完备的[to-do]列表:    2. 选择[ to-do]列表中的某个[to-do], 编写相应的测试:    3. 运行测试,发现无法通过:    4. 作出最简单的的改进,并运行测试使之通过:    5. 一小步一小步地重构代码.运行测试,并使之通过:    6. 跳转至[2].        [关键要素]    1.[to-do]列表: 需要完成的任务.当前要做的事情.标识完工.    2. the effe