利用C++TEST进行单元测试
- 格式:pdf
- 大小:828.50 KB
- 文档页数:9
C语言中的软件测试与调试方法与工具C语言作为一种广泛使用的编程语言,对于软件测试与调试的需求十分重要。
本文将介绍C语言中常用的软件测试和调试方法以及相关工具,帮助读者更加有效地开发和调试C语言程序。
一、单元测试(Unit Testing)单元测试是针对程序中最小的可测试单元进行测试的一种方法。
在C语言中,最小的可测试单元是函数。
通过编写各种测试用例,对函数进行测试并验证其各个功能的正确性。
1.1 断言(Assertion)断言是单元测试中常用的一种方法,通过在程序中插入断言语句来检测特定条件是否为真。
如果断言条件为假,则表示该处存在问题,并会发出相应的警告或错误信息。
例如,以下代码段展示了如何使用断言来测试一个简单的C语言函数:```c#include <stdio.h>#include <assert.h>int sum(int a, int b) {assert(a >= 0 && b >= 0); // 断言a和b都大于等于0return a + b;int main() {int result = sum(3, -2);printf("Sum: %d\n", result);return 0;}```在上述代码中,我们使用assert宏来实现断言,判断a和b是否都大于等于0。
如果不满足条件,程序将会中止并输出相应的错误信息。
1.2 测试框架(Testing Framework)为了更加方便地进行单元测试,C语言中存在一些测试框架,可以帮助开发者进行自动化测试。
常用的C语言测试框架包括Check、Unity和Google Test等,它们提供了丰富的断言和测试组织能力。
以Check测试框架为例,以下是一个简单的示例:```c#include <check.h>START_TEST(test_sum_positive_numbers) {int result = sum(3, 2);ck_assert_int_eq(result, 5);START_TEST(test_sum_negative_numbers) {int result = sum(-3, -2);ck_assert_int_eq(result, -5);}Suite *sum_suite() {Suite *suite = suite_create("Sum");TCase *test_case = tcase_create("Core");tcase_add_test(test_case, test_sum_positive_numbers); tcase_add_test(test_case, test_sum_negative_numbers); suite_add_tcase(suite, test_case);return suite;}int main() {Suite *suite = sum_suite();SRunner *runner = srunner_create(suite);srunner_run_all(runner, CK_VERBOSE);int failed_count = srunner_ntests_failed(runner);srunner_free(runner);return (failed_count == 0) ? 0 : 1;}```上述代码使用了Check测试框架来进行单元测试。
PARASOFT 最终用户许可协议(缺) (3)教程概述 (3)前提条件 (3)样例ATM 应用程序 (3)C++test 介绍 (5)编码标准分析 (5)单元测试 (5)促进团队范围的部署 (6)利益 (7)AEP和C++test小组部署 (8)AEP如何工作 (8)支持AEP的C++test小组部署 (9)模块使用流程 (11)主要概念 (12)编码标准分析(Coding Standard Analysis) (12)单元测试(Unit Testing) (12)单元测试用例的类型 (13)工程配置(Project Configurations) (13)测试配置(Test Configurations) (14)C++test 图形用户接口(GUI) (15)选项卡位置 (16)快捷菜单 (16)第一课:创建一个C++test工程 (18)背景 (18)练习1:查看存在的工程配置 (18)练习2:创建工程 (19)从Visual C++工程文件中建立一个工程(Windows和Visual C++) (19)从命令行保存文件选项(make,Ant )(缺) (22)手动创建一个工程 (22)练习4:使用测试范围 (25)第二课:使用测试配置 (29)背景 (29)练习1:修改测试配置 (29)练习2:通过测试配置管理器(TCM)进行团队部署 (30)练习3:修改活动的测试配置 (31)第三课:执行编码标准分析 (32)背景 (32)练习1:用预定义的标准配置 (32)练习2:探索和改正违规 (33)练习3:从GUI和#pragma中设置禁用 (36)练习4:创建自定义标准配置 (38)练习5:生成HTML报告 (41)第四课:用源测试用例进行单元测试 (43)背景 (43)准备 (43)覆盖率 (43)前提条件 (44)调试器集成 (44)练习1:自动生成源单元测试 (45)练习2:查看结果 (45)练习3:分析测试覆盖率 (47)练习4:使用用户定义测试用例来提高覆盖率 (51)练习5:评审并验证函数的结果 (55)练习6:使用断言宏 (58)练习7:使用setUp和tearDown函数 (60)练习8:使用一个C++test测试包中的对象工厂 (62)练习9:使用和配置桩函数 (64)练习10:使用测试单元 (68)练习11:在桩函数中使用C++test的API函数 (72)练习12:生成HTML报告 (74)第五课:用本地测试用例进行单元测试 (75)背景: (75)准备 (75)练习1:自动生成异常测试的单元测试 (75)练习2:定位异常测试失败报告的位置 (77)练习3:对独立的函数微调测试条件 (79)练习4:自动生成回归测试包 (80)准备测试配置 (81)生成测试包 (83)练习5:分析测试覆盖率 (87)练习6:用对象库和用户定义用例提高测试覆盖率 (94)练习7:使用外部数据源 (101)练习8:通过用户定义测试用例验证功能性 (108)练习9:用桩函数来提高代码覆盖率 (110)练习10:生成HTML报告 (115)第六课:从Visual C++中测试 (117)背景 (117)练习1:配置Visual C++的集成测试参数 (118)练习2:从Visual C++中测试 (119)练习3:查看分析测试结果 (120)第七课:用命令行接开口测试(缺) (122)PARASOFT 最终用户许可协议(缺)教程概述本教程先向你介绍了C++test,然后提供一些关于如何使用C++test来进行编码标准分析和对一个例子ATM应用程序单元测试课程。
C++test一、C++test介绍C++Test是一个C/C++单元测试工具,自动测试任何C/C++类、函数或部件,而不需要您编写一个测试用例、测试驱动程序或桩调用。
C++Test能够自动测试代码构造(白盒测试)、测试代码的功能性(黑盒测试)和维护代码的完整性(回归测试)。
C++Test是一个易于使用的产品,能够适应任何开发生命周期。
通过将C++Test集成到开发过程中,您能够有效地防止软件错误,提高代码的稳定性,并自动化单元测试技术(这是极端编程过程的基础)。
功能描述:·静态测试C++Test内嵌了业界最出名的Effective C++(epcc)、More Effective C++(mepcc)、meyer-klaus(mk)以及Universal Code Standard(ucs)规范。
同时,它也集成了由parasoft累积出来的一些规范。
静态测试中,C++Test会对代码进行详尽的扫描,验证代码中是否存在和这些规范相冲突的地方,尽快的发现一些简单或低级错误,避免由它们带来的集成扩散。
·动态测试(白盒测试)C++Test提供了一种有效并且高效的方法执行白盒测试。
C++Test完全自动执行所有的白盒测试过程,自动生成和执行精心设计的测试用例。
自动标记任何运行失败,并以一种简单的图示化结构显示。
然后自动保存这些测试用例,能够方便地用于以后的回归测试。
由于C++Test能够自动生成桩函数,或允许你加入自己的桩函数,因此它能够测试引用外部对象的类。
换句话说,C++Test能够运行任何一个或一组类,并自动生成和执行一组测试用例,它们被设计成能够发现尽可能多的错误。
C++Test允许你定制白盒测试用例的生成,和在什么层次上(项目、文件、类或方法)执行测试。
·动态测试(黑盒测试)C++Test通过自动化黑盒测试的大部分操作,减轻了这类测试的负担。
你可以简单地输入测试用例输入,然后让C++Test运行测试用例并自动确定实际的输出结果。
C++Test介绍修订历史记录目录第一章 C++Test 特性 (2)第二章 C++Test 使用 (4)一.安装说明 (4)1.Windows下安装 (4)2.申请License (4)二.启动C++Test (6)1.从VC++里启动C++Test (6)2.传统启动C++Test (7)三.Linux下安装及启动 (8)四.C++Test快速测试 (9)1.打开被测文件 (9)2.静态测试 (11)3.动态测试 (13)4.生成报表 (15)第三章 C++Test高级功能 (18)一.导入VC++工程(Import VC++ project) (18)二.选择编译器(project configuration) (19)三.设置测试配置(test configuration ) (20)四.编码规则测试结果分析 (25)五.测试用例分析 (27)六.Data Source (32)七.桩函数设置 (39)八.导入导出测试用例 (42)九.Test Objects (44)十.覆盖率分析 (47)十一.回归测试 (51)十二.其他设置 (54)1.设置TCM (54)2.设置GRS (55)3.设置源代码编辑器和HTML浏览器 (56)第四章 RuleWizard定制规则 (58)一.启动RuleWizard (58)二.打开一个现有的规则 (59)三.设计一个新规则 (61)四.C++Test中导入自定义规则 (70)第一章 C++Test 特性C++Test是一个C/C++单元测试工具,自动测试任何C/C++类、函数或部件,而不需要您编写一个测试用例、测试驱动程序或桩调用。
C++Test能够自动测试代码构造(白盒测试)、测试代码的功能性(黑盒测试)和维护代码的完整性(回归测试)。
C++Test是一个易于使用的产品,能够适应任何开发生命周期。
通过将C++Test集成到开发过程中,您能够有效地防止软件错误,提高代码的稳定性,并自动化单元测试技术(这是极端编程过程的基础)。
C语言单元测试实例1. 什么是单元测试?单元测试是软件开发中的一种测试方法,用于验证程序的最小可测试单元(通常是函数)是否按照预期进行工作。
单元测试可以帮助开发人员快速发现和修复代码中的错误,提高软件质量和可靠性。
在C语言中,单元测试通常使用测试框架来编写和运行测试用例。
常见的C语言单元测试框架包括Unity、Check、CppUTest等。
这些框架提供了丰富的断言和测试工具,使得编写和执行单元测试变得更加方便和高效。
2. 单元测试的优势单元测试具有以下几个优势:2.1 提高代码质量通过编写单元测试,可以对代码进行全面的覆盖,发现潜在的bug和错误。
单元测试可以帮助开发人员及时修复问题,保证代码的质量。
2.2 改善代码设计为了编写可测试的代码,开发人员需要将代码分解为更小的模块,提高代码的可维护性和可测试性。
单元测试可以促使开发人员遵循良好的设计原则,如单一职责原则、依赖倒置原则等。
2.3 提高开发效率单元测试可以快速发现问题,减少调试时间。
通过自动化运行单元测试,可以快速验证代码的正确性,提高开发效率。
2.4 支持重构重构是改进代码质量的重要手段,但重构可能引入新的bug。
通过编写单元测试,可以确保重构后的代码仍然正确工作,提高重构的安全性。
3. C语言单元测试框架3.1 UnityUnity是一个轻量级的C语言单元测试框架,适用于嵌入式系统和低资源环境。
Unity提供了丰富的断言和测试工具,支持测试组织和运行。
以下是一个使用Unity编写的简单的单元测试示例:#include "unity.h"#include "my_math.h"void test_add(void) {TEST_ASSERT_EQUAL_INT(3, add(1, 2));}int main(void) {UNITY_BEGIN();RUN_TEST(test_add);return UNITY_END();}在上面的示例中,我们使用了TEST_ASSERT_EQUAL_INT宏来断言函数add的返回值是否等于3。
C语⾔单元测试对于开发来说,单元测试必不可少,对于开发来说,JUnit⾮常好,对于C++开发,也有CPPUnit可供使⽤,⽽对于传统的开发,就没有很好的⼯具可供使⽤,可以找到的有这么⼏个⼯具:1. CuTest -- CuTest(Cute Test)是⼀个⾮常简单的C语⾔单元测试⼯具。
在使⽤它的时候,只需要包含两个⽂件“CuTest.c CuTest.h”,然后就可以写测试⽤例,进⾏测试了。
它对⽤例⼏乎没有管理功能,报表输出也⾮常简单,可以⽤来试验单元测试的基本想法。
2. CUnit -- CUnit是⼀个轻型的C语⾔单元测试框架。
它提供了设计、管理、运⾏测试⽤例的功能。
它的报表功能⽐较强⼤,但是⽐较⿇烦,更适合于较⼤⼀些的项⽬。
3. Check -- 不错的⼯具。
在这⾥()给出了各种软件测试⼯具,没事可以研究⼀下。
CUnitCUnit基本Test Registry|------------------------------| |Suite '1' . . . . Suite 'N'| |--------------- ---------------| | | |Test '11' ... Test '1M' Test 'N1' ... Test 'NM'⼀次测试(Test Registry)可以运⾏多个测试包(Test Suite),⽽每个测试包可以包括多个测试⽤例(Test Case),每个测试⽤例⼜包含⼀个或者多个断⾔类的语句。
具体到程序的结构上,⼀次测试下辖多个Test Suite,它对应于程序中各个独⽴模块;⼀个Suite管理多个Test Case,它对应于模块内部函数实现。
每个Suite可以含有setup和teardown函数,分别在执⾏suite的前后调⽤。
CUnit测试模式CUnit使⽤四种不同的接⼝,供⽤户来运⾏测试和汇报测试结果:1. ⾃动输出到XML⽂件,⾮交互式2. 基本扩展编程⽅式,⾮交互式3. 控制台⽅式,交互式4. Curses图形接⼝,交互式注意1和2是⾮交互式的,4只能在Unix下使⽤,常⽤console,⽽且console是可以⼈机交互的。
使用 Visual Studio 进展 C++单元测试什么是单元测试?单元测试〔unit testing〕在软件开发领域有着悠久的历史。
在大多数有关单元测试的观念中都有这么一个共同的理念,即它们由一组独立的测试构成,其中每个测试针对一个单独的软件组件。
在过程式程序设计的代码中,“单元”一般来说指的就是函数,而在面对对象的代码中则指的是类。
而单元测试则做到了大型测试所不能做到的那些事情。
利用单元测试可以独立地对某一段代码进展测试。
我们可以将测试分组以便在某些特定条件下运行某些特定的测试,并在其他条件下运行另一些测试。
我们还可以快速定位错误。
假设认为在某段代码中存在着一个错误而且又可以在测试用具中使用这段代码的话,我们通常能够快速地编写出一段测试,看看我们所推想的错误是不是真的在那里。
〔一〕关于单元测试的一些流行误会〔反面即为单元测试的好处〕1.单元测试是在铺张时间一旦编码完成,开发人员总是会迫切期望进展软件的集成工作,这样他们就能够看到实际的系统开头启开工作了。
这在外表上看来是一项明显的进步,而象单元测试这样的活动或许会被看作是通往这个阶段点的道路上的障碍,推迟了对整个系统进展联调这种真正有意思的工作启动的时间。
在这种开发步骤中,真实意义上的进步被外表上的进步取代了。
系统能够正常工作的可能性是很小的,更多的状况是布满了各式各样的 Bug。
在实践中,这样一种开发步骤经常会导致这样的结果:软件甚至无法运行。
更进一步的结果是大量的时间将被花费在跟踪那些包含在独立单元里的简洁的 Bug 上面,在个别状况下,这些 Bug 或许是琐碎和微缺乏道的,但是总的来说,他们会导致在软件集成为一个系统时增加额外的工期,而且当这个系统投入使用时也无法确保它能够牢靠运行。
在实践工作中,进展了完整打算的单元测试和编写实际的代码所花费的精力大致上是一样的。
一旦完成了这些单元测试工作,很多 Bug 将被订正,在确信他们手头拥有稳定牢靠的部件的状况下,开发人员能够进展更高效的系统集成工作。
利用C++Test进行单元测试
一、安装C++Test
1、首先获取C++Test的安装压缩包Parasoft.C.Plus.Plus.Test.v6.0.0.5.rar;
将其解压后,会得到三个文件:
C++Test-60.Win32.exe
toolkit.dll
again.nfo
其中again.nfo文件不用去管它。
C++Test-60.Win32.exe文件是安装包,toolkit.dll文件是破解文件。
双击C++Test-60.Win32.exe安装C++Test到指定目录。
安装完成后,将安装路径下的C++Test\bin目录中toolkit.dll文件用破解文件覆盖。
启动C++Test,到help\license菜单下,在local license选项中expire time框中输入2009-01-01,password框中输入123456。
Check完成后,点击OK,关闭该对话框。
安装过程结束。
2、为了能使用C++Test测试linux下的C/C++程序,还必须安装cygwin。
首先获取包含GCC3.3.x版本的cygwin本地安装包。
安装过程中选择从本地安装:
安装过程中建议选择全部安装(install),而非缺省安装(default)。
另外,与编译器相关的选项全部选3.3.x版本(因为C++Test目前最高支持到GNU3.3.x版本)。
二、建立OLT软件的测试工程
利用C++Test的New Project wizard建立新的工程:其中编译器选GCC3.3.x,如下:
工程建立后,利用Project Configure,可以更改工程设置,OLT的测试工程各选项如下:编译器设置选项:
INCLUDE路径选项:
链接库选项:
工程相关参数设置完成后,可向工程中加入需测试.c文件,进行单元测试。
三、建立ONU软件的测试工程
ONU的测试工程由于与PAS6201的库需要链接,因此比要复杂些。
首先看一下工程的各配置项:
INCLUDE路径选项,还需包含PAS6201Project的INCLUDE:
链接选项中使用libPASONU.a:
另外,由于PASSAVE的头文件pasosal_ucos_expo.h中有些数据类型的定义与cygwin中有重复,因此,需要使用cygwin.h头文件替代pasosal_ucos_expo.h:
/*#include<PASOSAL/pasosal_ucos_expo.h>*/
#include<sys/cygwin.h>
(在测试完成后,仍需改回原来的头文件)
四、基础单元测试步骤
C++Test支持自动测试,也就是说单元测试用例可以自动产生,并自动执行。
针对某个.c文件的测试步骤如下:
首先,通过open file菜单将被测文件加入工程;
其次,利用build test菜单,对被测文件进行插桩及编译插桩后的文件;
编译没有错误,则output窗口输出如下:
随后,直接点击工具条中的test按钮即可开始代码静态分析及单元测试:
五、高级测试功能
通过以上描述,可以看出利用C++Test来进行单元测试是非常的简单。
但有时自动产生的测试用例并没有达到我们的预期,则我们需要手工增加或调整测试用例。
另外,C++Test还有很多高级的功能,可以帮助我们提高测试质量和效率,需要大家在测试过程中深入总结和研究。
C++Test的帮助文件可以通过他的Help菜单来打开。
大家可以看看它的在线帮助,应该会有用处。