单元测试极大地提高C/C++应用质量

介绍

如果你没有执行单元测试,你就会同时失去第一时间改善软件质量和削减开发时间和成本的机会。这种牺牲当然是令人失望的。在此之前,开发人员一直没有一种可行的方法来执行单元测试。现在,JAVA开发人员能够使用ParaSoft的Jtest自动化JAVA单元测试,而C/C++开发人员能够利用ParaSoft最新的C++Test工具自动化C/C++单元测试。

本文阐述了执行单元测试的方法、优点和难点,然后描述了C++Test任何能够给C/C++开发人员带来巨大的好处。

什么是单元测试?

我们对单元测试的定义是测试应用中最小的单元,如C/C++中的一个类。C/C++单元测试的目的是执行每个类中的每一个方法或函数,检测所有存在的功能性问题、错误和构造弱点。发现这些典型的问题通常涉及到三种测试方法:黑盒测试、白盒测试和回归测试。黑盒测试通过确定类的公共界面是否依照定义执行,检查类的功能性;执行这种类型的测试不需要有关实现细节的知识。白盒测试通过确定类在遇到非预期输入时执行是否正确,检查所有的类的方法和函数(包括保护和私有成员)的健壮性;执行这种类型的测试需要对类的实现细节的完整知识。回归测试检查是否类的修改会在原来正确的代码中引入新的错误。

什么是单元测试的优点?

单元测试被公认为软件开发过程中的一个关键步骤。单元测试能够简化错误检测,在减少开发时间和成本的同时提高软件质量。

单元测试促进错误检测的第一个方面是使你更接近错误。

单独测试一个类时(与其它对象分离),由于更接近错误,找到潜在的错误就会变得容易得多。用上述台球的例子来比喻,就像是台面上只有壹两个球时,一杆将一个球击入指定的袋中。

单元测试促进错误检测的第二个方面是,将你从在问题中艰难跋涉去修正一个简单错误的困境中解救出来。因为错误是相互关联和作用的,在较高的层次上找到和修正一个错误,常常会发现另外的问题。当你在较高层次上测试时,原始的错误就象是洋葱的最内层一样,另外的错误就象紧包着内层的其它层:只有把外层都剥掉才能看到最内层。当你测试每一个类时,错误还很少有机会建立在其它错误之上,并相互作用引起奇怪的行为。因此在单元级上检测错误会容易的多。

最重要的结果是,更容易的错误检测能够在改善应用质量的同时大量削减开发时间和成本。首先,由于能够更容易地找到错误,就会减少发现它们的时间和资源。其次,由于你一写完一个类,就能发现和改正其中的错误,你就不需要在以后花费时间重新了解和摸索。最后,最重要的理由是:由于类的相互作用和关联性,在单元级修改一个类只会影响到原始的类,而在较高的层次上修改一个类可能会改变多个程序部件的设计和功能性。越迟发现问题,通常就要修改越多的代码。当修改的代码量增加时,两个其它因素也会随之增加:

  • 修改每一个错误所需的时间和费用。
  • 在代码中引入新的错误的机会。

一次又一次的研究证明,随着问题被检测出来的时间的推迟,发现软件错误所需的时间和成本会惊人地增加。请看下面的研究结果:

  • IBM: 根据IBM的一份内部资料指出,确定软件错误的相对成本是:在设计阶段,1.5;编码前,1;编码中,1.5;测试前,10;测试中,60;交付后,100。[Watts Humphrey]
  • TRW: 确定错误的相对时间:需求分析阶段,1;设计阶段,3-6;编码阶段,10;开发测试阶段,15-40;接受性测试阶段,30-70;应用运行中,40-1000。[Boehm]
  • IBM: 确定错误的相对时间:设计评审,1;代码检查,20;测试,82。[Remus]
  • JPL: Bush得出的每个错误的平均成本:编码,US$90-US$120;测试,US$10,000。[Bush]
  • Freedman and Weinberg: 使用设计评审和代码检查手段的项目在测试时发现错误的数量会减少10倍,测试成本降低50%-8%,包括评审和检查的成本。[Freedman]

什么是单元测试的难点?

