搜档网
当前位置:搜档网 › C++test使用流程

C++test使用流程

C++test使用流程
C++test使用流程

C++test导入工程

一、准备工作

在导入C/C++工程前,需将C/C++文件(后缀名为.c或.cpp的文件)在Microsoft Visual C++ 6.0(或其他支持C/C++的编译器)中进行编译,在保证没有编译错误的情况下,才能够测试出工程中的错误。

通过编译后,C/C++工程文件夹中会生成dsw和dsp文件,这两类文件在后面的导入工程中要使用到的。C/C++工程在编译前的文件情况,如图1-1所示,编译后的文件情况如图1-2所示。

如果C/C++工程在导入前已经经过了编译,并且生成了dsw或dsp文件,则不需进行上述准备工作。

有的C/C++文件配有一个makefile文件来进行编译,但是前提是本机自带GCC编译器,故不推荐使用makefile来编译工程。

二、C++test导入工程

1.启动C++test,选择工作区(即C++test保存工程的路径),通常选择默认路径即可,如果想改变路径,点击“Browse”进行更换,如图2-1所示。

2.选择“Flie”->“New”->“Project”,如图2-2所示。

3.在“选择向导会话框”中选择“C++test”文件夹下的“Import Microsoft Visual 6.0 project”,点击“Next”,如图2-3所示。

4.在“导入工程会话框”中点击“Browse”选择工程路径,选择待测工程中的dsw文件,如图2-4所示。

5.在选择好待测工程后,可以点击“Next”进行其他相关设置,或者直接点击“Finish”完成导入。通常情况下,其他设置选择默认值即可,故可以直接点击“Finish”完场导入,如图2-5所示。

6.完成导入后,工程即出现在右侧的工程浏览器中,选中工程名,然后右键选择“Properties”,如图2-6所示。

7.在打开的“属性会话框”中,点击左侧的“C++test”,选择“Build Settings”,然后在右侧的“Compiler Settings”中的“Family”中选择“Microsoft Visual C++ 6.0”,点击右下角的“Apply”,最后点击“OK”完成属性设置。

三、其他导入方法

1. 链接到源文件

如果您更愿意将测试文件存储在与源文件分开的位置,或者如果您想要创建多个使用相同源文件的项目,请如下创建项目:

? 如下创建一个空项目:

a. 选择“File”->“New”->“C++ Project”。

b. 在“Project name”处输入项目的名称。

c. 单击“Finish”。

? 如下将您的源文件链接到该项目:

a. 选择“File”->“New”->“Folder”。

b. 选择在步骤1 中所创建项目的名称。

c. 单击“Advanced”按钮。

d. 启用“Link to folder in file system”选项。

e. 输入或浏览到源文件的位置。

f. 单击“Finish”完成。

2.使用CVS

? 选择“File ”-> “New”->“Project”。

? 选择“CVS”->“Projects from CVS”。

? 单击“Next”。

? 指定或选择相应的CVS 存储库。

? 单击“Finish”完成。

3.使用源目录作为项目位置

如果您的源文件没有位于CVS 中,且想要将测试文件存储在与源文件相同的位置,则请按如下方式创建项目:

? 选择“File”->“New”->“Project”-> “Standard Make C Project ”或“Standard Make C++ Project”。

? 在“Project name”处输入项目的名称。

? 禁用“Use default location”选项。

? 在“Location”处输入源文件的路径。

? (可选)如果您想要使用Eclipse 来构建项目,请单击“Next”,然后完成可用选项卡中的设置。

? 单击“Finish”完成。

C++test功能介绍

1.自动建立测试驱动和桩函数

C++Test自动建立一个测试驱动程序,其设计目标是极大化类的测试覆盖性和错误检测。为类建立测试驱动,你只要简单地打开这个类,然后按Build Test键。C++Test将自动建立测试驱动程序。

另外,如果被测的方法需要调用当时还不存在或无法访问的函数,C++Test能够自动生成桩函数;这样能够测试与外部资源操作的交互作用和不包含任何隐藏的弱点。C++Test 不是实际调用这些函数,而是调用桩函数并返回桩函数提供的值。如果你需要控制使用的返回值,你可以建立一个桩调用表,生命输入/输出的关系。

你还能加入用户定义的桩函数。例如,如果你要使用原始的函数,且该函数定义在不同的文件中;或者你想要仿真原始函数的行为,而用一个简单的函数替代它

自动生成C/C++类的测试驱动程序和桩函数的能力是C++Test所独有的;只有C++Test能够自动测试C/C++类(一当它能够编译时),而不需要用户的任何干预。使得你能够尽快地自动检测代码错误,以最容易、最省钱和最快速的方法找到和修正它们。如果没有这样的自动化工具,大量的时间和资源消耗将失去单元测试的潜在好处和现实意义。

