阅读更多

3顶
0踩

研发管理

背景

两年前,我在一个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、单元测试是自动化测试的一种实践,可以在程序的开发阶段来检验程序稳定可靠...

  • RSMA-Rate-Splitting-通信系统仿真-速率拆分

    《RSMA与速率拆分在有限反馈通信系统中的MMSE基预编码实现》 本文将深入探讨RSMA(Rate Splitting Multiple Access)技术在有限反馈通信系统中的应用,特别是通过MMSE(Minimum Mean Square Error)基预编码进行的实现。速率拆分是现代多用户通信系统中一种重要的信号处理策略,它能够提升系统的频谱效率和鲁棒性,特别是在资源受限和信道条件不理想的环境中。RSMA的核心思想是将用户的数据流分割成公共和私有信息两部分,公共信息可以被多个接收器解码,而私有信息仅由特定的接收器解码。这种方式允许系统在用户间共享信道资源,同时保证了每个用户的个性化服务。 在有限反馈通信系统中,由于信道状态信息(CSI)的获取通常是有限且不精确的,因此选择合适的预编码技术至关重要。MMSE预编码是一种优化策略,其目标是在考虑信道噪声和干扰的情况下最小化期望平方误差。在RSMA中,MMSE预编码用于在发射端对数据流进行处理,以减少接收端的干扰,提高解码性能。 以下代码研究RSMA与MMSE预编码的结合以观察到如何在实际系统中应用RSMA的速率拆分策略,并结合有限的反馈信息设计有效的预编码矩阵。关键步骤包括: 1. **信道模型的建立**:模拟多用户MIMO环境,考虑不同用户之间的信道条件差异。 2. **信道反馈机制**:设计有限反馈方案,用户向基站发送关于信道状态的简化的反馈信息。 3. **MMSE预编码矩阵计算**:根据接收到的有限反馈信息,计算出能够最小化期望平方误差的预编码矩阵。 4. **速率拆分**:将每个用户的传输信息划分为公共和私有两部分。 5. **信号发射与接收**:使用预编码矩阵对信号进行处理,然后在接收端进行解码。 6. **性能评估**:分析系统吞吐量、误码率等性能指标,对比不同策略的效果。

  • 【地理空间Python教程】使用XEE从Google Earth Engine下载图像:肯尼亚人口网格数据GeoTIFF文件生成方法介绍了如何使用XEE

    内容概要:本文档介绍了如何使用 XEE 包从 Google Earth Engine 下载图像数据并保存为 GeoTIFF 文件。主要内容包括:1) 使用新的 ee.data.getPixels() API 和 XEE 包简化了从 GEE 提取大型数据集的过程;2) 通过 XArray 数据集和 rioxarray 工具直接处理和保存图像数据,避免了复杂的导出任务;3) 具体示例展示了如何下载肯尼亚 2021 年的 LandScan 人口网格数据,包括环境搭建、数据准备、图像处理和最终保存为 GeoTIFF 文件。 适合人群:具备一定 Python 编程基础和地理信息系统(GIS)知识的开发者或研究人员,特别是对地理空间数据分析和遥感图像处理感兴趣的用户。 使用场景及目标:① 在基于 Python 的工作流中快速高效地提取和处理托管在 GEE 上的大规模地理空间数据;② 学习如何使用 XEE 包和相关工具进行地理空间数据的下载、裁剪、投影转换和保存;③ 通过实际案例掌握地理空间数据的处理技巧,提高数据处理效率和准确性。 其他说明:此教程提供了详细的代码示例和操作步骤,帮助用户在 Google Colab 环境中完成整个数据下载和处理过程。用户需要具备一定的 Python 编程能力,并熟悉常用的地理空间数据处理工具和库,如 geopandas、rioxarray 和 xarray。此外,教程还强调了数据版权和来源的重要性,确保用户合法合规地使用数据。

  • 基于STM32的工业级锅炉控制器系统设计:外设驱动、数据采集与通信协议实现

    内容概要:本文详细介绍了基于STM32F407的锅炉控制器系统设计,涵盖多个关键技术点。首先,在SD卡驱动方面,采用了硬件SPI配置,波特率为10.5MHz,并通过DMA发送80个空时钟进行初始化。其次,多路AD采集使用差分输入模式和DMA循环采集,配合滑动平均滤波提高效率。此外,Modbus通信部分通过结构体映射寄存器并使用硬件CRC单元进行校验。文件系统则采用FatFs结合SPI Flash缓存,确保断电保护。实时监控线程使用状态机设计,确保系统稳定性和安全性。硬件设计方面,模拟电路与数字电路分区布局,增强抗干扰能力。 适合人群:具备一定嵌入式开发基础的研发人员,特别是希望深入了解工业级项目设计的工程师。 使用场景及目标:适用于工业自动化领域的嵌入式系统开发,旨在帮助工程师掌握从硬件选型、外设驱动、数据采集到通信协议实现的全流程设计方法,提升系统的可靠性和实时性。 其他说明:文中提供了详细的代码示例和设计思路,强调了实际项目中的注意事项和常见问题解决方案,有助于读者快速上手并应用于实际项目中。

  • 基于MATLAB的配电网二阶锥优化:OLTC档位选择与123型支路的最优潮流研究

    内容概要:本文详细介绍了基于MATLAB实现的配电网二阶锥最优潮流研究,重点探讨了OLTC(有载调压变压器)档位选择和123型支路的优化方法。通过构建SOCP(二阶锥规划)模型,结合YALMIP和CPLEX求解器,实现了高效的潮流优化。文中提供了详细的代码示例和解释,涵盖系统参数定义、模型构建、约束添加以及求解过程。此外,还讨论了OLTC档位选择的离散变量建模、支路类型的差异化处理、动态优化的时间轴管理等方面的技术细节。 适合人群:对电力系统优化感兴趣的科研人员、研究生及有一定编程基础的工程师。 使用场景及目标:适用于配电网优化研究和实际工程应用,旨在提高潮流计算的效率和准确性,解决传统方法在复杂约束下的不足。通过学习本文,读者可以掌握如何利用MATLAB和相关工具进行二阶锥优化,从而更好地应对电力系统中的各种挑战。 其他说明:文章附带详细的代码注释和讲解视频,帮助读者快速理解和应用所介绍的方法和技术。

Global site tag (gtag.js) - Google Analytics