如何做好单元测试

前言

  单元测试是对软件基本组成单元进行的测试,是属于白盒测试的范畴,它主要通过对代码的逻辑结构进行分析来设计测试用例。在动态测试手段中,单元测试是一种非常高效的测试方法,并且是软件测试周期中第一个进行的测试。从成本角度考虑,缺陷发现越早越好,加强单元测试力度有利于降低缺陷定位和修复难度,从而降低缺陷解决成本,同时加强单元测试也减轻了后续集成测试和系统测试的负担。根据业界的统计,一个 BUG 在单元测试阶段发现花费是 1 的话,到集成测试就变为 10 ,到系统测试就高达 100 ,到实际推向市场量产后就高达 1000 。但单元测试在目前国内软件企业中开展得并不好,一方面是由于对单元测试重视程度不够,测试投入不足,另一方面是由于在单元测试实践方面积累得也不够,单元测试处于一种摸索状态。

  软件的质量由组织、流程和技术三个维度来决定,任何一个维度都不能单独决定软件的质量。好的组织结构可以保证流程的顺利实施,好的流程能提高软件开发的规范性和可控性,从而提高软件开发的效率和质量,而采用了好的技术和有好的技术的载体 —— 人,则从根本上保证了软件的质量。

  总而言之,组织、流程和技术是软件质量三角,本文将从这三个方面对如何做好单元测试进行论述。

  • 组织结构应该保证测试组参与单元测试

  目前无论是工业界还是学术界都认为单元测试应该由开发人员开展,这是因为从单元测试的过程看,单元测试普遍采用白盒测试的方法,离不开深入被测对象的代码,同时还需要构造驱动模块、桩函数,因此开展单元测试需要较好的开发知识。从人员的知识结构、对代码的熟悉程度考虑,开发人员具有一定的优势。

  单元测试由开发人员进行能带来一些特别的收益。我们知道,在实践中开发人员进行单元测试一般推荐采用交叉测试的方法,例如由被测单元的调用方进行该单元的测试,即尽量避免对自己的代码进行单元测试。这种交叉的测试安排可以避免测试受开发思路影响太大,局限于原来的思路不容易发现开发过程中制造的问题;二来也达到一个技术备份或充分交流的目的,这对组织非常有利。即使不采用交叉测试的方法,而安排单元的生产者自行开展单元测试,也是有很大的优越性的,其最大的优点是快速,且能更好的实现 “ 预防错误 ” 。在人员紧张的情况下这种自行测试的安排也是不错的选择。

  从经验值来看,单元测试投入和编码投入相比基本上是一比一,如果由专职测试队伍来进行单元测试,维持这样庞大的单一任务队伍显然是不合适的。

  以上谈的是由开发人员进行单元测试的优点,其中主要是从单元测试的效率角度来考虑。但是从单元测试效果的角度考虑,必须从组织结构上保证测试组参与单元测试,这是因为:

  首先,从目前国内企业普遍现状来看,测试人员质量意识要高于开发人员,测试人员参与单元测试能够提高测试质量。

  其次,对被测系统越了解,测试才有可能越深入,测试人员参与单元测试,将使得测试人员能够从代码级熟悉被测系统,这对测试组后期集成测试和系统测试活动非常有帮助,会很大的提升集成测试和系统测试质量。

  测试组以何种方式参与单元测试,应该结合软件组织的实际情况来定。如果软件组织测试资源充分,测试人员对开发人员的比例较高,那么可以由测试人员独立承担部分重要模块的单元测试工作;如果测试资源不足,测试人员对开发人员的比例较低,那么可以采取由测试人员进行单元测试计划、单元测试设计的工作,而单元测试的实现和执行由开发人员来完成;而如果测试资源非常缺乏,连单元测试计划、单元测试设计都无法承担,那么测试组至少应该参与开发组的各相关单元测试文档、单元测试报告的评审,保证单元测试的质量。

  • 加强单元测试流程规范性

  • 制订单元测试的过程定义

  软件质量的提高需要规范的流程,对软件开发过程进行管理也需要依据规范的过程定义。过程定义包含阶段的划分、阶段的入口 / 出口准则、阶段的输入 / 输出、角色和职责、模板和查检表等等。将单元测试划分为几个阶段便于对单元测试过程进行控制,体现软件测试可控性。要提高单元测试的质量,首先要制定规范的单元测试过程,开发组、测试组、 SCM 组、 SQA 组等可以依据单元测试过程定义开展各自的工作,共同保证单元测试的质量。

  单元测试过程的定义需要参照企业的实际情况,例如阶段划分可以分为四个阶段:计划、设计、实现、执行。其中计划阶段应当考虑整个单元测试过程的时间表,工作量,任务的划分情况,人员和资源的安排情况,需要的测试工具和测试方法,单元测试结束的标准及验收的标准等,同时还应当考虑可能存在的风险,以及针对这些风险的具体处理办法,并输出《单元测试计划》文档,作为整个单元测试过程的指导。设计阶段需要具体考虑对哪些单元进行测试,被测单元之间的关系以及同其他模块之间单元的关系,具体测试的策略采用哪一种、如何进行单元测试用例的设计、如何进行单元测试代码设计、采用何种工具等,并输出《单元测试方案》文档,用来指导具体的单元测试操作。实现阶段需要完成单元测试用例设计、脚本的编写,测试驱动模块的编写,测试桩模块的编写工作,输出《单元测试用例》文档、相关测试代码。执行阶段的主要工作是搭建单元测试环境,执行测试脚本,记录测试结果,如果发现错误,开发人员需要负责错误的修改,同时进行回归测试,该阶段结束需要提交《单元测试报告》。

  具体进行单元测试过程定义的时候,可以进行一定的裁减,例如可以裁减为设计和执行两个阶段,将《单元测试方案》和《单元测试用例》合二为一。

  • 单元测试工作产品必须纳入配置管理

  单元测试工作产品指单元测试完成后应交付的测试文档、测试代码及测试工具等,一般包括但不限于如下工作产品,可以根据实际情况进行适当裁剪:

  • 单元测试计划

  • 单元测试方案

  • 单元测试用例

  • 单元测试规程

  • 单元测试日报

  • 单元测试问题单

  • 单元测试报告

  • 单元测试输入及输出数据

  • 单元测试工具

  • 单元测试代码及设计文档

  为了保证单元测试工作产品的准确性,需要对测试代码和脚本进行走读或检视,对测试文档进行评审。这些工作产品应该纳入到配置管理,对于其修改要走配置变更流程,并及时发布其配置状态,这样可以保持单元测试工作产品的一致性和可回溯性。

  • 必须制订覆盖率指标和质量目标来指导和验收单元测试

  单元测试必须制订一定的覆盖率指标和质量目标,来指导单元测试设计和执行,同时作为单元测试验收的标准。设计用例时,可针对要达到的覆盖率指标来设计用例,而在测试执行时,可以依据覆盖率分析工具分析测试是否达到了覆盖率指标,如果没达到,需要分析哪些部分没有覆盖到,从而补充用例来达到覆盖率指标。而单元测试质量目标的制订,需要符合软件企业的实际过程能力,这依赖于软件企业以前单元测试过程度量数据的积累,不能凭空制造出来。有了以前度量数据的积累,完全可以了解当前组织的单元测试能力,例如单元测试每千行代码发现的缺陷数是多少。如果单元测试统计结果没有落到这个质量目标范围内,说明单元测试过程中某些方面存在一些问题,需要对过程进行审计后找出问题原因进行改进。

  这些指标确定下来后,一定要严格推行。会有一些测试人员找出各种理由证明覆盖率指标达不到等等,这需要 QA 根据实际情况分析指标是否合理。实际证明有一个相对简单的标准也比没有标准要好得多,我们的实践发现,通过推行硬性指标,单元测试发现的问题数目比没有标准前至少增加了 2 倍。

  下面是印度 SASKEN 公司的质量目标:

  印度 SASKEN公司质量目标


