在淘宝内使用C++作为编程语言的机会并不多,CPPUNIT并不是主流的存在。但是随着业务的扩展,特别是安全客户端的全面上线,CppUnit测试变得越来越重要。 cppunit使用 一、获取cppunit源代码 使用svn进行checkout,地址为:https://cppunit.svn./svnroot/cppunit/trunk/cppunit 二、编译 1.首先运行VS2008(或者VS2005),导入该项目,路径如图: 2.转换 3.删除无用的dspplugin工程。 4.编译解决方案 编译整个解决方案,如果编译出错,则是因为编译器版本错误。 因为vc6为 7.0版本,vs2005为8.0,vs2008为 9.0,因此修改MsDevCallerListCtrl.cpp代码中67行为: 编译完成以后, 在cppunit根目录/lib/目录下,会生成若干lib,和dll文件, 都以cppunit开头. cppunitd表示debug版, cppunit表示release版。CppUnit为我们提供了两套框架库,一个为静态的lib,一个为动态的dll。其中项目cppunit为静态库,cppunit_dll为动态库,生成的库文件为: cppunit.lib:静态库release版; cppunitd.lib:静态库debug版; cppunit_dll.lib:动态库release版; cppunitd_dll.lib:动态库debug版; 基于静态库与动态库的主要区别为:1.涉及到内存的使用。2.静态库编译时使用,动态库运行时使用。 至此,我们就有了执行CPPUINT所需要的文件(.lib文件),剩下的事情,就是将这些文件运用到被测试的工程中去。 二、环境配置 环境配置如下操作: 1.在VS2008中点击 工具——选项——弹出的框中点击“项目和解决方案”边的+号——VC++目录——右侧“显示以下内容的目录”中选择“可执行文件”,添加 本机cppunit根目录lib 2.在“包含文件”中,添加 本机cppunit根目录include 3.同样,在库文件中,添加 本机cppunit根目录lib 三、新建测试项目 在VS2008中新建一个工程作为测试项目,在测试工程中也有一些需要配置的地方:右击测试项目,点击“属性” 在弹出的窗口中,依次点击“链接器”——输入——在最上方“配置”中,选择Debug,在右侧“附加依赖项”中加入: cppunit根目录libcppunitd.lib 然后,选择Release,在右侧“附加依赖项”中加入: cppunit根目录libcppunit.lib 至此,项目环境配置完成。 四、编码 CPPuint提供了与junit类似的单元测试框架,需要的代码如下: 1.头文件:DiskDataTestCase.h #if !defined(DISKDATA_TESTCASE_H_INCLUDED) #define DISKDATA_TESTCASE_H_INCLUDED #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include <cppunit/TestCase.h> //为了从基类TestCase派生新的测试类 #include <cppunit/extensions/HelperMacros.h> //方便快速定义测试类的宏 #include “DiskData.h” //被测试类的头文件,根据实际情况更改 class DiskDataTestCase : public CppUnit::TestCase { CPPUNIT_TEST_SUITE(DiskDataTestCase);//定义Test Suite的起点 CPPUNIT_TEST(loadTest);//定义Test Case,只有被CPPUNIT_TEST宏定义的函数,才会被当做测试用例运行 CPPUNIT_TEST(storeTest); CPPUNIT_TEST_SUITE_END();//定义Test Suite的终点 public: void setUp(); //在每个测试用例运行之前都会运行一次,主要进行数据库连接、初始化类等工作 void tearDown(); //每个测试用例运行之后运行一次,进行对象析构等工作 protected: void loadTest(); //CPPUNIT_TEST()宏定义中类的实现 void storeTest(); //CPPUNIT_TEST()宏定义中类的实现 private: DiskData *fixture; //被测试类指针 }; 接下来,只要实现CPPUNIT_TEST()宏定义中的类就好。在本例中,就是loadTest() 和 storeTest()这两个方法。 2.cpp文件: #include “DiskDataTestCase.h” CPPUNIT_TEST_SUITE_REGISTRATION(DiskDataTestCase); //添加注册过的test void DiskDataTestCase::setUp() { fixture = new DiskData(); } void DiskDataTestCase::tearDown() { delete fixture; fixture = NULL; } void DiskDataTestCase::loadTest() { // our load test logic } void DiskDataTestCase::storeTest() { // our store test logic } 3.mian函数 #include <cppunit/ui/mfc/TestRunner.h> #include <cppunit/extensions/TestFactoryRegistry.h> BOOL CMy_TestsApp::InitInstance() { …. // 声明Test Runner,用以注册的测试填入其中,并运行 CppUnit::MfcUi::TestRunner runner; //MFC界面方式 runner.addTest( CppUnit::TestFactoryRegistry::getRegistry().makeTest() ); runner.run(); return TRUE; } 这样,一套完整的cppunit配置就完成了,点击运行,就可以看到运行界面。 文中具体代码见: 五、assert CPPUNIT_ASSERT是一个宏,判断后面的参数是否正确,CPPUNIT还有很多宏,如 CPPUNIT_ASSERT(condition) // 确信condition为真 CPPUNIT_ASSERT_MESSAGE(message, condition) // 当condition为假时失败, 并打印message CPPUNIT_FAIL(message) // 当前测试失败, 并打印message CPPUNIT_ASSERT_EQUAL(expected, actual) // 确信两者相等 CPPUNIT_ASSERT_EQUAL_MESSAGE(message, expected, actual) // 失败的同时打印message CPPUNIT_ASSERT_DOUBLES_EQUAL(expected, actual, delta) // 当expected和actual之间差大于delta时失败 |
|