1、安装配置
1.1 下载CppUnit
网址:http://sourceforge.net/projects/cppunit
1.2 编译、安装CppUnit库
将下载的cppunit-1.12.1.tar.gz解压,得到cppunit-1.12.1文件夹。在cppunit-1.12.1/src找到并打开CppUnitLibraries.dsw。选择vs2005菜单中的Build->Batch Build, 选中所有项目,点击build按钮。编译成功,会在cppunit-1.12.1/lib下生成所有库文件。
1.3 设置vs2005
打开’Tools’->’Options…’->’Projects and Solutions’->’VC++ Directories’。
在’Include files’加入:cppunit-1.12.1/include的路径
在’Library files’加入:cppunit-1.12.1/lib的路径
在’Source files’加入:cppunit-1.12.1/src的路径
点击’Ok’保存。
1.4 设置测试代码工程
VS2005中打开你写得测试程序,工程右击,选择’properties’, 在’Configuration Properties’->’C/C++’->’Code Generation’->’Runtime Library’, 对于release版,选择'Multithreaded DLL',对于Debug版,选择'Debug Multithreaded DLL'。
在’Configuration Properties’ -> ’C/C++’ -> ’Code Generation’ -> ’Language’ -> ’Enable Rn-Time Type Info’, 选择’yes’。
在’Configuration Properties’->’Linker’ -> ‘Input’ -> ‘Additional Dependencies’, 添入需要的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)
注:添加需要的lib文件也可以在代码中用#pragma comment(lib,”**.lib”)来添加。
1.5 添加dll路径
为使测试程序在运行时能找到CppUnit提供的dll,我们在环境变量中指出CppUnit提供的dll的路径:在我的电脑中,打开环境变量,编辑系统变量中的path变量,向其中添加CPPUNITHOME/lib,从新启动计算机,使设置生效。
注:也可以将需要的dll拷到测试程序的.exe所在目录下或者system32下,而不设环境变量。
2、例子
2.1 待被测试的类
myClass.h
- //myClass.h
- #ifndef MYCLASS_H
- #define MYCLASS_H
- class myClass
- {
- public:
- int add(int, int);
- int sub(int, int);
- };
- #endif
myClass.cpp
- //myClass.cpp
- #include "myClass.h"
- int myClass::add(int a, int b)
- {
- return a+b;
- }
- int myClass::sub(int a, int b)
- {
- return a-b;
- }
2.2 测试案例的类
CTestMyClass.h
- //CTestMyClass.h
- #ifndef CTESTMYCLASS_H
- #define CTESTMYCLASS_H
- #include "cppunit/TestCaller.h"
- #include "cppunit/extensions/HelperMacros.h"
- #include "cppunit/TestSuite.h"
- #pragma comment(lib,"cppunitd.lib")
- #pragma comment(lib,"testrunnerud.lib")
- class CTestMyClass:public CppUnit::TestFixture
- {
- CPPUNIT_TEST_SUITE(CTestMyClass);
- CPPUNIT_TEST(TestCase_1);
- CPPUNIT_TEST(TestCase_2);
- CPPUNIT_TEST(TestCase_3);
- CPPUNIT_TEST_SUITE_END();
- public:
- void setUp(){}
- void tearDown(){}
- void CTestMyClass::TestCase_1();
- void CTestMyClass::TestCase_2();
- void CTestMyClass::TestCase_3();
- };
- #endif
CTestMyClass.cpp
- //CTestMyClass.cpp
- #include "CTestMyClass.h"
- #include "myClass.h"
- CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(CTestMyClass, "mytest");
- void CTestMyClass::TestCase_1()
- {
- myClass *mc = new myClass;
- CPPUNIT_ASSERT_EQUAL(5,mc->add(2,3));
- delete mc;
- }
- void CTestMyClass::TestCase_2()
- {
- myClass *mc = new myClass;
- CPPUNIT_ASSERT_EQUAL(-1,mc->sub(2,3));
- delete mc;
- }
- void CTestMyClass::TestCase_3()
- {
- myClass *mc = new myClass;
- //CPPUNIT_ASSERT_EQUAL(2,3-1);
- int a = 4;
- CPPUNIT_ASSERT(4 == a);
- delete mc;
- }
2.3 运行测试用例
2.3.1 控制台程序
- // TestCppUnit1.cpp : Defines the entry point for the console application.
- //
- #include "stdafx.h"
- #include "CTestMyClass.h"
- #include "cppunit/TestCaller.h"
- #include "cppunit/extensions/HelperMacros.h"
- #include "cppunit/TestSuite.h"
- #include "cppunit/ui/text/TestRunner.h"
- #include "cppunit/TextOutputter.h"
- #include "cppunit/CompilerOutputter.h"
- #include <iostream>
- #include <fstream>
- using namespace std;
- int _tmain(int argc, _TCHAR* argv[])
- {
- CppUnit::Test *suite = CppUnit::TestFactoryRegistry::getRegistry("mytest").makeTest();
- CppUnit::TextUi::TestRunner runner;
- runner.addTest(suite);
- //print the result to the console
- //runner.setOutputter(new CppUnit::CompilerOutputter(&runner.result(), std::cerr));
- //print the result to the file of c:/outputfile.txt
- ofstream outfile;
- outfile.open("c://outputfile.txt",ios::out);
- runner.setOutputter(new CppUnit::TextOutputter(&runner.result(),outfile));
- runner.run();
- }
2.3.3 MFC程序
加入头文件:
- #include "CTestMyClass.h"
- #include "cppunit/TestCaller.h"
- #include "cppunit/extensions/HelperMacros.h"
- #include "cppunit/TestSuite.h"
- #include "cppunit/ui/text/TestRunner.h"
- #include "cppunit/ui/mfc/TestRunner.h"
- #include "cppunit/TextOutputter.h"
- #include "cppunit/CompilerOutputter.h"
调用run函数对测试用例进行测试:
- void CMyDlg::OnBnClickedButton1()
- {
- CppUnit::Test *suite = CppUnit::TestFactoryRegistry::getRegistry("mytest").makeTest();
- CppUnit::MfcUi::TestRunner runner;
- runner.addTest(suite);
- runner.run();
- }
3、未完成的课题
3.1在WinCE中使用
似乎CppUnit不能在wince的SDK下编过,网上也没有发现相应的资料。可以考虑将CppUnit中有用的代码找到,重新自己写,从而在WinCE上实现它。
3.2 CppUnit原码分析
CppUnit原码很好地运用了STL、设计模式等,而且难度适中,值得学习借鉴。而且网络上有不少人对其进行过研究。