阅读更多

背景

两年前,我在一个Web项目开发组中,项目的目标是编写一个类似Excel的、用来计算产品/服务价格的Web应用程序。项目团队被分成3部分——开发团队、需求团队和QA团队。随着项目越做越大,而我们没有使用任何形式的自动化测试(QA团队使用手工测试),结果导致项目的测试时间比开发时间还要多。每进行一次小的改动,QA团队都要花费几个小时来做测试。

有一天,我参加了一个开发者会议,并与其他程序员谈到了这些问题。他们建议我去学习单元测试、验收测试和TDD(Test-Driven Development,测试驱动开发)。

我的经验总结

下面是我在学习集成测试/TDD过程中的一些经验教训,希望能够对大家有所帮助。

1.  不要第一次就在真实项目中尝试TDD

这可能会让你的项目很难进展。在采用TDD之前,你必须要了解TDD的工作流程以及如何去模拟对象(mock objects)、如何去模拟框架内部、如何组织测试等方面知识。因此,如果你的团队还没有准备好,就采用TDD可能会拖慢你的项目,从而错过最终交付期限。

2.  采用编程道场(Coding Dojo)方式学习TDD

我们发现编程道场是对新进入团队的开发者培训TDD以及提升他们编程技能的最好的方式。

编程道场是一种帮助提高编程技能的训练方法。一般是在一个会议室里,有一台连接投影仪的电脑。每次道场还要有一个挑战题目。每次有两个人在电脑前结对编程来试图解决挑战的题目,并且由其他参加者提供建议。所有的参加者都要轮换到结对编程里进行演练。(来自维基百科

3.  应用TDD之前尝试说服你的整个团队

没有什么比团队中存在“破坏者”角色更令人沮丧的了。如果团队中大部分人都在朝着TDD努力,而个别开发者所做的工作有可能毁掉这些努力,比如提交失败的测试代码等。我曾经就与这类人一起工作过。在团队开始TDD开发之前,一定要让所有人明白它的好处,并了解如何测试可以使软件减少bug、如何重构代码而不用担心破坏整个项目等等。

4.  写足够多的测试

构建一个测试套件,就等于构建了一个bug防护盾。当团队重构或改进软件时应该完全信任这个“盾”。如果这个盾有缺口,那么我们在更改代码时会增加引入未知bug的风险。不要强求测试套件覆盖100%的代码,这是不可能的,而且相当耗时,但是,覆盖大部分代码是完全可以实现的。一个好的准则就是测试所有可能会出现问题的地方。

5.  使用覆盖率工具

覆盖率工具将会报告测试套件的缺口。借助这些工具,可以很容易识别哪些代码没有测试。这些工具可以给我们一个直观的认识,比如蓝/绿着色线表示正在测试中的代码,红色着色线表示没有测试。如果你是一个.NET程序员,Visual Studio旗舰版会带有这个功能;如果你是一个Java程序员,你可以使用EclEmma

6.  测试速度要快

当在构建软件时,我们永远都在追赶最后的交付期限。我们的测试应该帮助我们实现这一目标,而不是耗时和延迟。

如果写测试用例花费太长时间,在最后期限到来之前,团队可能不会再花时间写测试。如果在运行测试上花费太长时间,团队可能不会在每次更改代码后都运行它们。

7.  不要忽略失败的测试

如果你的团队对第1次失败的测试不在意,那么他们对第2、3、4次失败的测试也不会太在意。这种情况下,测试套件反馈的问题将会被忽略,测试也不会对软件质量有太大帮助。

8.  结对编程有助于团队应用TDD

当我们首次试图采用TDD时,或者最终交付期限临近时,我们可能会忘了写测试,而只顾写生产代码。结对编程可以阻止这种偷工减料的现象,强制团队成员编写测试。

9.  保持你的测试代码整洁

为了提高工作效率,我们的测试代码可能不会像生产代码一样整洁。由于软件发生改变时,测试代码也必须改变,测试代码也会越积越多,这样一来,会导致最终测试代码也很难维护。

10  测试应该有且只有一个失败的理由

这个理由就是发现bug。如果你的测试代码有大量的断言,你就需要小心。如果生产代码中的函数和类只有一个响应,那我们的测试代码也应该只测试这一个事件。通过这种方式,将很容易找出失败的测试,并弄清楚什么地方出问题了。

11.  编写单元测试将节省调试时间

通常在调试代码、寻找bug时会花费大量的时间,一旦你编写了单元测试,你将会在代码的每一块得到一个实时反馈,这将让你更容易找到bug,节省调试时间。

12.  持之以恒

应用TDD可以改变我们的心态。对于部分开发者而言,开始写测试很难,而在写生产代码之前写测试就更难了。重要的是,要持之以恒地写测试,一旦你的团队完全适应了这种方法,生产效率会成倍提升。

英文原文:12 Lessons I learned using unit tests/TDD

3
0
评论 共 11 条 请登录后发表评论
11 楼 fortaotao 2013-07-16 08:49
实际体验,一般WEB项目不需要TDD,规模大点的项目TDD投入产出完全不成比例,而且还有一堆靠TDD炒概念的闲人,没事做就在那指手画脚,我说事实,有敏捷运作好的企业就无视我的发言吧。
10 楼 StrongZhu 2013-07-14 00:00
测试用例的几个好处
1、将开发人员用于debug的成本投入,转换成可以持续运行的测试用例,该部分投入将变成资产。
2、测试用例可以将复杂的业务实现代码,拆分成以小逻辑单元,简化验证的复杂度。体现到覆盖率指标上即应追求line coverage,但condition coverage的全覆盖是可商榷的,即单元测试无法替代集成测试。
3、让团队中的所有人对其他人产生信心
9 楼 yunzhu 2013-07-12 11:00
wangguo 写道
yunzhu 写道
为什么ITEye总是比博客园慢几拍呢?

这篇文章我先发到CSDN,然后发到ITeye,博客园转载的是CSDN的,转载速度快了点而已

好吧,是我错了,主编辛苦了

原来现在都是在CSDN和ITEye同步发啊
8 楼 wangguo 2013-07-12 10:49
yunzhu 写道
为什么ITEye总是比博客园慢几拍呢?

这篇文章我先发到CSDN,然后发到ITeye,博客园转载的是CSDN的,转载速度快了点而已
7 楼 yunzhu 2013-07-12 10:44
为什么ITEye总是比博客园慢几拍呢?
6 楼 China祥 2013-07-12 09:27
刚接触TDD,感觉还不错,效率蛮高的!
5 楼 id.alex 2013-07-11 16:05
TDD 的好处很多,但坑真的很多很多多.而且完全不能代替测试人员.

. 写和维护 TDD 代码的代价.(没做过 TDD 的请体验下再来发言...)
. 测试数据的准备.
. 只测试正确的逻辑,最好不测试错误场景.或者有选择的测试错误场景.否则带来的工作量是 N 倍.
. 测试代码覆盖率的 KPI, 这个非常坑. 有很多 try catch , 异常流程是没有测试的,否则情况如上.
. 依赖第三方接口的测试,这个 Unit Test 不能真的去调用,但 Mock 很难 Mock.注释掉代码又跑不通,或者没意义.
. 端口绑定/调用脚本的 Unit Test.
. 多线程并且有数据库修改的 Unit Test 难做. 原本代码是没有事务的,但为了 Unit Test 的事务回滚,不可能加上.

一时想到的就这么多....其实在做的时候还会遇到更多的问题,不能或者说不容易去做 TDD.

而且,最重要的,

真的确定原来的 TDD 代码是正确的么?
测试跑的通和代码没有错误,是完全完全不同的概念.!!!

4 楼 yq81862 2013-07-11 13:46
现在大部分项目都不适合做tdd
3 楼 jinnianshilongnian 2013-07-11 11:50
lection.yu 写道
一直想试试TDD。但是无奈一直没能在团队里推行。一个赶着做项目的三人团队,不知道怎么样来实施TDD。哎。

其实我认为测试也很简单,就是
1、可能出现的问题,写个测试用例 保证代码是预期的执行
2、如果不是预期的:要么逻辑错了,要么用例错了
3、如果用例正确,当修改代码后 可能重复执行用例,在项目中,只有是这种情况才是比较有用的(不考虑框架级)
2 楼 jinnianshilongnian 2013-07-11 11:48
之前写过一篇加速Java应用开发速度3——单元/集成测试+CI,在工作中,使用单元测试后能享受到回归的好处,改起来也敢改了
1 楼 lection.yu 2013-07-11 11:16
一直想试试TDD。但是无奈一直没能在团队里推行。一个赶着做项目的三人团队,不知道怎么样来实施TDD。哎。

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • TDD团队中的测试人员

    测试驱动开发(TDD)是一种开发方式,它改变了传统软件开发的流程,即首先设计程序,再进行编码与测试工作。TDD采取了很小的增量式开发方式:首先编写一个测试,再...这样一来,我们就需要重新反思是否有必要在TDD团队中

  • 在团队中进行单元测试/TDD的12 条经验

    那么在团队中该如何应用单元测试和TDD呢?开发者Paulo Ortins结合自身经历给出了本文中的12个经验教训。 测试可以帮助项目团队找出代码中存在的问题,TDD方式更是将测试放在了开发工作的首位。那么在团队中该...

  • (转)在团队中进行单元测试/TDD的12条经验

    在团队中进行单元测试/TDD的12 条经验 摘要:测试可以帮助项目团队找出代码中存在的问题,TDD方式更是将测试放在了开发工作的首位。那么在团队中该如何应用单元测试和TDD呢?开发者Paulo Ortins结合自身经历给出...

  • 在团队中进行单元测试/TDD的12 条经验 读书笔记

    在团队中进行单元测试/TDD的12 条经验 摘要:测试可以帮助项目团队找出代码中存在的问题,TDD方式更是将测试放在了开发工作的首位。那么在团队中该如何应用单元测试和TDD呢?开发者Paulo Ortins结合自身经历给出...

  • 在团队中进行单元测试的12条建议

    原文出自CSDN上的一篇文章,地址:...1. 不要第一次就在真实项目中尝试TDD  这可能会让你的项目很难进展。在采用TDD之前,你必须要了解TDD的工作流程以及如何去模拟对象(mock objects)、如何...

  • TDD系列1-从单元测试说起

    单元测试是在软件开发过程中要进行的最低级别的测试活动,在单元测试活动中,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。单元测试目的就是用来验证代码的行为是否与我们期望的一致。

  • 在单元测试和TDD中指定时间的重要性

    但是,在进行测试培训时,我清楚地看到,通常对特定工具的知识并不是主要问题。 即使使用Spock,也可以编写肿且难以维护的测试,从而破坏(或不了解)与编写单元测试有关的良好实践。 因此,我决定写一些更基本的...

  • tdd 单元测试_何时给定在单元测试和TDD中的重要性

    tdd 单元测试 最近,我一直在写与自动测试有关的更高级的概念(主要与Spock有关)。 但是,在进行测试培训时,我清楚地看到,通常对特定工具的知识并不是主要问题。 即使使用Spock,也可以编写肿且难以维护的测试,...

  • 测试驱动开发(TDD)前端篇

    当你在写生产代码时,你处在高认知的状态,你的研发流程和你的工程实践,有助于你一步一步的提升你的认知能力,把你的问题进行一个降解,只要你做到同样的事情,你用什么方法开发,我认为我认为都是一种高效的方法。

  • 单元测试 - C/C++

    最初的来源是想模仿对硬件芯片做单元测试那样,在软件中也能对小的软件单元进行测试,从而保证软件中某个局部设计的正确性。 传统的单元测试定义 传统软件单元测试将被测单元的粒度规定为软件中最小的功能模块。...

  • TDD及单元测试最佳实践

    TDD:What?Why?How?TDD(测试驱动开发)既是一种软件开发技术,...TDD有如下几点优势:在开发的过程中,把大的功能块拆分成小的功能块进行测试,降低复杂性,帮助我们小步快跑前进。遵循“keep it simple, stupi...

  • Mockito单元测试基本使用

    Mockito在单元测试中的基本用法,mock用于依赖解耦

  • 软件测试中单元测试有用吗,软件测试中的单元测试是什么?单元测试怎么做?...

    定义与特点单元测试(unit testing):是指对软件中的最小可测试单元进行检查和验证。这个定义有点抽象,这里举几个单元测试的特性,大家感受一下:一般是一个函数配几个单元测试、单元测试不应该依赖外部系统、单元...

  • 自动化测试(二)01-前端测试分为单元测试、集成测试和E2E测试 & 测试工具对比-适合TDD或 BDD、断言、异步测试 & 测试工具的类型

    通常程序员在测试自己的代码的时候用得最多的便是单元测试,但是因为测试也是需要代价,很多人是不喜欢写测试的,甚至是一点都不写。 那么是什么原因让大家不愿意写呢? 不熟悉 浪费时间 知识不成体系 团队氛围 ...

  • 使用GTest/GMock进行C++单元测试(一)

    单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。 二、优点 1、单元测试是自动化测试的一种实践,可以在程序的开发阶段来检验程序稳定可靠...

  • 起点小说解锁.js

    起点小说解锁.js

  • 299-煤炭大数据智能分析解决方案.pptx

    299-煤炭大数据智能分析解决方案.pptx

  • 299-教育行业信息化与数据平台建设分享.pptx

    299-教育行业信息化与数据平台建设分享.pptx

  • 基于Springboot+Vue酒店客房入住管理系统-毕业源码案例设计.zip

    网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信息的宣传和管理就很关键。系统化是必要的,设计网上系统不仅会节约人力和管理成本,还会安全保存庞大的数据量,对于信息的维护和检索也不需要花费很多时间,非常的便利。 网上系统是在MySQL中建立数据表保存信息,运用SpringBoot框架和Java语言编写。并按照软件设计开发流程进行设计实现。系统具备友好性且功能完善。 网上系统在让售信息规范化的同时,也能及时通过数据输入的有效性规则检测出错误数据,让数据的录入达到准确性的目的,进而提升数据的可靠性,让系统数据的错误率降至最低。 关键词:vue;MySQL;SpringBoot框架 【引流】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes

Global site tag (gtag.js) - Google Analytics