基于上述信息,单元测试看上去就象一剂万能药。如果是这样的话,为什么每一个C/C++开发人员不马上对每一个类进行单元测试?就目前可以使用的技术来说,对C/C++的单元测试是一件困难、烦琐和耗时的事情,没有很好的工具来自动化这一过程,使得许多C/C++开发人员望而生畏。

执行单元测试的第一步是是目标类变得可测。这需要两个工作:

  • 设计一个运行目标类的测试驱动程序。
  • 设计桩函数,它们为被测类所引用的任何外部资源返回值。

建立一个测试驱动,需要建立一个新的类,除了测试原始类以外它不能用于任何其它目的。测试驱动应该具有下列特性:

  • 一个指定设置和清除的标准方式。
  • 一个选择个别测试和所有有效测试的方法。
  • 一个分析输出的预期(或非预期)结果的机制。
  • 一个标准的错误报告形式。

为了充分而正确地测试类,你需要设计一个能够完全检查被测类的测试驱动;若干次修改和重写这样一个测试驱动是免不了的。一旦建立了测试驱动,你必须仔细检查它不能包含任何错误。测试驱动中的一个错误会破坏这个测试,但是你无法单独测试一个类,你也不能测试测试驱动本身。

如果你的类引用任何还没有准备好或不可访问的外部资源(如外部文件、数据库和CORBA对象等),你必须建立相应的桩函数,它们的返回值类似于这些实际的外部资源应该返回的值。当建立这些桩函数时,你需要选择桩函数的返回值,它们将影响程序的执行路径...

  • 为了测试类的功能性必须执行任何的路径,
  • 足够的路径能够提供彻底的测试覆盖性。

下一步是设计和建立合适的测试用例。为了彻底地测试类的结构和功能性,你应该设计两中类型的测试用例:黑盒和白盒。

黑盒测试用例基于说明和规格文档。特别地,至少应该为规格文档的每个入口建立一个测试用例;更好的是这些测试用例能够测试每个入口的各种边界条件。还需要为发现的每一个错误增加另外的测试用例,以及任何你认为必要的其它测试。

白盒测试用例通过各种不同的输入充分地执行类的所有方法以发现缺陷。对于手工测试来说这是非常困难的。为了建立有效的白盒测试用例,你必须研究类的内部结构,然后编写测试用例尽可能完全地覆盖类的所有方法,以及覆盖所有可能引起类崩溃的输入。要达到较高的测试覆盖性,需要有效的白盒测试用例它们能够执行相当多数的路径。例如,一个典型的1万行的程序,大约有1亿条可能的路径;手工建立能够执行所有这些路径的输入几乎是不可行的。

在建立这些测试用例以后,你将要执行整个测试用例并分析结果,确定在那里出现了错误、崩溃和薄弱环节。你还需测量这些测试的覆盖性,以确定类被测试的程度以及需要追加的测试用例。

任何时候一个类被修改后,你应该执行回归测试,保证没有引入新的错误和/或原来的错误已经被更正了。回归测试包括白盒和黑盒测试用例,并且分析结果以确定类的质量是否得到的改善。

C++Test: 一个自动化的单元测试解决方案

ParaSoft认识到了C/C++单元测试内在的的价值和难度,开发了C++Test,一个自动的C/C++单元测试工具,增强了ParaSoft的自动错误防止和错误检测产品线。C++Test自动执行所有可能的单元测试过程。特别地,它能够自动:

  • 建立每个被测类的测试驱动程序。
  • 建立任何必要的桩函数,并允许你定制这些桩函数的返回值或加入自己的桩函数。
  • 单键执行白盒测试的所有步骤。
  • 生成黑盒测试用例的基础集合。
  • 运行黑盒测试用例。
  • 生成黑盒测试的输出结果。
  • 执行回归测试。
  • 跟踪测试覆盖性。

C++Test能够测试所有类型的C/C++项目;C++Test甚至能够支持COM对象,允许你对调用COM对象方法的类和方法执行自动的单元测试。

C++Test还是高度可定制的;例如,你可以改变测试用例的生成参数,过滤一定的文件、类或方法,在任何层次上(从这个项目到单个方法或测试用例)进行测试。