阶段


组织目标


目标上限


目标下限


HLD (概要设计)


50 Major Defects / 100 pages


55 Major Defects/100 pages


45 Major Defects /100 pages


LLD(详细设计)


40 Major Defects / 100 pages


44 Major Defects/100 pages


36 Major Defects / 100 pages


Unit Test Plan

  (单元测试计划)


25 Major Defects / 100 pages


27.5 Major Defects /100 pages


22.5 Major Defects / 100 pages


Code Review

  (代码走读)


20 Major Defects / KLOC


22 Major Defects / KLOC


18 Major Defects / KLOC


Defects during Unit test(单元测试)


15 Major Defects / KLOC


16.5 Major Defects / KLOC


13.5 Major Defects / KLOC


Defects during Integration test(集成测试)


6 Major Defects / KLOC


6.6 Major Defects /

  加强详细设计文档评审

  详细设计是单元测试的主要输入,详细设计文档的质量将直接影响到单元测试的质量,所以一定要加强详细设计文档的评审,特别是要写相关测试方案和进行测试用例设计的人员,一定要从写测试用例的角度看这个详设是否符合要求,否则后期进行单元测试设计时会发现无法依据详细设计进行单元测试设计。软件组织可以将详细设计评审的要点以查检表的形式固化下来,这样在详细设计评审的时候依据查检表一项项检查,既提高了评审效率,也能保证评审效果。评审流程需要确定如果不满足查检表 n% 以上的条件,被评审详细设计文档就不能通过,需要重新设计。

  通常详细设计文档有两种形式,一种是流程图的形式,另一种是伪码的形式。用流程图表达的优点是直观,利于单元测试用例设计,缺点是描述性比较差,文档写作麻烦,不利于文档的变更和修改;伪码的方式可能正好相反,文档变更修改简单,可以方便地在任何地方增加文字说明,而且翻译成代码更加便捷,但不直观,不利于进行单元测试用例设计。

  详细设计和单元测试设计一定要分离。如果单元测试由测试人员承担,这一点不会有什么问题;如果单元测试由开发人员承担,那么实际操作时可以让项目组内做相同或者相近任务的成员相互交换,根据对方的详设设计对方的单元测试。这样在单元测试开始之前的详细设计评审阶段就要考虑到后面的分工,安排相关的单元测试设计人员参与相关详细设计的评审。

  如果代码没有对应的经过评审后的详细设计文档,建议不进行单元测试,而是用代码审查替代单元测试。

  开发人员在编码的过程中,可能会发现详设中的问题,并对代码进行修改,这种修改应该回溯到详设,并对详设进行相应的修改,否则到单元测试执行的时候,会发现代码和详设根本对不上,无法执行下去。详设的修改要受控制,要走变更控制流程,它的变更也要经过评审。因为单元测试是详细设计的下游活动,如果详细设计随意更改,单元测试文档很难和其保持一致,这样单元测试也就失去了依据和意义。只有详设也纳入配置管理,才能保证单元测试和详设的一致性。

  • 单元测试者技能的提高

  1 .加强对单元测试人员的技能培训

  单元测试的质量很大程度上决定于进行单元测试的人的技术水平。如果测试者不具备单元测试的知识,那么应该对测试者进行相关的培训。一个没有做过单元测试人,不经过培训初次是很难做好单元测试的。单元测试在详设阶段结束时开始,但是单元测试相关培训应该尽早准备和计划,培训可以分两个阶段,每个阶段的内容类似。第一阶段是写单元测试方案前,培训对象为测试方案的写作者和详设的写作者,这样可以在设计时多考虑可测试性,培训的内容为单元测试基本概念、单元测试分析方法、单元测试用例的写作、单元测试标准的明确;第二阶段为单元测试执行前,对象为测试执行者,培训内容为具体单元测试的执行,包括驱动函数、桩函数的构造、覆盖率测试工具的使用( TrueCoverage 、 Logiscope 等)、利用自动化单元测试框架构造单元测试自动化( TCL 、 CppUnit 、 JUnit 等)。培训过程中最好结合实例穿插其中,会比较生动,而且增强理解。

  通过以上的系统培训,可以统一单元测试方法、明确单元测试的标准、掌握单元测试基本技能,为后期单元测试的顺利开展扫平道路。

  2 .必须引入工具进行辅助

  单元测试非常需要工具的帮助,特别是覆盖率工具不能缺少,否则用例执行后无法得到测试质量如语句覆盖、路径覆盖等情况,也就无法对被测对象进行进一步的分析。应用较广的分析覆盖率的工具有 Logiscope 、 TrueCoverage 、 PureCoverage 等,它们的功能有强有弱,可以根据实际情况采用。

  为了提高单元测试的效率,特别是提高进行回归测试时的效率,需要在单元测试中引入自动化。目前常用的方法是采用 TCL 语言编写扩展指令,构造自己的单元测试自动化。也可以直接采用开源的自动化测试框架如 CppUnit 、 JUnit 等。

  此外,在单元测试之前,还需要利用 PC_Lint 对被测代码进行检查,排除代码语法错误,确保进行单元测试的代码已经具备了基本质量,保证单元测试能够顺利进行,提高单元测试执行效率。

  3 .单元测试者加强对被测软件的全面了解

  单元测试的目的除了要发现编码中引入的错误和发现代码与详细设计不一致的地方之外,还有一个目的是为了保证详细设计的质量。因为测试分析和测试用例设计需要依据详细设计来进行,这个过程实际上是对详细设计的重新检视,在这个过程中会发现以前评审中没有发现的问题。

  无论是在单元测试的设计活动中还是在单元测试的执行过程中,都需要测试者了解软件的需求和概要,加强对被测软件的全面了解。否则对被测对象了解不深,只能就被测单元的流程而测流程,而对于该流程是否正确就无法保证了。

  测试者要注重与开发的交流,这样能对被测单元有更深的了解;同时因为进度的原因,包括详设在内的文档往往来不及更新,所以最新最正确的思想往往存在于开发人员的脑袋里,及时与他们交流才会获得最及时的信息,减少将来更新用例的工作量。

  结尾

  单元测试是软件开发过程中非常重要的质量保证手段,加强单元测试对提高软件质量具有非常重要的意义。而做好单元测试不是只要掌握单元测试方法就可以了的,这需要从组织、流程和技术三个方面来保证。