2. 静态测试

C++Test内嵌了业界最出名的Effective C++(epcc)、More Effective C++(mepcc)、meyer-klaus(mk)以及Universal Code Standard(ucs)等超过700条的C/C++规范,用户自己还能自定义规范。同时,它也集成了由parasoft累积出来的一些规范。静态测试中,C++Test 会对代码进行详尽的扫描,验证代码中是否存在和这些规范相冲突的地方,尽快的发现一些简单或低级错误,避免由它们带来的集成扩散。

3. 白盒测试

C++Test提供了一种有效并且高效的方法执行白盒测试。C++Test完全自动执行所有的白盒测试过程,自动生成和执行精心设计的测试用例。自动标记任何运行失败,并以一种简单的图示化结构显示。然后自动保存这些测试用例,能够方便地用于以后的回归测试。

由于C++Test能够自动生成桩函数,或允许你加入自己的桩函数,因此它能够测试引用外部对象的类。换句话说,C++Test能够运行任何一个或一组类,并自动生成和执行一组测试用例,它们被设计成能够发现尽可能多的错误。

C++Test允许你定制白盒测试用例的生成,和在什么层次上(项目、文件、类或方法)执行测试。

4. 黑盒测试

C++Test通过自动化黑盒测试的大部分操作,减轻了这类测试的负担。特别是以两种方法自动化黑盒测试的第一阶段--建立测试用例:

·帮助你设置每个测试用例的结果

你可以简单地输入测试用例输入,然后让C++Test运行测试用例并自动确定实际的输出结果。如果结果正确,不需要其它动作。如果结果不正确,你可以输入预期的输出结果。这样比手工输入每个测试用例的结果更快更容易。

·自动生成测试用例的核心集合

C++Test自动设计了一组广谱的白盒测试用例。当使用这些测试用例在黑盒测试时,你只需简单地观察实际的输出结果,然后对任何不正确的结果输入预期的值。

当你需要输入或修改测试用例时,你可以在C++Test自动生成的测试用例框架种简单

地键入相应的值。这将显著地加快建立测试用例的过程。

在自动化建立黑盒测试用例的大多数步骤之外,C++Test完全自动化余下的黑盒测试步骤。按一个键,你能够对项目、文件、类或方法运行一个或一组。C++Test然后自动执行所有的测试用例,报告所有的输入/输出关系,并标记任何实际输出与预期不一致或导致程序崩溃的测试用例。

5. 回归测试

C++Test完全自动化与回归测试有关的所有步骤。C++Test首次测试某个类时,自动保存其测试和测试参数。当需要执行回归测试时,你可以打开合适的项目和文件,运行所有原来的白盒和黑盒测试用例;C++Test会自动运行完全相同的测试用例和测试参数,并告之发现的任何问题。这意味着你能够立即知道修改是否引入了任何错误。

6. 监视测试覆盖性

为了帮助你测量当前使用的测试用例集合的有效性,并且给你提供达到尽可能高的覆盖性的信息,C++Test自动监视测试覆盖性。

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

C++test界面介绍

C++test主界面如图1-1所示,包括主菜单栏、项目浏览器、编辑器视图和C++test视图。

1 File菜单有新建工程、打开文件、关闭、保存、重命名、刷新、转置行界定符、打印、转换工作空间、输入、输出和查看属性等功能,如图2-1所示。

2 Edit菜单有取消键入、重做、剪切、复制、粘贴、删除、全选和查找/替换等功能,如图2-2所示。

3 Navigate有跳转、打开类型层次关系、打开调用层次关系、打开包含浏览和打开声明等功能,如图2-3所示。

4 Search可以进行搜索,包括C/C++搜索、搜索、文件搜索和文本搜索等,如图2-4所示。

5 Project有打开工程、关闭工程、建立所有、建立配置和建立工程等功能,如图2-5所示。

6 C++test有用“Demo configuration”测试、测试记录、测试使用、测试配置、创建规则向导、输出、输入和显示视图等功能,如图2-6所示。

7 Run有设置断点、设置行断点、设置方法断点、设置检测点、略过所有断点、清除所有断点、运行和调试等功能,如图2-7所示。

8 Window有新建窗口、新建编辑器、打开视图、显示视图、用户自定义视图、视图另存为和重置视图等功能,如图2-8所示。

9 Help有欢迎、帮助内容、搜索、动态帮助和快捷键等功能,如图2-9所示。

Project Explorer将工程中的所有文件以树形结构列出,并显示文件类型,便于工程管理,如图3-1所示。

Editor view(编辑器视图)是工作台中最大的面板,C++test 在该视图中显示您打开进行编辑的源文件和测试文件的源码,如图4-1所示。