另外,C++Test很容易与你目前的开发过程合作。C++Test直接安装在DevStudio环境中,因此你能够立即测试任何正在开发中的类。只要在Developer Studio的工具栏上按下Test FileTest Project按钮,那么C++Test就会自动在C++Test图形用户界面中打开你的文件,为每个类建立一个测试驱动程序并自动测试每个类。

C++Test实时跟踪测试覆盖性,然后建立一个综合测试覆盖性报告。覆盖性窗口图示化地说明了当前正在被执行的代码行,已执行过的行和每行的执行次数。因此,它不仅指出了一个代码行是否被测试过,而且说明了被测试的有多彻底。这些信息对于确定那些代码需要追加测试是非常有帮助的。

6. 集成的单步调试

如果你选择在方法测试时捆绑调试器,C++Test将自动自动激活Microsoft Visual C++调试器,这样使得你在用C++Test测试任何方法时仍然能够方便地进行单步调式。

7. 防止错误

C++Test能够自动执行两种类型的变成标准。其内建的特性允许你自动执行动态的变成标准,如“总是对每个类执行单元测试”和“总是单步调试类”等。另外,假如你使用CodeWizard--ParaSoft的自动化可定制编程标准强化工具,C++Test可以自动运行CodeWizard。

8. 运行时错误检测

C++Test还能帮助你执行类一级的运行时错误自动检测。如果你安装了Insure++,C++Test可以自动运行类和方法通过Insure++,它将检查下列错误:

  • 内存引用错误/内存未初始化
  • 内存泄漏
  • 内存分配错误
  • 变量定义冲突
  • I/O错误
  • 指针错误
  • 库调用错误
  • 逻辑错误
  • 算法错误

这意味着你能够在类开发的第一时间检测运行时错误,而且无需自己做任何运行数据。C++Test自动生成大量而精心设计的测试用例,能够帮助你更彻底、更方便和更快速地检测运行时错误。

结论

通过执行单元测试,你能够有效地防止许多错误的出现,尽早检测出已存在的错误,并且比其它测试手段和技术更有效。影响C/C++开发人员执行单元测试的主要障碍是需要消耗大量的时间的资源,目前的一些单元测试工具仍然存在着这样的问题。C++Test的推出克服了这一障碍。C++Test做到了开发人员总是希望却不敢相信的事情:自动化C/C++单元测试。

时间: 2024-12-06 11:54:37

单元测试极大地提高C/C++应用质量的相关文章

7个方面提高百度的收录质量方法

我并不想讨论如何提高百度的收录数量,而要讨论如何提高百度的收录质量,为什么呢?比起收录数量,收录质量显得更为重要,为什么呢?垃圾站即使收录1W页,百度带给它的流量可能日IP只有10,因为它的网站百度的搜索结果都排在10页之后,有多少人会翻10页呢?而如果百度收录的是高质量的,比如搜索结果排在第一位,那么带给你的流量你可想而知. 我做站已经2年时间了,这2年时间学了很多东西,对百度的研究也是最近看了很多资料总结出来的.这里给初学者借鉴,希望借着这篇文章可以解答你心目中的疑惑,为什么百度收录我那么多

如何提高移动站在百度质量度等级

摘要: 文是非常详细的一份移动建站方面的资料,上一次谷歌发布了移动网站建站的十大原则,这次百度也发布了移动建站指南,图文并茂的描述了如何提高移动站在百度质量度的等级,在百 文是非常详细的一份移动建站方面的资料,上一次谷歌发布了移动网站建站的十大原则,这次百度也发布了移动建站指南,图文并茂的描述了如何提高移动站在百度质量度的等级,在百度推广后台已经有"移动站点质量度"的星级评价体系了,页面大小.页面内容.页面样式.转化渠道等因素都会影响质量度星级,加载速度快.内容丰富的页面质量度星级更高

提高百度竞价账户质量度的办法