转载:http://wenku.baidu.com/link?url=dLdu8pCSiDwYtJwXT6pLF_QL5sazCT5iFfmT9kepxb39zIcRQhz85NMCPJs5q1kd299YqbytL0DpJO1zI94uRHUFyIR5roUrL0okSIAqa73

时间: 2024-10-03 03:48:49

如何做好单元测试的相关文章

什么是单元测试?如何做好单元测试?

什么是单元测试?如何做好单元测试? 单元测试是指,对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作,这里的最小可测试单元通常是指函数或者类. 单元测试都是以自动化的方式执行,所以在大量回归测试的场景下更能带来高收益. 单元测试代码里提供函数的使用示例,因为单元测试的具体表现形式就是对函数以各种不同输入参数组合进行调用. 如何做好单元测试?1)代码的基本特征与产生错误的原因无论是开发语言还是脚本语言,都会有条件分支.循环处理和函数调用等最基本的逻辑控制,如果抛开代码需要实

究竟什么是敏捷测试

时至今日,还讨论这样一个老话题,是否感觉老调重弹?因为两年前(2010年底)时任谷歌中国测试经理的段念先生就写了一篇文章<什么是敏捷软件测试>, 就已经谈到这个话题,“敏捷软件测试更多的是一种理念,而非过程”.在2011年,我自己也写了一篇文章<敏捷测试的思考和新发展>,谈到“在BDD.ATDD和TDD最根本的.共同的思想基础上,构成一个全新的.更完善的敏捷测试框架”.而更早的时候(2010年10月),写了一篇<敏捷测试的方法和实践>,开始的那一小节就在讨论 “什么是敏

