3、在启动程序中加入以下代码,以便运行“测试用例选择”对话框:
4、制作发行版
发行版需要做以下工作:
将Project的属性设置为Release(这将自动去除_DEBUG的声明);
从工程项目中去掉测试文件(即带有test前辍的文件);
3.1.2测试环境使用Visual C++,Windows非窗口应用程序
3.1.2.1前题:使用CppUnit1.6.2版,解压后,路径为x://cppunit-1.6.2;
在工程文件中配置测试框架使用环境:加入执行头文件的路径x://cppunit-1.6.2/include,加入导入库文件的路径x://cppunit-1.6.2/lib;
配置DEBUG(测试)版环境:
加入需要链接的静态测试框模块cppunitcd.lib(测试框架);
在Project Settings/C++/C++ Language中启用RTTI;
3.1.2.2建立测试用例:
1、以类名加前辍“Test”命名测试单元文件名,比如“CMabString”类的类文件名为MabString.cpp,则测试单元文件命名为TestMabString.cpp;
2、加入测试框架头文件以及要测试的单元头文件,以TestMabString为例:
头文件:testmabstring.h
3、测试示例同上;
3.2 C标准
3.2.1测试环境使用gcc,Linux非窗口应用程序
前题:使用check0.8.0版,解压后,路径为/xx/check-0.8.0;
配置测试框架使用环境(我建议采用标准组织推荐的使用Autoconf和Automake来生成配置文件configure和Makefile,因为使用它们可以建立符合国际标准的configure脚本 和Makefile文件,并且可以有效的建立压缩包和方便分发必需的文件(也方便在发行版中去除测试用例文件):
l 首先需编写configure.in文件,此文件用于Autoconf生成configure可执行脚本;configure.in的框架大致如下:
dnl 此文件用于生成configure脚本,
dnl AC_INIT的xxxx.h参数代表本目录下一个有效的文件名
AC_INIT(xxxx.h)
dnl AM_INIT_AUTOMAKE的两个参数分别是生成应用程序的版本及版本号,
dnl 可能有些版本的Autoconf和Automake不支持此宏
AM_INIT_AUTOMAKE(xxxx, x.x)
dnl 以下为编译依赖的检测
dnl Checks for programs.
AC_PROG_AWK
AC_PROG_CC
AC_PROG_INSTALL
AC_PROG_LN_S
dnl Checks for libraries.
AC_CHECK_LIB(check,suite_create)
dnl Checks for header files.
AM_CONFIG_HEADER(config.h)
dnl Checks for typedefs, structures, and compiler characteristics.
dnl Checks for library functions.
dnl 将Automake生成的Makefile.in文件输出为Makefile文件
AC_OUTPUT(Makefile)
(提示:autoscan可以生成configure.in文件的基本框架,但很基本,可其生成的configure.scan文件的基础补充,然后更名为configure.in)
l 编写Makefile.am文件,用于Automake生成Makefile.in文件,Makefile.am文件的大致框架如下:(其中xxxx为应用程序文件名,比如program.c文件的测试程序文件名我建议为check_program.c;)
(Makefile.am有很许多标记,可以参阅相应文档。但常用的如:noinst_PROGRAMS为生成的可执行文件,xxxx_SOURCES(应用程序名加后辍_SOURCES)为源文件列表,EXTRA_DIST为发布程序时不需要的文件列表(用此方法可以将测试文件去掉),INCLUDES为要包含的头文件路径,check的头文件位置在其安装目录下的src中;LDADD为要链接的库文件名,libcheck.a为check测试框架的库文件;)
使用Automake –a –-foreign来生成Makefile.in文件,--foreign是为了生成几个外部文件如install.sh等,如果已有这些文件则可以省略这个参数;
使用Autoconf来生成configure执行脚本;然后执行./configure来生成Makefile文件;
执行make来生成可执行程序;
3.2.2 建立测试用例:
1、以程序文件名加前辍“check_”命名测试单元文件名,比如money.c文件的测试单元文件命名为check_money.c;
2、加入测试框架头文件以及要测试的单元头文件,以check_money为例:
头文件:money.h;源文件:money.c;测试单元文件:check_money.c:
测试文件框架如下:
3.2.3 制作发行版:
制作发行版只须配置另外一份Makefile.am,在此文件中的源文件列表加入执行主体,即应用程序包含main函数的文件;也可在制作测试版的Makefile.am中加入发行版的配置,这样就可以直接生成测试版程序和发行版程序。
#ifdef _DEBUG //包括测试头文件 #include <msvc6/testrunner/TestRunner.h> #include <cppunit/extensions/TestFactoryRegistry.h> static AFX_EXTENSION_MODULE extTestRunner; #endif //以下为测试代码,此部分测试不会出现在发布版中 #ifdef _DEBUG TestRunner runner; runner.addTest ( CppUnit::TestFactoryRegistry::getRegistry().makeTest() ); runner.run (); #endif |
4、制作发行版
发行版需要做以下工作:
将Project的属性设置为Release(这将自动去除_DEBUG的声明);
从工程项目中去掉测试文件(即带有test前辍的文件);
3.1.2测试环境使用Visual C++,Windows非窗口应用程序
3.1.2.1前题:使用CppUnit1.6.2版,解压后,路径为x://cppunit-1.6.2;
在工程文件中配置测试框架使用环境:加入执行头文件的路径x://cppunit-1.6.2/include,加入导入库文件的路径x://cppunit-1.6.2/lib;
配置DEBUG(测试)版环境:
加入需要链接的静态测试框模块cppunitcd.lib(测试框架);
在Project Settings/C++/C++ Language中启用RTTI;
3.1.2.2建立测试用例:
1、以类名加前辍“Test”命名测试单元文件名,比如“CMabString”类的类文件名为MabString.cpp,则测试单元文件命名为TestMabString.cpp;
2、加入测试框架头文件以及要测试的单元头文件,以TestMabString为例:
头文件:testmabstring.h
3、测试示例同上;
3.2 C标准
3.2.1测试环境使用gcc,Linux非窗口应用程序
前题:使用check0.8.0版,解压后,路径为/xx/check-0.8.0;
配置测试框架使用环境(我建议采用标准组织推荐的使用Autoconf和Automake来生成配置文件configure和Makefile,因为使用它们可以建立符合国际标准的configure脚本 和Makefile文件,并且可以有效的建立压缩包和方便分发必需的文件(也方便在发行版中去除测试用例文件):
l 首先需编写configure.in文件,此文件用于Autoconf生成configure可执行脚本;configure.in的框架大致如下:
dnl 此文件用于生成configure脚本,
dnl AC_INIT的xxxx.h参数代表本目录下一个有效的文件名
AC_INIT(xxxx.h)
dnl AM_INIT_AUTOMAKE的两个参数分别是生成应用程序的版本及版本号,
dnl 可能有些版本的Autoconf和Automake不支持此宏
AM_INIT_AUTOMAKE(xxxx, x.x)
dnl 以下为编译依赖的检测
dnl Checks for programs.
AC_PROG_AWK
AC_PROG_CC
AC_PROG_INSTALL
AC_PROG_LN_S
dnl Checks for libraries.
AC_CHECK_LIB(check,suite_create)
dnl Checks for header files.
AM_CONFIG_HEADER(config.h)
dnl Checks for typedefs, structures, and compiler characteristics.
dnl Checks for library functions.
dnl 将Automake生成的Makefile.in文件输出为Makefile文件
AC_OUTPUT(Makefile)
(提示:autoscan可以生成configure.in文件的基本框架,但很基本,可其生成的configure.scan文件的基础补充,然后更名为configure.in)
l 编写Makefile.am文件,用于Automake生成Makefile.in文件,Makefile.am文件的大致框架如下:(其中xxxx为应用程序文件名,比如program.c文件的测试程序文件名我建议为check_program.c;)
TESTS = check_xxxx noinst_PROGRAMS=check_xxxx frame_path=xx/check-0.8.0 xxxx_docs =/ srcfilelist_1/ srcfilelist_2/ ......./ ..... xxxx_SOURCES=/ srcfilelist_1/ srcfilelist_2/ ....... EXTRA_DIST = $(xxxx_docs) INCLUDES = -I$(frame_path)/src -I$(other_path)/include LDADD= /$(frame_path)/src/libcheck.a CLEANFILES=*.*~ |
(Makefile.am有很许多标记,可以参阅相应文档。但常用的如:noinst_PROGRAMS为生成的可执行文件,xxxx_SOURCES(应用程序名加后辍_SOURCES)为源文件列表,EXTRA_DIST为发布程序时不需要的文件列表(用此方法可以将测试文件去掉),INCLUDES为要包含的头文件路径,check的头文件位置在其安装目录下的src中;LDADD为要链接的库文件名,libcheck.a为check测试框架的库文件;)
使用Automake –a –-foreign来生成Makefile.in文件,--foreign是为了生成几个外部文件如install.sh等,如果已有这些文件则可以省略这个参数;
使用Autoconf来生成configure执行脚本;然后执行./configure来生成Makefile文件;
执行make来生成可执行程序;
3.2.2 建立测试用例:
1、以程序文件名加前辍“check_”命名测试单元文件名,比如money.c文件的测试单元文件命名为check_money.c;
2、加入测试框架头文件以及要测试的单元头文件,以check_money为例:
头文件:money.h;源文件:money.c;测试单元文件:check_money.c:
测试文件框架如下:
#include <stdlib.h> #include <check.h> #include "money.h" /*建立必要的测试变量,Money为money.h中定义的结构struct money*/ Money *five_dollars; /*单元测试初始化函数*/ void setup (void) { five_dollars = money_create(5, "USD"); } /*单元测试结束函数*/ void teardown (void) { money_free (five_dollars); } /*单元测试用例,用例名为test_create*/ /*test functions: money_amout()*/ START_TEST(test_create) { /*功能性测试,属黑盒测试*/ /*normal test*/ fail_unless (money_amount(five_dollars) = = 5, "Amount not set correctly on creation"); fail_unless (strcmp(money_currency(five_dollars),"USD") = = 0, "Currency not set correctly on creation"); /*条件及错误路径测试,属白盒测试*/ /*extra test*/ } END_TEST /*单元测试用例,用例名为test_net_create*/ START_TEST(test_neg_create) { Money *m = money_create(-1, "USD"); fail_unless (m = = NULL, "NULL should be returned on attempt to create with a negative amount"); } END_TEST /*单元测试用例,用例名为test_net_create*/ START_TEST(test_zero_create) { Money *m = money_create(0, "USD"); fail_unless (money_amount(m) = = 0, "Zero is a valid amount of money"); } END_TEST /*单元测试组装,将所有单元测试组装到一个“箱子”里面,“箱子”名为Money*/ Suite *money_suite (void) { Suite *s = suite_create("Money"); /*测试用例分组*/ TCase *tc_core = tcase_create("Core"); TCase *tc_limits = tcase_create("Limits"); /*将分组加入“箱子” suite_add_tcase (s, tc_core); suite_add_tcase (s, tc_limits); /*分别将不同用例加入分组*/ tcase_add_test (tc_core, test_create); tcase_add_checked_fixture (tc_core, setup, teardown); /*此用例注册初始化和结束函数*/ /*以下用例将不注册初始化和结束函数*/ tcase_add_test (tc_limits, test_neg_create); tcase_add_test (tc_limits, test_zero_create); return s; } /*执行测试用例*/ int main (void) { int nf; Suite *s = money_suite(); SRunner *sr = srunner_create(s); srunner_run_all (sr, CK_NORMAL); nf = srunner_ntests_failed(sr); srunner_free(sr); suite_free(s); return (nf == 0) ? EXIT_SUCCESS : EXIT_FAILURE; } |
3.2.3 制作发行版:
制作发行版只须配置另外一份Makefile.am,在此文件中的源文件列表加入执行主体,即应用程序包含main函数的文件;也可在制作测试版的Makefile.am中加入发行版的配置,这样就可以直接生成测试版程序和发行版程序。