我们知道百度排名取决于综合排名指数,而综合排名指数=出价*质量度:现在复杂的质量度让调整排名变得扑朔迷离,难以捉摸.之前的质量度影响因素有3个方面:点击率.创意撰写质量.账户历史表现.9月份升级之后,新增了一项因素:相关性,即:关键词和创意的相关程度,关键词创意与目标页面的相关程度. 今天正好有客户问,如何提升质量度,简单总结了一下小脑袋竞价软件小编自己的经验: 可操作的主要包括3个方面: 1. 账户结构要合理,这是基础,也是重点,主要包含一下几个方面: * 关键词的比例(流量型 商机型 长尾词

提高网站外部链接质量办法

很多网站它的友情连接质量很高那么我们就要想办法把它经提上去是吧,下面我们就来看看关于如何提高网站外连接的方法与与高质量站点交换链接的方法吧. 1.wiki 就是百科啦,百度对于自己的产品百度百科可是相当重视的,经常可以看到在百度搜一些产品.名词等都是百度百科排前面,由此可见百度百科的百度权重有多高啊.而谷歌却偏偏中意wiki百科,有一篇报告称Google每天导出的流量有1%到了wiki百科里,可见谷歌也是相当重视wiki的啊.这些百科都是供网民自由编辑的,所以只要你懂点相关的常识,大可去编辑和你

新手应如何提高论坛外链质量的五大方法

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 正所谓"内容为王外链为皇"一个网站最为吸引用户的就是网站内容,如果说网站是王,那么外链就是皇,之所以这么说是有原因的,首先一个网站的内容一定要多,要新颖这样才可以吸引用户眼球,但是只是有内容,而没有一条搭往网站的桥梁百度蜘蛛就找不到你的站,没有了收录,没有了权重,排名自然不会高,当然也就没有用户光顾了.所以外链对于一个网站

关于如何提高计划和管理质量能力

首先,项目开发初期计划阶段的项目计划评价,计划执行过程中及计划完成报告的评价,并将评价.评审工作在工程实施之前就列入整个开发工程的工程计划中,同时提高软件开发项目管理的精确度. 然后,做好质量保证与检验.其一是切实搞好开发阶段的管理,检查各开发阶段的质量保证活动开展得如何:其二是预先防止软件差错给用户造成损失.为了确保每个开发过程的质量,防止把软件差错传递到下一个过程,必须进行质量检验.质量检验的原则,一.用户要求的是产品所具有的功能,这是"真质量".靠质量检验,一般检查的是"

怎么提高竞价推广网页质量

都说网站质量相当重要,这个问题所有做站的朋友都心知肚明,然而很多站长可能还不是很清楚究竟怎么样的一个网站才算是高质量的呢,或者说一个高质量的网站都包括哪些要点呢?因为经常有做站的朋友问我类似这样的问题,今天早上一开qq又有些朋友留言问我同样的问题,那小脑袋智能竞价软件小编今天就统一跟大家回答一下这个问题,不再说第二遍了,也只是我个人的一些经验罢了,仅供参考! &http://www.aliyun.com/zixun/aggregation/37954.html">nbsp; 1.页

如何提高网络广告的质量

中介交易 SEO诊断 淘宝客 云主机 技术大厅 我们每天上网的时候,都会看到各种各样的互联网产品广告,包括弹窗广告.对联广告.图片广告.文字广告.视频广告等等,这些形式多样的互联网广告最终的目的还是希望能够引起用户的关注,让用户去点击.要引导用户去点击广告,首先要让用户在心理上认同,因此掌握用户的心理特点和规律,是提高互联网广告质量的重要前提. 第一,从用户的角度出发,合理安排适当得体的互联网产品广告内容.在互联网产品广告内容上,要从用户的具体需求出发,而不是可以迎合用户的低级趣味.比如,我们可

通过Google +1真的能提高你的广告质量吗?

这个星期,我听了一些有关于谷歌关键字广告的产品-Google +1的激动人心的演讲和一些交谈.社会整合的前景和SEO清单和付费搜索广告是非常具有吸引力的,并且对搜索营销者来说是具有巨大的潜力的. + 1按钮是于今年的早期通过Google的搜索结果返回页面通过点击付费广告的列表和组织进行扩散发展的.自从那时起,这些问题并没有停止.最受关注的主要问题是+1是如何影响关键字广告的质量的. + 1:质量得分的因素? tinfoil-hat理论说Google正在悄悄的在质量得分公式中包括+1's的数量.换