﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-秋阳的软件测试专栏-随笔分类-02 单元测试 </title><link>http://www.cnitblog.com/qiuyangzh/category/376.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 29 Sep 2011 00:51:34 GMT</lastBuildDate><pubDate>Thu, 29 Sep 2011 00:51:34 GMT</pubDate><ttl>60</ttl><item><title>valgrind</title><link>http://www.cnitblog.com/qiuyangzh/archive/2007/04/27/26292.html</link><dc:creator>qiuyangzh</dc:creator><author>qiuyangzh</author><pubDate>Fri, 27 Apr 2007 09:44:00 GMT</pubDate><guid>http://www.cnitblog.com/qiuyangzh/archive/2007/04/27/26292.html</guid><wfw:comment>http://www.cnitblog.com/qiuyangzh/comments/26292.html</wfw:comment><comments>http://www.cnitblog.com/qiuyangzh/archive/2007/04/27/26292.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/qiuyangzh/comments/commentRss/26292.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/qiuyangzh/services/trackbacks/26292.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;这段时间我的团队在对一个产品进行稳定性测试，让程序在Purify下运行，结果Purify最后出现了错误。同事告诉我有一款工具——valgrind，可以定位程序内存方面的错误，于是下载下来，运行测试，效果很好，这个工具运行稳定，给出的结果也很清晰。<br>&nbsp;&nbsp;&nbsp; valgrind这款工具是运行在linux下的，可以用来定位c/c++程序中内存使用方面的错误。包括：内存泄漏、使用未初始化的内存、读/写已释放的内存、读/写内存越界、使用malloc/new/new[]和free/delete/delete[]不匹配，等等。<br>&nbsp;&nbsp;&nbsp; valgrind官方网站：<a href="http://valgrind.org/"><u><font color=#800080>http://valgrind.org/</font></u></a>，是一款open source软件。我下载的时候最新版是3.2.3。安装过程很简单——configure，make，make install，安装后不需要任何设置，直接可以开始使用。<br>&nbsp;&nbsp;&nbsp; valgrind运行方法很简单:valgrind --leak-check=full --track-fds=yes 程序 参数<br>&nbsp; 这样你的程序就会在valgrind监控下运行了，结果会直接输出到屏幕上。如果想把结果输出到日志文件（通常也需要这样），用如下的命令：valgrind --log-file=valgrind_log --leak-check=full --track-fds=yes 程序 参数<br>&nbsp; 感谢这款工具的开发者——<font size=2>Jonathan Riddell 。也</font><font size=3>感谢我的同事肖锋，让我知道有这样一款工具</font><font size=2><a href="http://valgrind.org/" target=_blank>。<img border=0 src="http://www.cnitblog.com/images/cnitblog_com/qiuyangzh/snap.jpg"></a></font></p>
<p>*valgrind网站上的，骑士战恶龙</p>
<p><br>PS：说起Run-time错误定位工具，我最初使用的是Boundchecker，那还是在Visual c++ 6.0的时代，那款工具确实很好用，功能、性能都不错，但后来不知道Compuware公司出了什么问题，对这款工具的改进很少，到了MS .net出来以后，我试用过Boundchecker针对.net的版本，性能很差。后来是否再有更新我就不清楚了，因为再也没有使用过Compuware的产品。Purify是现在的公司使用的Run-time错误定位工具，使用方法和Boundchecker非常类似（2002年的时候Compuware指控IBM错误分析器产品中使用自己拥有版权的代码，就是这款产品），也许是因为曾经使用过Boundchecker先入为主的原因，对这款工具始终感觉不是很好，在这次测试过程中，Purify自己竟然宕了。使用过valgrind后，我查了关于它的一些资料，对这款工具评价很好。遇到相同需求的朋友，可以试一下valgrind这款工具，相信不会让你失望！</p>
<img src ="http://www.cnitblog.com/qiuyangzh/aggbug/26292.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/qiuyangzh/" target="_blank">qiuyangzh</a> 2007-04-27 17:44 <a href="http://www.cnitblog.com/qiuyangzh/archive/2007/04/27/26292.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>函数库、组件产品的测试</title><link>http://www.cnitblog.com/qiuyangzh/archive/2006/02/19/6702.html</link><dc:creator>qiuyangzh</dc:creator><author>qiuyangzh</author><pubDate>Sun, 19 Feb 2006 04:46:00 GMT</pubDate><guid>http://www.cnitblog.com/qiuyangzh/archive/2006/02/19/6702.html</guid><wfw:comment>http://www.cnitblog.com/qiuyangzh/comments/6702.html</wfw:comment><comments>http://www.cnitblog.com/qiuyangzh/archive/2006/02/19/6702.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/qiuyangzh/comments/commentRss/6702.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/qiuyangzh/services/trackbacks/6702.html</trackback:ping><description><![CDATA[<p>本文列出了对于函数库、组件等对象（下文统称函数接口）的测试过程。这里描述的属于确认测试过程，但由于从形式上类似于单元测试，而且也基本适用于单元测试的过程，所以放到单元测试栏目中。</p>
<p><strong>1.1 概述<br></strong>&nbsp; 函数接口（或称API）是一个产品类型。本部分的测试指南，描述了对这类产品进行测试时的参考过程。<br>&nbsp; 下面首先给出整体的测试过程，然后针对每个子过程需要进行的工作进行具体描述，最后是几点补充说明。</p>
<p><strong>1.2 测试过程</strong><br>函数接口的整体测试过程如下：<br>&nbsp;* 制定测试计划<br>&nbsp;* 设计测试用例<br>&nbsp;* 执行测试<br>&nbsp;* 编写可复用的测试代码<br>&nbsp;* 增强测试<br>&nbsp;* 结束测试</p>
<p><strong>1.3 过程说明</strong><br>下面是对各个子过程的具体说明：<br><strong>1.3.1 制定测试计划<br></strong>分析被测试对象的具体情况，制定测试计划，形成文档。测试计划至少要包括以下内容：<br>&nbsp;测试范围。测试要覆盖哪些库以及库中的哪些函数，要覆盖哪些文档，包含哪些测试类型等等。<br>&nbsp;测试工具。选择什么工具组织测试代码，是否还需要其它的辅助性测试工具。<br>&nbsp;测试环境。都需要在什么环境下执行测试，环境指硬件类型、OS、DB等等。<br>&nbsp;测试数据组织。对于测试代码所需要的测试数据，以什么方式来组织和保存。<br>&nbsp;进度安排。各个阶段的工作内容、时间安排。<br>&nbsp;测试尺度。测试的深度和广度是什么。根据现有的资源情况，在计划中设定一个标准，避免测试的盲目性和随意性。<br><strong>1.3.2 设计测试用例</strong><br>&nbsp; 按照函数接口说明文档，依据测试计划中的测试尺度来设计测试用例，形成文档。<br>&nbsp; 函数接口的测试用例设计，与传统GUI界面产品的用例设计思路是一样的，包括测试输入（正常、异常输入）和预期输出两部分，等价划分、边界值等设计方法也同样适用，只是这时的界面变成了函数接口的输入参数，而不再是GUI元素。<br><strong>1.3.3 执行测试</strong><br>&nbsp; 依据测试用例设计文档，编写调试代码，执行测试。这是函数接口测试中最为耗时的过程，Bug也主要是在这个过程中被发现的。开发人员修正Bug，测试人员进行回归测试，直至Bug被关闭。<br><strong>1.3.4 编写可复用的测试代码<br></strong>&nbsp; 当一个函数的bug修正基本完成后，整理调试代码，将其转化为可复用测试代码。<br>&nbsp; 函数接口最后的测试代码与其测试用例设计应该是一致的，测试代码是测试用例的具体实现。如果测试代码需要独立的测试数据，则要详细记录下这些数据的相关信息。测试用例设计文档、测试代码、测试代码所需测试数据，这三者构成完整的测试程序。<br>&nbsp; 在编写测试代码的时候需要注意：不同测试部分的测试数据应该互不干扰，各部分的测试代码，在测试结束时要负责恢复测试环境，以使下一个测试能正常运行，也便于测试代码的维护。<br><strong>1.3.5 增强测试</strong><br>&nbsp; 这是一个可选项目，不是必须的。是否进行这项工作，在制定测试计划的时候就要考虑清楚。<br>&nbsp; 对于函数接口的增强测试，可以考虑的测试内容包括（但不限于）：代码测试覆盖率的统计、函数接口的Run-time错误检测。这类测试工作需要工具的支持，可选的工具如：Compuware的Devpartner，IBM的PurifyPlus等。<br><strong>1.3.6 结束测试</strong><br>&nbsp; 结束测试阶段的工作包括：编写测试报告、测试资料整理。<br>&nbsp; 完成测试计划中罗列的所有工作，达到预期的测试目标后，进行测试报告的编写。<br>&nbsp; 对于测试过程中产生的测试资源——测试计划、测试用例设计、测试代码，这些是以后测试复用的基础。如果这些资源本身不能说明自己，则需要整理一份单独的说明文档，供以后参考使用。</p>
<p><strong>1.4 补充说明</strong><br><strong>1.4.1 测试过程的补充说明</strong><br>&nbsp; 对于上面描述的测试过程中的&#8216;设计测试用例&#8217;、&#8216;执行测试&#8217;、&#8216;编写可复用的测试代码&#8217;这三个步骤，不是完成一项后，才开始进行下一项，而通常是一个交替进行、逐步迭代的过程。先制定好测试用例文档的整体结构，然后设计一个函数接口的测试用例，接着执行对其的测试，最后整理成可复用的测试代码。针对每个函数接口都重复这个过程，直至完成所有函数接口的测试。<br><strong>1.4.2&nbsp; 测试过程中产生的测试资源</strong><br>&nbsp; 测试过程中产生，测试结束后需要存档的测试资源包括：<br>&nbsp;&nbsp;&nbsp; 测试计划（文档）；<br>&nbsp;&nbsp;&nbsp; 测试用例设计（文档）；<br>&nbsp;&nbsp;&nbsp; 测试代码及相关数据（代码、数据）；<br>&nbsp;&nbsp;&nbsp; 测试报告（文档）；<br>&nbsp;&nbsp;&nbsp; 其它的相关说明文档（如果有的话）；<br>&nbsp;&nbsp;&nbsp; 测试框架的介质（如果选用了第三方测试框架的话）。<br><strong>1.4.3 函数接口测试的自动化</strong><br>&nbsp; 函数接口产品的一个特点就是对外表现比较稳定，因此一旦实现了对其测试过程的自动化，积累起可复用的测试资源，就会大大缩短以后该产品的测试周期。所以对于函数接口的测试，建议都能以测试自动化的过程进行组织。<br>&nbsp; 为了实现函数接口的测试自动化，就需要选择一个稳定、可靠的测试框架来组织测试代码，在这里建议使用XUnit工具。<br>（注：针对不同的开发语言，Xunit提供了不同的版本，如Junit（for Java），CppUnit（for C/C++），Nunit（for MS .Net）等等，每种主流的语言都有其对应的Xunit框架。Xunit是Open Source的工具，可以从<a href="http://sourceforge.net/">http://sourceforge.net</a>上下载。）<br><strong>1.4.4 测试代码的维护<br></strong>&nbsp; 测试代码并不是写完后一次后就一劳永逸了。随着被测产品的升级，测试代码也需要作出相应的调整，以适应被测产品的变化。<br></p>
<img src ="http://www.cnitblog.com/qiuyangzh/aggbug/6702.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/qiuyangzh/" target="_blank">qiuyangzh</a> 2006-02-19 12:46 <a href="http://www.cnitblog.com/qiuyangzh/archive/2006/02/19/6702.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>NuMega在测试过程中的应用</title><link>http://www.cnitblog.com/qiuyangzh/archive/2005/11/09/4208.html</link><dc:creator>qiuyangzh</dc:creator><author>qiuyangzh</author><pubDate>Wed, 09 Nov 2005 09:21:00 GMT</pubDate><guid>http://www.cnitblog.com/qiuyangzh/archive/2005/11/09/4208.html</guid><wfw:comment>http://www.cnitblog.com/qiuyangzh/comments/4208.html</wfw:comment><comments>http://www.cnitblog.com/qiuyangzh/archive/2005/11/09/4208.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/qiuyangzh/comments/commentRss/4208.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/qiuyangzh/services/trackbacks/4208.html</trackback:ping><description><![CDATA[<H1><A name=_Toc29347617><SPAN lang=EN-US>1 前言</SPAN></A></H1>
<P class=MsoNormalIndent><SPAN style="FONT-FAMILY: 宋体">我在本文中介绍</SPAN><SPAN style="FONT-FAMILY: 宋体">了</SPAN><SPAN lang=EN-US>NuMega Devpartner Studio 6.5</SPAN><SPAN style="FONT-FAMILY: 宋体">测试工具套件(以下简称<SPAN lang=EN-US>NuMega</SPAN>)在测试过程中应用的问题，以使该工具能更好的辅助我们的测试工作。</SPAN></P>
<P class=MsoNormalIndent><SPAN style="FONT-FAMILY: 宋体">文中所介绍的<SPAN lang=EN-US>NuMega，专指NuMega for Visual C++版，对于NuMega for Visual Basic版和NuMega for Delphi版的使用说明，不在本文的介绍范围之内，这一点请注意。<?xml:namespace prefix = o /><o:p></o:p></SPAN></SPAN></P>
<H1><A name=_Toc29347618><SPAN lang=EN-US>2应用方案</SPAN></A></H1>
<P class=MsoNormalIndent><SPAN lang=EN-US style="FONT-FAMILY: 宋体">NuMega for Visual C++版共提供了三个工具</SPAN><SPAN lang=EN-US>BoundsChecker</SPAN><SPAN style="FONT-FAMILY: 宋体">、</SPAN><SPAN lang=EN-US>TrueCoverages</SPAN><SPAN style="FONT-FAMILY: 宋体">和</SPAN><SPAN lang=EN-US>TrueTime</SPAN><SPAN style="FONT-FAMILY: 宋体">。</SPAN><SPAN style="FONT-FAMILY: 宋体">我们也分三部分</SPAN><SPAN style="FONT-FAMILY: 宋体">分别</SPAN><SPAN style="FONT-FAMILY: 宋体">介绍</SPAN><SPAN lang=EN-US>BoundsChecker</SPAN><SPAN style="FONT-FAMILY: 宋体">、</SPAN><SPAN lang=EN-US>TrueCoverages</SPAN><SPAN style="FONT-FAMILY: 宋体">、</SPAN><SPAN lang=EN-US>TrueTime</SPAN><SPAN style="FONT-FAMILY: 宋体">在测试过程中的应用。因为本文只讨论工具与测试过程的结合，所以对工具功能只做简单介绍。如果想要详细了解工具的功能和使用，请参见我Blog中的另一篇文章——《单元测试工具Numega</SPAN><SPAN style="FONT-FAMILY: 宋体">》。</SPAN></P>
<P class=MsoNormalIndent><SPAN style="FONT-FAMILY: 宋体">好了，现在就开始，先来说</SPAN><SPAN lang=EN-US>BoundsChecker</SPAN><SPAN style="FONT-FAMILY: 宋体">。<BR></SPAN></P>
<H2><A name=_Toc29347619><SPAN lang=EN-US>2.1 BoundChecker</SPAN></A></H2>
<P class=MsoNormal style="TEXT-INDENT: 21pt"><SPAN lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">BoundsChecker主要定位程序在运行时期发生的各种错误。BoundsChecker能检测的错误包括：</SPAN><SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">内存泄露；资源泄露；对指针变量的错误操作；内存读、写溢出；<SPAN lang=EN-US><SPAN>&nbsp; </SPAN>使用未初始化的内存；API函数使用错误等等。<o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 21pt"><SPAN lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">BoundsChecker是一个动态、白盒测试工具，最适合在单元测试阶段、集成测试阶段使用。在使用BoundsChecker对程序进行检测时，要求有程序的源代码。<o:p></o:p></SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 21pt"><SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">在单元测试阶段、集成测试阶段使用<SPAN lang=EN-US>BoundsChecker的基本步骤是：<o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 21pt"><SPAN lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">1 为被测试程序制定测试用例。这一步很重要，因为BoundsChecker只能检查被执行过的代码中是否存在错误，如果某一部分的代码没有被执行到，即使这部分代码有问题，BoundsChecker也不能发现。所以，在开始使用BoundsChecker前，为被测程序制定覆盖全面的测试用例非常重要。<o:p></o:p></SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 21pt"><SPAN lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">2 执行测试用例。打开BoundsChecker功能，运行被测试的程序，按照制定好的测试用例，逐个执行。在操作被测试程序时，就象操作平常的程序一样，输入数据，点击鼠标，观察预期的结果，BoundsChecker会在后台跟踪、监视程序的运行情况，一旦发现错误，会马上记录下错误的相关信息。<o:p></o:p></SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 21pt"><SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">这个时候，<SPAN lang=EN-US>BoundsChecker的价值就体现出来了。反映在功能上的错误，我们通过观察马上就可以发现，但对于象内存泄露这样的“癌症”，光从程序运行的外表是不能发现的，所以这种错误也就更可怕。通过BoundsChecker，能增强我们对程序内部正常运行的信心。<o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 21pt"><SPAN lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">3第三步就是分析错误了。根据BoundsChecker列出的错误列表，分析错误产生的原因。对于每一个错误，BoundsChecker会给出该错误的类型、描述、发生位置等信息。<o:p></o:p></SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 21pt"><SPAN lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">4除了用BoundsChecker检查程序中的Run-Time错误外，还可以使用BoundsChecker检测程序中使用的Win32 API函数在不同平台上的兼容性。能检测的平台包括：Windows2000、Windows NT 4.0、Windows NT 3.51、Windows 98、Windows 95、Windows CE 2.0，除此之外，还可以检测代码是否符合标准C和扩展标准C的要求。<o:p></o:p></SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 21pt"><SPAN lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">5最后，根据发现的问题，提交检测报告。<o:p></o:p></SPAN></P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">BoundsChecker的应用就是这些内容。再重申一遍，使用该工具时，制定覆盖全面的测试用例非</SPAN><SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">常重要，因为<SPAN lang=EN-US>BoundsChecker只能检查被执行过的代码中是否存在错误,对于没有被执行过的代码，<SPAN lang=EN-US>BoundsChecker不会有任何反映。</SPAN><BR><BR></SPAN></SPAN>
<H2><A name=_Toc29347620><SPAN lang=EN-US>2.2 TrueCoverage</SPAN></A></H2>
<P class=MsoNormal style="TEXT-INDENT: 21pt"><SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">覆盖率对于测试来说是一项重要数据。在我们执行了针对一个功能模块的所有测试用例后，非常想了解测试对于模块代码的覆盖情况，也就是测试覆盖率达到了多少，以此来判断测试工作是否可以结束，如果还未达到测试目标，如何进一步补充测试用例。对于这些问题，如果没有覆盖率统计工具的帮助是很难进行的。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 21pt"><SPAN lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">TrueCoverage的功能就是统计测试覆盖率，它恰好能为我们就上面这个问题提供帮助。在使用TrueCoverage记录程序的覆盖情况时，要有程序的源代码。<o:p></o:p></SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 21pt"><SPAN lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">TrueCoverage统计测试覆盖率时是针对代码级的，所以只适合应用于单元测试阶段和集成测试阶段，将TrueCoverage（包括类似的</SPAN><SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">覆盖率统计工具</SPAN><SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">）应用到系统测试上去是不适宜的。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 21pt"><SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">在单元测试、集成测试阶段使用<SPAN lang=EN-US>TrueCoverage的基本步骤是：<o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 21pt"><SPAN lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">1制定出尽可能完善的测试用例。这一步和是否使用TrueCoverage没有太大的关系，不管你是否统计覆盖率，对于测试来说，制定出完善的测试用例都是必要的。<o:p></o:p></SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 21pt"><SPAN lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">2打开TrueCoverage，启动被测试的程序，依次执行测试用例。你就象往常那样操作程序，按照测试用例进行输入，观察实际输出，并与预期输出进行比较，最后记录下每个测试用例的执行结果。TrueCoverage会在后台记录程序的执行覆盖情况。<o:p></o:p></SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 21pt"><SPAN lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">3查看、分析测试覆盖情况。在执行完事先制定好的测试用例后，根据TrueCoverage提供的</SPAN><SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">测试覆盖率信息，决定测试工作是否可以结束，如果还未达到测试目标，我们可以根据</SPAN><SPAN lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">TrueCoverage提供的</SPAN><SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">测试覆盖率信息，进一步补充测试用例。</SPAN><SPAN lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">TrueCoverage用不同的颜色标识被执行的代码和未被执行的代码，这很有利于我们补充测试用例。<o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体"><SPAN></SPAN>&nbsp; 4最后，达到事先要求的覆盖率。<o:p></o:p></SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 21pt"><SPAN lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">TrueCoverage给出的覆盖率是“语句覆盖”，是一种低强度的覆盖率，所以我们测试的项目，用TrueCoverage统计覆盖率后，应使其尽量趋近100%。<o:p></o:p></SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 21pt"><SPAN lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">TrueCoverage在我们的测试工作中是一个辅助、引导的角色，它本身并不能发现程序中的错误。它的作用是使我们能够了解当前测试达到的状况，并为进一步增强测试提供依据。<BR></SPAN></P>
<H2><A name=_Toc29347621><SPAN lang=EN-US>2.3 TrueCoverage和BoundsChecker的结合使用</SPAN></A></H2>
<P class=MsoNormal style="TEXT-INDENT: 21pt"><SPAN lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">TrueCoverage和BoundsChecker这两个工具可以结合起来使用。NuMega集成到VC++ IDE后，在TrueCoverage和BoundsChecker菜单下，都有一个菜单项</SPAN><STRONG><SPAN lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">[Rebuild with BoundsChecker and TrueCoverage</SPAN></STRONG><SPAN lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">]，通过这一菜单命令编译连接生成的可执行文件，在程序运行结束后，能同时得到</SPAN><SPAN lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">TrueCoverage和</SPAN><STRONG><SPAN lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">BoundsChecker（FinalCheck）的检测结果。</SPAN></STRONG><SPAN lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体"><o:p></o:p></SPAN></P>
<H2><A name=_Toc29347622><SPAN lang=EN-US>2.4 TrueTime</SPAN></A></H2>
<P class=MsoNormal style="TEXT-INDENT: 21pt"><SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">如何提高代码的运行效率，是开发过程中的一个重要问题。程序运行速度慢，但不容易找到是在哪里出了问题，查找性能瓶颈的位置就成为解决问题的关键。</SPAN><SPAN lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">TrueTime 就是一个对应用程序的运行性能进行分析，</SPAN><SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">查找程序性能瓶颈</SPAN><SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">的工具。</SPAN><SPAN lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体"><o:p></o:p></SPAN></P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">TrueTime 能收集、显示应用程序运行性能的相关数据，这些数据包括每个模块（EXE、DLL、OCX等）的运行性能， 每一个函数的运行性能，对于有源代码的部分，TrueTime还可以给出每一行代码</SPAN><SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">的运行性能。这些正是我们进行性能测试所需要的数据。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN> 
<P class=MsoNormal style="TEXT-INDENT: 21pt"><SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">使用<SPAN lang=EN-US>TrueTime的基本步骤是：<o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 21pt"><SPAN lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">1制定测试用例。TrueTime只能给出被执行过的代码的性能数据，未被执行的代码不会显示性能数据。<o:p></o:p></SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 21pt"><SPAN lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体"></SPAN><SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">这一步看起来好象与使用</SPAN><SPAN lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt">BoundsChecker</SPAN><SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">、</SPAN><SPAN lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt">TrueCoverages</SPAN><SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">的第一步一样，其实不然。在</SPAN><SPAN lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt">BoundsChecker</SPAN><SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">、</SPAN><SPAN lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt">TrueCoverages</SPAN><SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">中，要求</SPAN><SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">测试用例制定的尽可能详细、全面，但在<SPAN lang=EN-US>TrueTime 中没有这个要求，这是因为使用TrueTime的目的与前两者不一样。TrueTime用来测试程序的运行性能，但我们并不是对程序任何部分的性能都感兴趣，因此，我们只需要那些覆盖了想要了解其性能的功能部分的测试用例，比如：实际运行速度较慢的功能部分、需提供给用户性能指标的功能部分等。所以，在使用TrueTime测试程序的性能数据时，制定的测试用例是有针对性的，并不要求有多么多么的全面。<o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormalIndent><SPAN lang=EN-US style="FONT-FAMILY: 宋体">&nbsp; 2 </SPAN><SPAN style="FONT-FAMILY: 宋体">打开<SPAN lang=EN-US>TrueTime，启动被测试的程序，执行测试用例。TrueTime会在后台记录下程序的性能数据。</SPAN></SPAN><SPAN lang=EN-US style="FONT-FAMILY: 宋体"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 21pt"><SPAN lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">&nbsp;3 查看、分析、报告性能数据。在执行完有针对性的测试用例后，根据TrueTime提供的</SPAN><SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">性能数据，可以得出程序的性能测试报告。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<H1><A name=_Toc29347623><SPAN lang=EN-US>3结束</SPAN></A></H1>
<P class=MsoNormalIndent><SPAN lang=EN-US>BoundsChecker</SPAN><SPAN style="FONT-FAMILY: 宋体">、</SPAN><SPAN lang=EN-US>TrueCoverages</SPAN><SPAN style="FONT-FAMILY: 宋体">和</SPAN><SPAN lang=EN-US>TrueTime</SPAN><SPAN style="FONT-FAMILY: 宋体">在测试中的应用就介绍到这了。这三个工具，最适合应用的测试阶段是单元测试、集成测试阶段，当进行这两个测试阶段的工作时，可考虑使用这些工具。</SPAN><SPAN lang=EN-US><o:p></o:p></SPAN></P><BR>
<P class=MsoNormalIndent><BR></P><img src ="http://www.cnitblog.com/qiuyangzh/aggbug/4208.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/qiuyangzh/" target="_blank">qiuyangzh</a> 2005-11-09 17:21 <a href="http://www.cnitblog.com/qiuyangzh/archive/2005/11/09/4208.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>单元测试工具C++ Test(转载)</title><link>http://www.cnitblog.com/qiuyangzh/archive/2005/11/09/4186.html</link><dc:creator>qiuyangzh</dc:creator><author>qiuyangzh</author><pubDate>Wed, 09 Nov 2005 08:41:00 GMT</pubDate><guid>http://www.cnitblog.com/qiuyangzh/archive/2005/11/09/4186.html</guid><wfw:comment>http://www.cnitblog.com/qiuyangzh/comments/4186.html</wfw:comment><comments>http://www.cnitblog.com/qiuyangzh/archive/2005/11/09/4186.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/qiuyangzh/comments/commentRss/4186.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/qiuyangzh/services/trackbacks/4186.html</trackback:ping><description><![CDATA[<P>C++ Test是Parasoft公司出品的一个针对C/C++源代码进行自动化单元测试的工具。它可以对源代码进行三种测试：白盒测试、黑盒测试以及回归功测试。</P>
<P>白盒测试<BR>　　C++ Test对C/C++源代码进行分析，针对所有的类的成员函数（包括：公共的、保护的以及私有类型的）进行测试。测试的方法是判断当输入一个非法的参数时，有关函数能否正确处理。（Record命令）在此状态下软件针对指定的文件、类或者是函数自动生成测试用例。</P>
<P>黑盒测试<BR>　　不对源代码进行分析，并且只针对类的公共接口函数进行测试。（Play命令）<BR>在此状态下软件不自动生成测试用例，而是直接运行在"测试用例编辑器"中当前已有的测试用例（手工添加的）。</P>
<P>回归功测试<BR>　　在修改源代码后用原有的测试用例进行重新测试。（Play命令）<BR>　　建议在实际使用中首先用Record命令执行一遍白盒测试，让软件根据函数自动生成相应的测试用例，然后再根据需要手工添加一些测试用例，最后再通过Play命令执行一遍黑盒测试。</P>
<P>示例一<BR>　　假设我们要测试如下一个类的成员函数：int mode2(int nParam)，则在进行白盒测试时软件会自动为我们生成如下6个测试用例：<BR>　　nParam = 1, 0, -1, 2147483647, -2147483647, 230<BR>　　可以看出，软件测试用例的生成主要还是测试一些边界值，例如最大值、最小值、0等。<BR>示例二<BR>　　假设我们要测试如下一个类的成员函数：void strcpy(char* dest, char const * src)，则软件会自动生成如下9个测试用例：<BR>　　(1) dest = NULL, src = NULL<BR>　　(2) dest = "yPqKIJ!u_", src = NULL<BR>　　(3) dest = "", src = NULL<BR>　　(4) dest = NULL, src = "h)zn9b"<BR>　　(5) dest = "BsmC,/i=zI6CT}pX", src = "HcI{BeP(J"<BR>　　(6) dest = "", src = "% i?~TnON"<BR>　　(7) dest = NULL, src = ""<BR>　　(8) dest = "($MN&lt;n;^", src = ""<BR>　　(9) dest = "", src = ""<BR>　　可见，如果我们的代码在实现时没有对各种可能情况（尤其是边界条件）进行特殊处理的话，则通过C++Test可以方便地发现这些潜在的问题。此外，对于一些特殊的测试情况，我们还可以手工创建测试用例。此外，采用C++ Test也可以帮助我们检查程序的编码情况，判断是否严格按编码规范进行开发。</P>
<P>使用<BR>　　C++ Test的使用比较简单，即可以针对一个VC工程进行全面的测试，也可以一次只对一个C/C++源文件进行测试。<BR>在试用中发现，如果项目比较大时，最好不要直接对一个工程进行自动测试，而应按文件一个一个地测试，否则可会会导致程序死掉。由于其是采用JAVA技术开发的，所以在使用时最好使用运算速度较快的机器。</P><img src ="http://www.cnitblog.com/qiuyangzh/aggbug/4186.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/qiuyangzh/" target="_blank">qiuyangzh</a> 2005-11-09 16:41 <a href="http://www.cnitblog.com/qiuyangzh/archive/2005/11/09/4186.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CppUnit 的安装配置</title><link>http://www.cnitblog.com/qiuyangzh/archive/2005/07/14/976.html</link><dc:creator>qiuyangzh</dc:creator><author>qiuyangzh</author><pubDate>Thu, 14 Jul 2005 08:16:00 GMT</pubDate><guid>http://www.cnitblog.com/qiuyangzh/archive/2005/07/14/976.html</guid><wfw:comment>http://www.cnitblog.com/qiuyangzh/comments/976.html</wfw:comment><comments>http://www.cnitblog.com/qiuyangzh/archive/2005/07/14/976.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/qiuyangzh/comments/commentRss/976.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/qiuyangzh/services/trackbacks/976.html</trackback:ping><description><![CDATA[<p>&nbsp; CppUnit是一个很好的单元测试框架，它可以帮助我们组织针对C/C++的测试代码，让我们把精力放在编写测试代码上。根据自己在工作中的使用情况。我根据自己的使用过程，在本文中记录了如何在Windows和Linux/Unix上安装配置CppUnit。<br><br><strong>Winsows(选择开发环境为MS Visual C++ 6.0)<br></strong>需要如下五个步骤：<br>一 <br>下载CppUnit的介质（<a href="http://sourceforge.net/projects/cppunit">http://sourceforge.net/projects/cppunit</a>）。<br><br>二 <br>编译、安装CppUnit库。<br>在VC中打开CPPUNITHOME/src/CppUnitLibraries.dsw，选择&#8220;Build | Batch Build...&#8221;，选中所有的项目，点击build按钮。在CPPUNITHOME/lib/下生成所需要的所有库文件。<br>*CPPUNITHOME是CppUnit在你磁盘上的目录。下同。<br><br>三<br>在Visual C++中进行设置。<br>告诉VC在哪里能找到CppUnit中的程序文件和库文件：打开&#8220;Tools | Options...&#8221;，切换到'Directories'标签页，选择'include files'，添加CPPUNITHOME/include/；切换到'libraries files'标签页，添加CPPUNITHOME/lib/；切换到'source files'标签页，添加CPPUNITHOME/src/cppunit/，保存。<br><br>四<br>在测试代码中进行设置。<br>在VC中打开你写的测试程序，启动Project Settings对话框，切换到'C++'标签页，选择'Code generation'项，对于release版，选择'Multithreaded DLL'，对于Debug版，选择'Debug Multithreaded DLL'。同样是在这个标签页，选择'C++ langage'项，选择All Configurations，选择'enable Run-Time Type Information (RTTI)'。<br>切换到'Link'标签页，在'Object/library modules'中添入需要的lib文件cppunitX.lib （debug模式为cppunitd.lib, release 模式为cppunit.lib ）和testrunnerX.lib（debug模式为testrunnerd.lib， release 模式为testrunner.lib，debug Unicode模式为testrunnerud.lib， release Unicode模式为testrunneru.lib）<br><br>五<br>添加系统路径。<br>为使测试程序在运行时能找到CppUnit提供的dll，我们在环境变量中指出CppUnit提供的dll的路径：在我的电脑中，打开环境变量，编辑系统变量中的path变量，向其中添加CPPUNITHOME\lib，从新启动计算机，使设置生效。<br><br>OK，可以在你的测试代码中，使用CppUnit为你提供的功能了！<br><br><br><strong>RedHat Linux(其他Linux/UNIX类似，选择的编译器为gcc)</strong><br>需要如下三个步骤：<br>一&nbsp;<br>同样的，下载CppUnit的介质并拷贝到你的操作系统中。<br><br>二<br>进入CppUnit介质的目录，依次执行：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ./configure<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; make<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; make install<br>生成库文件。<br><br>三<br>将CppUnit生成的动态库文件所在的路径(默认是：/usr/local/lib)添加到/etc/ld.so.conf文件里，然后运行ldconfig。<br><br>OK，全部完成了！在编译连接程序时，使用-lcppunit，如g++ -lcppunit 1.cpp 2.cpp 3.cpp。<br><br>&nbsp; 关于具体如何使用CppUnit来编写测试代码，你可以参考这篇文章<a href="http://www-128.ibm.com/developerworks/cn/linux/l-cppunit/">http://www-128.ibm.com/developerworks/cn/linux/l-cppunit/</a><br>文章在IBM的developerworks网站上，作者是李群。我在第一次使用CppUnit时，向他请教过问题，他热情的给于了帮助。</p>
<img src ="http://www.cnitblog.com/qiuyangzh/aggbug/976.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/qiuyangzh/" target="_blank">qiuyangzh</a> 2005-07-14 16:16 <a href="http://www.cnitblog.com/qiuyangzh/archive/2005/07/14/976.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>单元测试工具Numega</title><link>http://www.cnitblog.com/qiuyangzh/archive/2005/07/14/975.html</link><dc:creator>qiuyangzh</dc:creator><author>qiuyangzh</author><pubDate>Thu, 14 Jul 2005 08:15:00 GMT</pubDate><guid>http://www.cnitblog.com/qiuyangzh/archive/2005/07/14/975.html</guid><wfw:comment>http://www.cnitblog.com/qiuyangzh/comments/975.html</wfw:comment><comments>http://www.cnitblog.com/qiuyangzh/archive/2005/07/14/975.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cnitblog.com/qiuyangzh/comments/commentRss/975.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/qiuyangzh/services/trackbacks/975.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1 前言我在本文中详细介绍了测试工具NuMega Devpartner(以下简称NuMega)的使用方法。NuMega是一个动态测试工具，主要应用于白盒测试。该工具的特点是学习简单、使用方便、功能有效。NuMega共有三个独立的子功能——BoundsChecker、TrueCoverage、TrueTime。BoundsChecker为代码检错工具，TrueCoverage为测试覆盖率统计...&nbsp;&nbsp;<a href='http://www.cnitblog.com/qiuyangzh/archive/2005/07/14/975.html'>阅读全文</a><img src ="http://www.cnitblog.com/qiuyangzh/aggbug/975.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/qiuyangzh/" target="_blank">qiuyangzh</a> 2005-07-14 16:15 <a href="http://www.cnitblog.com/qiuyangzh/archive/2005/07/14/975.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>