`
Godlikeme
  • 浏览: 165161 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[译]优良单元测试的特点

阅读更多
单元测试类似一种强大的魔法,不恰当的使用则可能浪费大量的时间,给项目带来严重的损害。如果单元测试写得很差、且没有得到很好的应用的话,很容易让你花费大量的时间维护和调试这些测试代码,以至影响到生产代码和整个项目。
我们必须避免发生此类情况。记住,进行单元测试的首要原因是让一切更简单。还好,只要遵循几条简单的指引就能够在项目中避免这些麻烦。
优良的单元测试具有以下的特点:简称为 A-TRIP。
  • 自动性(Automatic)
  • 完备性(Thorough)
  • 可重复性(Repeatable)
  • 独立性(Independent)
  • 专业性(Professional)
  • 下面让我们逐一理解它们的含义。
  • 自动性
  • 单元测试是自动执行的,这里的自动指两个方面:1执行测试,2检查测试结果
    执行测试应该是足够简单的,这样,我们就可以随时随地的进行测试。因此,执行相应测试就应该像在IDE中点击一个按钮,或者在命令行中打一个命令那么简单。一些IDE甚至会在后台连续的进行测试。
    维护这个环境很关键,不要引入哪些会破坏自动测试模型,需要手工进行干预的单元测试。如果测试需要一些环境(网络,数据库,等等),那就把它做为测试的一部分。Mock对象可以有效的隔离对外部的依赖。
    运行测试的不光你一个人,还应该有一台机器对所有提交的代码持续的运行所有的测试。这种自动、无人职守的检查的作用就像一个定位杆,这种安全机制保证所有提交的东西不会破坏任何测试。理想情况下并不必须这样子,因为你可以依靠每一个开发人员都会自行运行所有必需的测试。回到现实,可能某个家伙再某个遥远的地方并没有执行必需的测试。也许在他的机器上有一些代码能够保证一切没问题,可他们却没有提交代码。这样虽然在本地可以执行,其他地方就会出问题。
    最后,自动性的含义还有测试必须能够自行判断成功还是失败。让一个人(你或者其他倒霉蛋)通过检查测试产生的数据结果来判断代码的正确性,这是让项目失败不错的方式。测试的自检查是一致回归的重要特性。人类并不擅长这种重复性的工作,另外,在项目里,我们还有很多更重要的事情去做。
    测试的自动执行和自动检查是非常关键的,这意味着你不用花太多的心思再这上面,它已经成为了项目的一部分。测试是项目安全保护网的重要组成部分。它在你掉下来时接住你,且不会挡道,这样你就可以集中精力走"钢丝"了。
  • 彻底性
  • 良好的测试应该是彻底的,所有可能会出错的地方都应该测到。如何能够做到这一点呢?一种极端情况,测试每一行代码、每一个分支、每一个抛出的异常,诸如此类;另一个极端,只测试最可能的情况:边界条件、数据丢失、数据格式无效,等等。这就需要根据项目情况进行区分了。
    如果追求较高的测试覆盖度,那就需要寻求代码覆盖工具来帮忙了(例如:免费的nounit,quilt,商用的Clover),用这些工具可以知道到底有多少代码是被测试覆盖的。
    有一个事实需要注意,Bug在代码中的分布情况是不均匀的,而是喜欢聚集在有问题的地方(很多昆虫都这样,例如:苍蝇)。
    这种现象引出了一段非常著名的呼声“别打补丁,重写”。通常,从头重写一段有一堆问题的代码的代价和痛苦程度要低得多。当然,有了单元测试,从头重写代码也安全多了,单元测试可以保证新代码能够按照预定的执行。
  • 可重复性
  • 测试用例之间是独立的同时,也应该是独立于环境的。目标就是保持每个测试能够以任意顺序、不断的重复执行,且得到同样的结果。这意味着测试不能依赖于不可控的任何外部环境。
    使用Mock对象来隔离测试,保证测试不依赖于外部环境。如果必须依赖一些条件(例如:数据库),那就要保证这个条件不受其他开发人员的干扰。每个开发人员都应该有自己的sandbox,不同的数据库实例啦,web服务器啦。
    没有可重复性保证,可能会在最糟糕的时侯遇到一些让你奇怪的问题,更糟糕的是,这些奇怪的问题通常都是虚幻的,并不是一个真正的bug,只是测试自身的问题。真不值得为这些虚幻的问题浪费时间。
    每个测试用例,每次执行都应该得到同样的结果。如果测试结果是失败,那就说明是在代码里面存在bug,而不是有其他问题引起的错误。
  • 独立性
  • 测试代码必须保持精简、整洁,这就要求测试是专注的、与环境和其他测试隔离的(要记住,别的开发人员可能同时在运行这些测试)。
    在书写测试时,保证每个测试只做一件事情。这不是说在一个测试方法里只写一个assert,而是说在一个测试方法里应该只专注于一个、或者几个共同提供某些功能的方法产品代码。有些时候一个测试方法只能够测试了一个复杂的产品代码方法的一部分,就需要一套测试方法来完整的测试产品代码的方法了。
    理想情况下,我们希望在测试代码和潜在的bug之间建立起关联。也就是说,当一个测试方法fail的时候,能够定位到对应代码中的bug。独立性也意味着test之间没有相互依赖。每一个test都是可以独立运行的,而不需要必须在其他test之后才能运行。每一个test应该是一个孤岛。
  • 专业性
  • 为单元测试所写的代码是货真价实的,甚至有些人会争辩说,比提交个客户的源代码还要货真价实。这意味着,测试代码的书写和维护应该保持和生产代码一样的专业水准。产品代码中必须遵循的常用的设计准则,如:数据封装、DRY原则、高内聚、低耦合等等,在测试代码中也一样要遵守。
    测试代码很容易就会写成linear的样式,代码里面充次着同样的内容,不断的重复同样的代码,却鲜见方法和对象。这样很糟糕,测试代码必须和生产代码按同等对待来书写。这就要把哪些常用的、重复部分的代码抽取出来成为一个方法,这样就可以在多处调用。
    这样就会慢慢积累出一些测试的方法,可以封装在一个类里面了。别争论什么,就算这个类只是用来测试的,就创建一个好了。这样做不进没问题,而且是应该得到鼓励的:测试代码是货真价实的代码。某些情况下,我们也许需要创建一个更大的框架,或者创建一个数据驱动的测试工具。
    不要浪费时间测试那些不必要的方面,我们不是为了测试而创建test。测试的完整性要求测试方法的每一个可能产生bug的方面。如果没有产生bug的可能,就不要做测试。比如get set方法,就没必要做测试了。但如果这些get set方法中包含了业务逻辑,哪就有必要进行测试了。
    最后,测试代码应该和生产代码是同一规模量级的。是的,你绝对没有看错。如果产品代码有20000行,那么测试代码至少也应该是20000行,甚至更多。测试代码的量也很大,就必须保持整洁、精简,有良好的设计,结构良好的,同生产代码一样的专业。
    分享到:
    评论
    3 楼 Godlikeme 2006-11-08  
    谢谢!
    这部分多是泛泛讲讲,对具体怎么做指导意义不大,但如果测试方面工作做的较多,算是一个总结提炼,还是不错的。原书名叫做:<pragmatic unit testing in java with junit>,因为是英文原版的,不便贴再这里,花了点时间把觉得还不错的部分翻译出来,跟大家分享下。
    2 楼 daquan198163 2006-11-08  
    翻得挺好的,不仔细看还以为是原文呢
    1 楼 Godlikeme 2006-11-08  
    翻译的不好,见谅了。

    相关推荐

      冀教版五年级英语下册第二单元测试题精选.doc

      这篇文档是冀教版五年级英语下册第二单元的测试题,主要涵盖了听力和笔试两大部分,旨在检验学生对基本词汇、句型的理解以及听力能力。以下是对文档中涉及的知识点的详细说明: **听力部分** 1. 听力部分考察了学生...

      品德及社会四年级下册单元测试题.pdf

      在遵守规则方面,单元测试题强调了规则对于社会秩序的重要性。首先,规则是社会公平、安全和信任的基础,无论是生活、学习还是游戏,我们都应自觉遵守规则。班级公约是班级管理的重要依据,完善的公约有助于形成积极...

      新人教版数学三年级下册第三单元《统计》单元测试卷.doc

      在这个单元测试中,涉及到选择题、填空题和应用题,都围绕着统计概念展开。例如,计算平均体重、比较不同群体的数量差异、判断统计数据的正确性等。 2. 选择题:选择题考察了学生的逻辑推理和基本知识掌握。如第一...

      小学英语第七册第一单元测试题及答案【冀教版】精选.doc

      这篇文档是针对小学英语第六年级(相当于国内的小学七册)学生的一份第一单元测试题,涵盖了听、说、读、写等多个方面的能力检测。测试题由听力部分和笔试部分组成,旨在检验学生对基本词汇、句型以及场景对话的理解...

      三年级英语上册第一单元测试题【冀教版】精选.doc

      这篇文档是针对三年级英语上册第一单元的一套测试题,主要涵盖了冀教版教材的基础内容。测试题分为听力和笔试两大部分,旨在检测学生对基本的英语词汇、字母顺序、数字排序、单词拼写以及简单对话的理解和运用能力。...

      克隆技术单元测试1.doc

      【克隆技术单元测试】 1. 克隆技术是一种生物技术,主要涉及细胞或个体的复制。在选择题中提到的野驴“复生”问题,正确的克隆方法是通过体细胞核移植到去核卵细胞中,经孕育培养成新个体。这意味着细胞核中的遗传...

      2021学年高中地理第四章区域发展战略单元测试2.pdf

      这篇资料主要涉及的是高中地理第四章“区域发展战略”的单元测试,涵盖了多个与地理、区域发展相关的知识点。以下是对这些内容的详细分析: 1. **铁路选线**:在第一部分的题目中,提到一个岛国的铁路发展,指出...

      八年级政治上:第一单元 第3课 优良的意志品质 教案加测试(苏教版).doc

      【中学教案】——《八年级政治上:第一单元 第3课 优良的意志品质》 本教案主要围绕初中生意志品质的培养展开,旨在帮助学生理解意志的力量,并通过实际活动和案例分析,培养他们的坚强意志。课程内容分为教学目标...

      北师大版数学6年级(上)第五单元测试卷2(含答案).pdf

      在第*单元的练习中,学生需要补充完整六(1)班同学英语口语测试成绩的条形统计图。通过分析图表,学生可以了解不同成绩等级的人数分布情况,如优良、及格和不及格的人数比例。 折线统计图则显示数据随时间的变化趋势...

      打印机测试纯色高清图

      按照建议,每隔一周打印一次,这有助于预防喷头堵塞,保持打印机的优良工作状态。 此外,色彩图也是衡量打印机色彩还原能力的重要工具。通过打印色彩丰富的图片,我们可以评估打印机对颜色的准确再现能力,包括饱和...

      WEB测试相关理论介绍

      WEB测试是针对基于Web技术构建的信息系统进行的一种关键质量保证活动。...测试人员需要具备深厚的Web技术知识,了解各种测试方法,以及如何根据系统特点制定合适的测试计划,确保Web信息系统的稳定、高效和用户友好。

      软件测试复习整理.docx

      V模型中,开发过程从上至下依次是需求分析、设计、编码,而测试过程从下至上对应着单元测试、集成测试、系统测试和验收测试。W模型则强调在需求分析阶段就开始进行验证,强调早期介入,使测试与开发同步进行,以提高...

      如何编写测试用例PPT教案学习.pptx

      但如何以最少的人力、资源投入,在最短的时间内完成测试,发现软件系统的缺陷,保证软件的优良品质,则是软件公司探索和追求的目标。每个软件产品或软件开发项目都需要有一套优秀的测试方案和测试方法。 测试用例是...

      面向Website测试

      网站测试是确保网站功能完整、性能优良、兼容性良好、安全性强的重要步骤。它涵盖了用户界面测试、功能测试、性能测试、安全测试等多个方面,旨在发现并修复潜在问题,提升用户满意度和业务效益。 2. **测试类型**...

      人教版道德与法治七年级下册第二单元测试卷(含答案).pdf

      这份资料是针对七年级下册道德与法治课程的第二单元测试卷,主要涵盖了情绪管理、人际关系、情感认知、法律道德等多个知识点。 1. 情绪的理解与表达:试卷中的题目涉及情绪的分类和理解,例如,选项中的“怒发冲冠...

      华为设备CQI优良比优化试点总结

      在宁波和湖州两地的测试结果显示,打开此开关后,CQI高阶占比和平均CQI都有明显提升,且没有对其他LTE指标产生负面影响。 3. **传输模式优化**:将传输模式从TM3改为TM4,TM4是带有闭环空间多重天线技术的传输模式...

      六年级科学下册 第二单元《遗传与变异》单元测试题 苏教版-苏教版小学六年级下册自然科学试题.doc

      这种方法已成功应用于许多农作物改良,如无籽西瓜、新型草莓、太空椒和瘦肉型猪等优良品种的培育。 生物的遗传和变异在生物繁殖过程中起着关键作用。遗传保持了物种的稳定性,而变异则提供了进化的原材料。没有遗传...

      新人教版八年级下册初中生物全册单元测试卷(含期中期末试卷).doc

      8. 植物组织培养优点:植物组织培养技术可以短时间内大量繁殖,保持亲本的优良性状,防止病毒传播,但不能培育新品种。 9. 鸡卵孵化条件:受精的鸡卵胚盘色浓而略大,是孵化出小鸡的前提。未受精的卵无法孵化。 10...

      九年级数学下册第28章样本与总体单元综合测试3新版华东师大版20200310134

      总结,本单元测试涵盖了统计学中的抽样方法、样本选择、数据分布、频率计算、概率应用以及通过样本推断总体等核心概念,这些都是初中数学中的重要知识点,对于理解和应用统计学原理有着基础性的作用。通过这样的单元...

      网站测试都要测试哪些及如何进行测试

      网站测试是确保网页功能完善、用户体验优良的关键环节。下面将详细介绍在网站测试中涉及的各个方面以及测试方法: 1. **UI测试**: UI(User Interface)测试关注网站的外观和交互设计。测试人员需要检查页面布局...

    Global site tag (gtag.js) - Google Analytics