C++test 视图是C++test 列出其测试结果的地方。缺省情况下此视图是打开的,如果此视图不可用,则请选择“C++test > Show View > C++test(C++test > 显示视图> C++test)”将其打开,如图5-1所示。

C++test的安装

一、准备工作

1 说明:

C++test可以在Windows和Linux的平台下使用。基于Windows平台有两种版本:一种是独立于IDE的版本,另一种是IDE插件的版本。本安装说明主要针对独立IDE版本来进行说明的,以cpptest_7.2.8.8_win32为例。想要了解更多其他版本的C++test信息可到安装目录C:\Program Files\Parasoft\C++test7.2\manuals中查看指导手册,或是访问C++test官方网站https://www.sodocs.net/doc/8912032954.html,。

2 安装C++test软件满足的系统要求:

1)操作系统:Windows NT,Windows 2000,Windows XP,Windows 2003,Windows vista;2)硬盘空间:800M以上。

3 获取安装包:

向Parasoft官方或者英蓓特索取(support@https://www.sodocs.net/doc/8912032954.html,)

二、C++test安装

1双击安装文件,进入如图2-1的打开主界面,选择安装语言,单击“Next”进行下一步安装。

2进入如图2-2所示界面。

3进入如图2-3所示界面,单击“Next”进行C++test的安装。

4仔细阅读许可协议(单击Print可以打印阅读),单击“Yes”接受,进入如图2-5所示界面。

5单击“Browse”选择安装路径,然后单击“Next”得到安装过程如图2-6。

6准备安装C++test,单击“Back”可退回上一步,单击“Install”可进行安装,单击“Cancel”可推出安装。

7 单击“Install”后,进入如图2-7所示界面,正在安装C++test,需等待几分钟。

8 安装完后,选择是否创建桌面快捷方式,如图2-8所示。

9单击“Finish”完成安装,如图2-9所示。

C++test静态分析之Crules

一、准备工作

1.了解C++test静态分析

C++test 通过静态地分析代码,来执行代码规范静态分析,以检查与指定代码规范规则的一致性。此分析旨在通过以下措施防止错误,并改进代码质量:

·检测源码中明显或潜在的缺陷。

·防止使用可能有损安全性的代码。

·实施组织设计准则、规范(专用于应用程序的、专门用途的或专用于平台的)、以及从已知的特定错误中概括出来的错误预防准则。

·通过改进类设计和代码组织,而改进代码可维护性。

·通过应用常见的格式化、命名以及其它风格方面的约定,提高代码可读性。

2.导入待测工程

参照前面的方法,将A TM这个工程导入C++test,作为待测工程。

二、C++test静态分析之Crules

1.配置Crules

(1)在C++test下拉菜单下选择“Test Configurations(测试配置)”,如图2-1所示。

(2)在出现的窗口左侧,展开Static Analysis(静态分析)文件夹,右键单击Crules,选择Dupicate(副本),此后在User-defined文件夹下会出现Crules,如图2-2所示。

(3)选择User-defined文件夹下的Crules,在右边面板中选择Static,根据需要选择测试规则,或者直接使用默认选择的规则,单击Apply,然后单击Close,如图2-3所示。

2.运行Crules

(1)右键单击工程名ATM,选择C++test->Test Using->User-Defined->Crules,如图2-4所示。

(2)运行Crules过程,如图2-5所示。

3.查看运行Crules的结果

(1)选择C++test面板查看测试结果,如图2-6所示。

(2)右键单击违规项,选择View Rule Documentation,可以查看规则相关文档,程序员可据此修改代码错误,如图2-7所示。

(3)右键单击违规项,选择Suppress Task,在出现的对话框中填入抑制该违规项的原因,即可抑制违规项,如图2-8所示。

(4)再次运行Crules时,在任务栏中不再出现被抑制的违规项,如图2-9所示。

(5)如果想要取消抑制,选择Windows->Show View->Other,如图2-10所示。

(6)在出现的对话框中选择Suppressions,单击OK,如图2-11所示。

(7)在Suppressions面板中找到被抑制违规项,右键单击,选择Delete,即可取消抑制,重新运行Crules,被抑制项会重新出现在任务栏中,如图2-12所示。

4.自定义Crules规则

(1)在C++test下拉菜单下选择Launch RuleWizard,打开规则向导,如图2-13所示。

(2)在规则向导窗口中选择File->New->Rule,如图2-14所示。

(3)在新建规则窗口中的Dictionary中选择C,C++,在Statements中选择if,单击OK,如图2-15所示。

(4)在窗口的右边,右键单击被圈起来的if,选择Condition[…],如图2-16所示。

(5)在选择条件窗口中,打开Expressions文件夹下的Assignment文件夹,选择a=b,如图2-17所示。

(6)右键单击if,选择Create Output->Display,如图2-18所示。

(7)在用户自定义输出对话框里,输入avoid if(a=b) expression,单击OK,如图2-19所示。

(8)回到规则向导窗口,在右边空白处单击右键,在出现的下来菜单中选择Properties,如图2-20所示。

(9)在规则属性对话框中,填入相应规则信息,如图2-21所示。

(10)回到规则向导窗口,在右边空白处单击右键,在出现的下来菜单中选择Save或Save As,如图2-22所示。

(11)选择规则保存的路径,并为规则命名,如图2-23所示。

(12)在C++test下来菜单中选择Test Configurations,在测试配置窗口选择Crules,点击右边的Import按钮导入刚才自定义的if_assignment规则,如图2-24所示。

(13)在导入规则对话框中,点击Browse按钮,选择被导入规则路径,单击OK,如图2-25所示。

(14)自定义规则被导入后,在Rules Tree中会出现该规则,如图2-26所示。

C++test静态分析之BugDetective

一、准备工作

1. BugDetective的原理

BugDetective 是一类新的静态分析技术,该技术使用了几种分析技巧,包括模拟应用程序执行路径,以识别可能触发运行时缺陷的路径。检测到的缺陷包括,使用未初始化的内存、引用空指针、除数为零、内存和资源泄漏。

由于该分析涉及到识别和跟踪复杂路径,它会暴露通常可逃避编码规则静态分析和单元测试的错误,这些错误难以通过手动测试或检查找到。

对于那些具有遗留代码库和嵌入式代码(这些情况下,此类错误的运行时检测效果较差或根本不可能)的用户而言,BugDetective 可在不执行代码的情况下显露错误的功能,就特别重要。

BugDetective 独特的静态分析通过搜索代码中的“可疑点”,开始分析正在测试的源码。可疑点是潜在的错误点。这些可疑点在BugDetective 规则中被定义。只要识别了可疑点,BugDetective 就调查导致该可疑点的可能执行路径,并检查是否有任何确实违反BugDetective规则的路径存在。如果找到了这样的路径,就报告一个违例。

例如,检测可能的“除数为零”情形的规则就规定,任何使用了"/" 或"%" 运算符的点都是可疑的。然后它检查分母中的变量,在导致它为零的任何可能执行路径的点中,是否能保持零值。如果是的话,则会报告一条错误。

对于每个发现的错误,分层结构流路径数据都会详细准确地列出导致被识别错误的完整执行路径,并以显现出错误的那一代码行作为结束。为减少每个被发现问题的诊断和纠正所需要的时间和工作量,流路径详细信息还会补充扩展注释(例如,一条关于“避免引用空指针”违例的描述就包含这样的注释,描述哪些变量、在流路径的哪一点包含null 值)。

为使分析过程更灵活、更适合于项目的独特要求,可以参数化某些规则。因此,BugDetective 甚至可以用来检测与特定的API 使用相关的违例。

2. BugDetective的功能

Parasoft的静态代码分析技术支持基于数据流以及基于模式的这两种静态代码分析方法。Parasoft的这种基于数据流的静态代码分析技术被称为BugDetective,它能方便地为用户检测出跨越多个方法、类或者文件的运行时问题以及程序不稳定性因素(诸如空指针引用、数组越界、除零、SQL以及其它注入、资源泄漏以等)。

通过在应用程序甚至是相当复杂的应用程序(包含跨越多个方法、类和/或文件并且含有多个顺序调用路径的程序)中自动追踪及模拟其路径,BugDetective能及时发现很多程序中的缺陷,若通过人工测试的方法来查找这些缺陷是相当困难且耗时的,并且若将问题留到程序发布时来修改,往往会耗费巨大的资源。使用Parasoft BugDetective,开发者能在早期发现、诊断并且修复基于模式的静态代码分析和/或单元测试所不能检测到的软件错误。在早期发现这些缺陷能节省软件开发过程中花在诊断以及可能的重复工作上的大量时间。

3. 导入待测工程

BugDetective测试的项目非常多,以选取除零作为例,按照前面的方法导入divisionByZero

工程。

二、C++test静态分析之BugDetective

1.配置BugDetective

(1)在C++test下拉菜单下选择“Test Configurations(测试配置)”,如图2-1所示。

(2)在出现的窗口左侧,展开Static Analysis(静态分析)文件夹,右键单击BugDetective,选择Duplicate(副本),此后在User-defined文件夹下会出现BugDetective,如图2-2所示。

(3)选择User-defined文件夹下的BugDetective,在右边面板中选择Static,根据需要选择测试规则,在此选择Possible Bugs下的Avoid division by zero,单击Apply,然后单击Close,如图2-3所示。

2.运行BugDetective

(1)右键单击工程名divisionByZero,选择C++test->Test Using->User-Defined->BugDetective,如图2-4所示。

(2)运行BugDetective过程,如图2-5所示。

3.查看运行BugDetective的结果

(1)选择C++test面板查看测试结果,如图2-6所示。

(2)双击divisionByZero.c(18):p->daysWorkedInPassedMonth = 0,显示出错源代码的位置,如图2-7所示。

(3)将p->daysWorkedInPassedMonth = 0改为p->daysWorkedInPassedMonth = 1,保存后在测试,既不会再提示该错误,如图2-8所示。

C++test之单元测试

1. 单元测试的概念

“单元测试”是指在最简单的功能点测试软件代码,该功能点通常是单个类,或者一个函数。单元测试通常由开发人员在项目开发周期内执行,而不是在QA 阶段进行。通过使用单元测试,您可以确保应用程序构建块在集成之前的可靠性,从而提高整个应用程序的质量。如果测试进行得早,则识别和修正缺陷的难度通常较低,耗时也较少。

手动单元测试通常涉及手工编写测试集、指定输入数据以及为缺少的函数提供桩函数。C++test 可将这些结果自动化,以使得单元测试更有效率,更具一致性。

2. 单元测试的内容

通常,单元测试可能包括:

异常测试(也称为白盒测试、压力测试、结构测试或可靠性测试),用来确认代码的结构可靠性,能处理所有可行的输入以及输入组合,不会产生预料之外的异常。

功能测试,用于验证所建立模块是否符合需求和功能是否正常工作。在单元级别创建功能测试涉及到人工输入,以指定特定的输入和状态条件、以及预期的输出。功能测试可以作为白盒测试来实施(在了解接受测试的单元的内部组织和实现的情况下进行测试),或者黑盒测试,后者仅基于接受测试的单元的外部行为进行。

回归测试,用来验证现有代码行为不会随着代码库改进而更改。完成此测试的通常做法是,开发一组测试,验证它们的正确性,在代码更改之后运行它们,以捕获代码行为中的偏差。回归测试可能要依赖于异常测试(白盒测试)和功能测试(黑盒测试)。

3. C++test的单元测试功能

C++test 可以执行上述所有类型的单元测试;可以自定义所执行测试的级别和范围,以便体现您的需求和测试习惯。

当您运行C++test 自动生成的测试用例时,请执行异常测试(白盒测试)。此类测试可暴露意料之外的异常,并检查类在结构方面是否合理。可靠性测试能否成功,取决于代码是否能完全覆盖,因此必要时,您可能会想要扩展自动生成的测试用例,以增强代码覆盖率。C++test 可测量测试覆盖率,以有助于您评估覆盖率,并确定哪些地方需要附加测试。

当您扩展自动生成的测试用例,以验证类的公共接口是否按照规范所述运行时,请执行功能测试。

回归测试涉及到定期测试改进的代码库,其做法是运行所有可用的测试用例,并检查预期的结果是否发生更改。在当前测试的测试用例结果与预期的测试用例结果不匹配时,

C++test 会报告错误消息。

测试用例可以用C或C++源码实现和保存。您可以在IDE 的文本编辑器中扩展和修改生成的测试用例。这些测试用例使用与通用的CppUnit 格式类似的格式。C++test的测试提供了比CppUnit 更广泛的能力,包括可以测试C代码,并在测试框架内,提供对私有和保护成员数据以及成员函数的访问。现有的CppUnit 测试用例可以导入到C++test 中,与自动生成的测试用例配合使用。

4. C++test的测试用例生成

编写单元测试是一项重要结果,它确保了代码的质量。单元测试不仅能暴露错误和功能问题,而且能作为常规的回归测试运行,以有助于您确定代码的添加/修改是否破坏了现有功能,或者是否造成意外的更改。

不过,编写测试是一项耗时的工作,如果不仔细就可能会遗漏重要的情况。C++test 提供的单元测试支持,可帮助开发人员和测试人员非常快速地创建良好的单元测试。C++test 之所以能提供帮助,是因为它自动生成许多单元测试,允许用户自定义测试生成和执行,以符合他们的参数选择和需求。

C++test 自动生成大量测试用例,这些测试用例会试图执行代码中的所有不同路径,然后保存实际的测试用例结果。从本质上来讲,这些测试用例就好比在对代码的当前状态照x 射线,在修改代码之前拍摄代码运行情况的快照。它们还有助于识别可能影响代码可靠性和安全性的潜在异常状况。

C++test 可以为任何C/C++代码生成从单个函数到整个项目的测试用例。通过在C++test 中运行这些测试用例,您可以验证类的健壮性,识别可能造成程序进入不一致状态或终止状态的输入。您可以自定义预先配置的测试方式、以及特定的测试生成设置。

测试用例可以用C 或C++ 源码来实现和保存(所用语言取决于要测试的原始源码)。这些测试用例使用与通用的CppUnit 格式类似的格式。C++test 的测试提供了比CppUnit 更广泛的功能,包括可以测试C代码、并在测试框架内提供对私有和保护成员数据以及成员函数进行访问的功能。

现有CppUnit 测试用例可以导入到C++test 中,与自动生成的测试用例配合使用。可以通过用户定义的测试用例对测试套件进行扩展,以改进测试覆盖率并验证特定的功能;可以通过修改自动生成的测试用例、或定义新的测试用例,来添加这些测试。对于回归测试,可以自动验证和配置任何可用的测试用例。通过保存所有可用的测试用例,并充分将它们用于自动回归测试,您可以建立一个回归测试基础结构,快速地识别因代码修改而引入的意外功能更改和异常。

自动测试用例生成的功能,允许您在更短的时间内创建更有效的测试套件。测试用例的开发,历来是单元测试过程中最耗时的部分。通过使用C++test,您无需编写任何代码以生成一组使用每一个类的基础测试用例,您可以通过向自动生成的测试用例添加少量代码来创建更多的测试用例。通常,您无需为简单方法编写测试用例而担心,可以将资源集中于更复杂方法

的扩展/添加测试。

5. 导入待测工程

按照前面介绍的方法导入Cal_coverag工程作为待测工程。

二、C++test之单元测试

1.配置Unit Tests

(1)在C++test下拉菜单下选择“Test Configurations(测试配置)”,如图2-1所示。

(2)在出现的窗口左侧,展开Unit Tests(单元测试)文件夹,右键单击Generate Unit Tests(生成单元测试),选择Duplicate(副本),此后在User-defined文件夹下会出现Generate Unit Tests,同理生成Run Unit Tests的副本,然后单击Close关闭窗口,如图2-2所示。

2.运行Unit Tests

(1)在工程浏览器中选中Cal_coverage,右键选择C++test->Test Using->User-Defined->Generate Unit Tests,如图2-3所示。

(2)运行Generate Unit Tests之后,在工程浏览器的Cal_coverage目录下会出现一个名为tests 的文件夹,里面包含了测试用例,如图2-4所示。

(3)在工程浏览器中选中Cal_coverage,右键选择C++test->Test Using->User-Defined->Run Unit Tests,与(1)类似。

3.查看运行Unit Tests的结果

(1)选择C++test面板查看测试结果,如图2-5所示。

(2)双击[Line 56]Outcome:int _return=1,会提示自动生成的测试用例中相应的语句行,如图2-6所示。

(3)在C++test面板中,右键单击单元测试任务,选择Verify All Outcome,可以验证所有单元测试的任务,如果只需要验证其中某条任务,选中该任务,右键单击选择Verify Outcome 即可,如图2-7所示。

(4)选择某一条任务进行验证,对应的单元测试用例中代码会记录验证值,同时任务数会减少一个,如图2-8所示。

4. 根据覆盖率添加用户自定义测试用例

(1)在主菜单栏中选择C++test->Show View->Coverage,打开覆盖率面板,在编辑器视图

中会出现红绿条纹,绿色表示该语句被测试用例覆盖到了,红色则未覆盖到,如图2-9所示。

(2)在主菜单栏中选择C++test->Show View->Test Case Explorer,打开测试用例浏览器,然后选中自动生成的测试的名称(如TestSuite_Cal_coverage_c_1e843437等),如图2-10所示。

(3)在出现的测试用例向导窗口中,修改用户自定义测试用例名称,然后点击Next,如图2-11所示。

(4)由(1)知,flag=4,n2=0,result=0(n1任意取值)这组数据没有测试到,故在新建测试用例窗口中双击flag,将其值改为4,再将_return值改为0,单击Finish,如图2-12所示。

(5)在编辑器的测试用例代码中会多出一段用户自定义测试用例,如图2-13所示。

(6)如前所介绍的方法,再次运行单元测试,会发现所有的语句都被覆盖到了,覆盖率为100%(对比图2-9),如图2-14所示。

C++test之桩函数功能一、准备工作

1. 桩函数的概念

桩函数主要实现替代原函数的功能,使得单元测试过程中能将被测功能与外部依赖隔离。桩函数是单元测试的常用技术,它主要目的有二:

一、将被测试代码与集成环境隔离。首先是将不可控的、费时的实际系统隔离,例如访问网络、数据库、硬件等;其次是将复杂的底层系统隔离,采用相对简单的模拟系统来代替。

二、当被调函数不会影响当前测试函数的功能行为的时候,桩函数能够被使用,以使得单元测试的效率更高。

2. 桩函数的分类

C++test中桩函数按如下分类:

一、自定义桩函数:用户自定义的桩函数,自定义桩函数以"CppTest_Stub_"为前缀,如:

/* C++test user stub definition for int doSomething(int i) */

int ::CppTest_Stub_doSomething(int i)

{

return i + 10;

}

二。、安全桩函数:当代码中有使用到一些“危险”的函数,如(rmdir(), remove(), rename()等),C++test将自动生成安全桩函数,用以替换“危险”函数。如果使用者不希望C++test 自动生成安全桩函数,则可以在Test Configuration窗口中,选择Execution面板,从Use stubs found in删去${cpptest:cfg_dir}/safestubs,如图1-1所示:

三、自动生成的桩函数:C++test中提供一个测试配置,用户只需点击该配置即可针对所选择源文件或者原工程自动生成桩函数。

自动生成的桩函数与自定义的桩函数其主要差别在于:自定义的桩函数调用优先级别高于原函数,原函数的优先级别高于自动生成的桩函数。举个例子,假定在代码中能够找到某个函数的原本定义,此时自动生成桩函数是无效的,因为原函数优先级别高于自动生成的桩函数。

自定义桩函数可以带来的好处在于:调用原函数可能其返回值为一个固定值,不能返回一个期望值,以使得测试不同的代码分支。而桩函数的返回值,可由用户自由控制,因而具备更大的灵活性。

3. 导入待测工程

按照前面介绍的方法导入StubExample工程作为待测工程,由于该工程中涉及到头文件问题,故在使用桩函数过程时需要留意包含头文件语句的路径问题。

二、C++test之桩函数功能

1.运行单元测试

(1)按照前面介绍的方法对StubExample工程生成单元测试,然后运行单元测试,会发现没有任务报告,查看console(控制台)会发现连接错误,如图2-1所示。

(2)从源代码中,我们可以找到该发生链接错误的函数:

extern Buttons waitForUserChoice ();

该函数只声明未定义,这种情况下,我们要及时测试当前的代码,即可利用C++test自动生成桩函数的功能。

2.配置桩函数

在C++test下拉菜单中选Test Configurations(测试配置),选择左边的Builtin(内置)->Unit Testing(单元测试)->File Scope(文件范围)->Generate Stubs(生成桩函数),右键单击Generate Stubs,选择Duplicate(副本),单击Close关闭窗口,如图2-2所示。

3.生成桩函数

(1)右键单击StubExample工程,选择C++test->Test Using(使用测试)->User-Defined(用户定义)->Generate Stubs(生成桩函数),如图2-3所示。

(2)生成了桩函数后,在工程浏览器的StubExample工程下会出现一个名为stubs的文件夹,如图2-4所示。

(3)自动生成的桩函数中实现了waitForUserChoice()函数,根据整个工程的内部结构会发现,该函数需包含头文件stubexample.hpp,在此处,对于路径问题不甚了解的用户可以将问题简单化,直接将原工程中的stubexample.hpp拷贝到C:\Documents and Settings\Administrator\Parasoft\cpptest\workspace\StubExample\stubs\autogenerated下,即C++test的工作区相应的位置,然后在auto_1fbe126f.cpp源代码中加入#include "stubexample.hpp"(不区分大小写),然后点击保存,如图2-5所示。

4.查看结果

在为桩函数添加了头文件后,选择C++test->Test Using(使用测试)->User-Defined(用户定义)->Run Unit Tests(运行单元测试),从覆盖率信息中,可以发现函数user_input_handler_ex()中,部分代码行未被覆盖,如图2-6所示。此时我们可以通过修改桩函数的内容,让该桩函数返回不同的返回值,从而使其能够覆盖所有代码行。

5.自定义桩函数

(1)选择StubExample工程,右键单击C++test ->Test Using(使用测试)-> Builtin(内置)-> Unit Testing(单元测试)-> Collect Stub Information(收集桩函数信息),如图2-7所示。

(2)在C++test下拉菜单中选择Show View(显示视图)->Stubs(桩函数),如图2-8所示。

(3)桩函数信息收集完后,查看桩函数面板,可以看到waitForUserChoice()函数的Definition 为Auto,表示该函数目前使用自动生成的桩函数,其他两个函数为Original,为StubExample.cpp中原有的函数,如图2-9所示。

(4)右键单击函数waitForUserChoice(),选择Create User Stub(创建用户桩函数),如图2-10所示。

(5) 在弹出的对话框中,键入自定义桩函数文件名称,如userdefined.cpp,单击Finish完成,如图2-11所示。

(6)打开新生成的userdefined.cpp源文件,修改桩函数内容,如下:

::Buttons waitForUserChoice ();

::Buttons CppTest_Stub_waitForUserChoice (void)

{

if (CppTest_IsCurrentTestCase("test_user_input_handler_ex_1"))

{

return ::BUTTON_CNCL;

}

else if(CppTest_IsCurrentTestCase("test_user_input_handler_ex_2"))

{

return ::BUTTON_SUM;

}

else

{

return ::BUTTON_A VRG;

}

}

然后可参照前面的生成桩函数(3),对userdefined.cpp添加头文件stubexample.hpp,如图2-12所示。

(7)添加了自定义桩函数后,再次运行单元测试,覆盖率提高到了92%(参照图2-6),如图2-13所示。

C++test之回归测试

一、准备工作

1. 回归测试的概念

每当软件发生变化时,我们就必须重新测试现有的功能,以便确定修改是否达到了预期的目的,检查修改是否损害了原有的正常功能。同时,还需要补充新的测试用例来测试新的或被修改了的功能,为了验证修改的正确性及其影响就需要进行回归测试。

2. 回归测试的目的

回归测试可以有效防止由于修改代码或者新增代码造成原本正常的功能出现不正常的现象发生;修改有可能产生副作用从而导致软件未被修改的部分产生新的问题,使本来工作正常的功能产生错误。同样,在有新代码加入软件的时候,除了新加入的代码中有可能含有错误外,新代码还有可能对原有的代码带来影响。因此,每当软件发生变化时,我们就必须重新测试现有的功能,以便确定修改是否达到了预期的目的,检查修改是否损害了原有的正常功能。同时,还需要补充新的测试用例来测试新的或被修改了的功能。为了验证修改的正确性及其影响就需要进行回归测试。

举例来说,一般而言,一个项目会可能会划分成几个阶段进行实施。项目第一阶段完成后,通过测试发现第一阶段需要实现的功能均已经正常。项目进入第二阶段,实现新的功能,在新加入代码过程中,可能导致原本正常功能发生错误。回归测试的目的就是测试新引入的代码是否导致原本正常功能受损。

3. 回归测试的难点

回归测试作为软件生命周期的一个组成部分,在整个软件测试过程中占有很大的工作量比重,软件开发的各个阶段都会进行多次回归测试。在渐进和快速迭代开发中,新版本的连续发布使回归测试进行的更加频繁,而在极端编程方法中,更是要求每天都进行若干次回归测试。因此,通过选择正确的回归测试策略来改进回归测试的效率和有效性是非常有意义的。

4. C++test如何实现回归测试

C++test单元测试后,会将每个测试用例的返回值在测试结果面板的Outcome中显示出来,使用者需要验证返回值是否是预期值,一旦验证之后,C++test即可记住该验证值。当下次测试时,C++test会自动比较最新的返回值与之前验证值是否一致,如果不一致,C++test 将报告一个回归性错误提示,提醒使用者其可能是一个回归性错误。

5. 导入待测工程

按照前面介绍的方法导入Cal_coverage工程作为待测工程,然后生成单元测试用例,并运行

单元测试,得到任务报告。

二、C++test之回归测试

1. 验证结果

(1)打开C++test面板查看测试结果,展开测试TestSuite_Cal_coverage_c_13beb5ae_test_calculate_1,可查看其返回值Outcome:int_return=1,如图2-1所示。

(2)双击[Line 56]Outcome:int_return=1,查看验证前对应测试用例源代码,如图2-2所示。

(3) 右键点击[Line 56]Outcome:int_return=1,选择Verify Outcome进行验证,如图2-3所示。

(4)验证后,会发现对应测试用例源代码改变,并且任务报告减少为9个,如图2-4所示。

2. 模拟回归测试

(1)验证之后,模拟一个回归性错误产生场景:将原函数的case 4分支中result = n1 / n2改为result = n1 * n2,然后保存,如图2-5所示。

(2)对Cal_coverage工程重新运行单元测试,C++test会报告一个Assertion failed错误,提示期望值为1,但实际值为16,如图2-6所示。

3. 生成回归测试套件

(1)在确定了期望值后,右键单击[10]TestSuite_Cal_coverage_c.c,选择V erify All Outcome(验证所有结果),可以记录所有测试用例的验证值,如图2-7所示。

(2)此时再次按照模拟回归测试中的方法修改原函数,重新进行单元测试,会发现涉及flag=4的都提示期望值与结果不一致,如图2-8所示。

(3)另外通过Test Using(使用测试)->Builtin(内置)->Unit Testing(单元测试)->Generate Regression Base(生成回归测试基)也可验证所有结果,如图2-9所示。

相关主题