BUG数量和项目成本

 在说BUG数量对项目成本的影响之前,首先说下软件测试流程,本人所在的公司使用的是maintis作为跟踪BUG的工具,使用其他的工具,对BUG测试流程没有影响 具体流程如下, 测试员执行测试用例 测试员如果发现BUG,在mantis上记录BUG信息,同时将信息转给项目经理 项目经理浏览BUG记录,把相应的BUG转给对应的开发人员 程序员按照maintis记录的内容,执行测试用例,确认是否有BUG 程序员修改BUG 程序员修改BUG结束后,更新mantis上的BUG状态 测试员验证已修复的BUG

MVP模式是否适合我们使用? 代码说话

转载请注明出处:王亟亟的大牛之路 按照惯例今天上了一个关于沉浸式菜单栏的文章的就不写了,然后 下班前看到一些感兴趣的内容就研究了下,MVP模式之前有大致的了解但是没有实战的在安卓上用过.(国内也有一些大牛有些过类似的内容,但是每个人对一件事情的理解可能大致相同但是总有细微的差异,主要是把我对这件东西的理解和实现方式分享给大家) 我不太喜欢搬太多人家已经整理好的东西再贴出来搞的自己理论多牛B,我还是用代码和例子说话,那么这里留下一些别人讲过的概念性的东西给大家建立概念,这些设计层面的东西还是希望大

DNX/ASP.NET 5的xUnit入门向导

(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:想必很多人已经和我一样在使用ASP.NET 5开发真实世界的应用了,那么做好单元测试和集成测试是必不可少的.现在首选使用的测试框架是xUnit,而它的官方文档中的一篇文章其实是一个很好的入门向导. 虽然之前我也介绍过在DNX/ASP.NET 5中进行单元测试或者集成测试的文章,且这些文章都在一致使用xUnit,不过对于xUnit的具体使用反而讲解的不够清楚(或者说不够简单易懂).其实,在xUn

个人阅读作业2016.1.10

快速阅读 问题原文链接:http://www.cnblogs.com/dtblog/p/4830995.html 1.什么样的团队才能够算作一个好团队. 团队配置合理,有专门的PM,开发人员,测试人员,UI设计师,团队中的各个人都有能力承担相关工作.此外团队在开发过程中,各个成员应该配合PM,按时完成自己的任务. 2.怎样调解团队成员之间可能产生的纠纷. 首先确认纠纷产生的原因以及纠纷的焦点在哪里,依据不同的情况分开讨论.如果是对产品设计上的分歧,可以由大家一起商议,或者开展一个调查,看看用户的

西班牙式软件团队

足球运动有超过百年的历史,相对于只有几十年的软件工程学来说,成熟的足球哲学与理论肯定有值得借鉴的地方,那么作为一项极注重团队配合.组织架构与软件团队也比较像的足球运动,有哪些地方可以参考呢? 近年来西班牙连续夺得了2008.2012年欧洲杯冠军.2010年世界杯冠军.作为连续三界大赛的冠军得主,西班牙足球也已经成为众多国家队.俱乐部研究与学习的对象.即使近期西班牙足球久居巅峰后出现了一些下滑现象,但显然西班牙队仍是一支不容忽视的超级强队,那么软件工程学可以从西班牙足球的成功中借鉴点什么 呢? 为

我所理解的软件工程

前言 好吧,我承认我大学报考软件工程专业仅仅是因为我想多玩玩电脑(如今只想远离它)--在此之前电脑从来都是拿来娱乐的. 我只记得初中的时候有计算机课,老师教我们玩FLASH,也就做一下补间动画,没用到AS.高中的时候上过一点点编程,用的是什么语言忘记了,当时就是做了个加减乘除的运算,大概类似 int a=1; int b=2; int c; c=a+b; print(c); 当时就照着老师给的代码敲上去了,得出了结果,让我有一丝兴奋,可是我百思不得其解,int是什么鬼,int a=1又是什么意思

软件开发过程自动化原理及技术(完整示例)

软件开发过程自动化原理及技术 一个简单完整的自动化示例 1   概述 关于本文,最开始只是想写一些关于 软件自动化测试开发 的文章,但是后来写着写着,发现不先在宏观上的软件开发过程进行介绍,不会引起大家对 自动化 技术形成了解和重视.所以本文从软件工程宏观层次进行了介绍,并和传统的实现方法做了一些对比,并附了一些代码,让有兴趣的朋友对自动化的理念及具体的实现技术手段有一些初步的认识. 既然是要 自动化 那么肯定就是冲着 效率 来的.在正式开始系统化的自动化技术学习之前,先来一个完整的示例来有个对