最近要使用CPPUNIT作單元測試,在網上找了一些資料後就按照流程走了一遍,如今將過程展現一下:函數
1.下載CPPUNIT的材料並編譯相關工程,得到以下的lib文件和dll文件。進入 CppUnit 1.12.1\src目錄下,打開 CppUnitLibraries.dsw,編譯其中的幾個工程:工具
cppunit:生成 cppunitd.lib
cppunit_dll:生成 cppunitd_dll.lib, cppunitd_dll.dll
TestRunner:生成 testrunnerud.dll, testrunnerud.lib
TestPlugInRunner:生成 TestPlugInRunnerd.exe
DllPlugInTester: 生成 DllPlugInTesterd.exe單元測試
這些生成的文件所有放在LIB文件夾中。下載下來後是dsw的工程,須要用vs2005將其轉換成sln工程後再編譯。測試
2.將CPPUnitProjectWizard.vsdir 、CPPUnitProjectWizard.vsz這兩個文件到vs安裝的根目錄下面。ui
這兩個文件路徑以下:cppunit-1.12.1\CPPUnitProjectWizardspa
3.複製CPPUnitProjectWizard 整個解決方案目錄到Microsoft Visual Studio 8\VC\VCWizards\CPPUnitProjectWizard\CPPUnitProjectWizard下code
4.在vs IDE的菜單欄中按照 工具--->選項---->項目和解決方案------->VC目錄中,分別設置CPPUNIT的INCLUDE文件和LIBunicode
文件。get
環境基本上就配好了。string
5.下面是個簡單的測試用例:
先建一個基於擴展mfc的動態庫工程DemoDll,再新建一個CDemo類(被測試類)
頭文件以下:
#pragma once class AFX_EXT_CLASS CDemo { public: CDemo(void); ~CDemo(void); public: int Add(int i); int Subtration(int i); public: int m_iOper; };
CPP文件以下:
#include "StdAfx.h" #include "Demo.h" CDemo::CDemo(void) { m_iOper = 0; } CDemo::~CDemo(void) { } int CDemo::Add(int i) { return m_iOper += i; } int CDemo::Subtration(int i) { return m_iOper -= i; }
在同個一解決方案下新建一個測試工程用於測試這個Demo類
新建一個基於Dialog的工程DemoMfcUnitTest。在項目屬性裏 連接器->輸入->附加依賴
項下輸入cppunitd_dll.lib 、testrunnerud.lib(注意是unicode版本)
在App類中 添加下列頭文件,若是有重複請刪除。
#include "stdafx.h" #include "DemoMfcUnitTest.h" #include "DemoMfcUnitTestDlg.h" #include "TDemoMfc_CDemo.h" #include "cppunit/extensions/TestFactoryRegistry.h" #include "cppunit/ui/mfc/TestRunner.h"
/*CDemoMfcUnitTestDlg dlg; m_pMainWnd = &dlg; INT_PTR nResponse = dlg.DoModal(); if (nResponse == IDOK) { // TODO: 在此處放置處理什麼時候用「肯定」來關閉 // 對話框的代碼 } else if (nResponse == IDCANCEL) { // TODO: 在此放置處理什麼時候用「取消」來關閉 // 對話框的代碼 } // 因爲對話框已關閉,因此將返回 FALSE 以便退出應用程序, // 而不是啓動應用程序的消息泵。 return FALSE;*/ #if TRUE CppUnit::MfcUi::TestRunner runner; CppUnit::TestFactoryRegistry ®istry = CppUnit::TestFactoryRegistry::getRegistry(CTDemoMfc_CDemo::RegCaseName()); runner.addTest(registry.makeTest()); runner.run(); #endif return TRUE;
#pragma once #include "cppunit/TestCase.h" #include "CppUnit/extensions/HelperMacros.h" #include <string.h> #include "../CDemo/Demo.h" // 被測試類 class CTDemoMfc_CDemo: public CppUnit::TestCase { // 宏定義 CPPUNIT_TEST_SUITE(CTDemoMfc_CDemo); // 開始聲明一個新的測試程序集 CPPUNIT_TEST(TestAdd); // 添加TestAdd測試函數到測試程序集 CPPUNIT_TEST(TestSubtration); // 添加TestSubtration測試函數到測試程序集 CPPUNIT_TEST_SUITE_END(); // 聲明結束 public: CTDemoMfc_CDemo(void); void TestAdd(); void TestSubtration(); static std::string RegCaseName() { return "CTDemoMfc_CDemo";} public: ~CTDemoMfc_CDemo(void); };
#include "StdAfx.h" #include "TDemoMfc_CDemo.h" #include "cppunit/extensions/TestFactoryRegistry.h" #include "cppunit/TestAssert.h" // 對指定程序集進行註冊 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(CTDemoMfc_CDemo,CTDemoMfc_CDemo::RegCaseName()); CTDemoMfc_CDemo::CTDemoMfc_CDemo(void) { } CTDemoMfc_CDemo::~CTDemoMfc_CDemo(void) { } void CTDemoMfc_CDemo::TestAdd() { CDemo cDemo; int iResult = cDemo.Add(10); // 宏判斷兩個值是否相等 CPPUNIT_ASSERT_EQUAL(iResult,10); } void CTDemoMfc_CDemo::TestSubtration() { CDemo cDemo; int iResult = cDemo.Subtration(10); // 宏判斷兩個值是否相等 CPPUNIT_ASSERT_EQUAL(iResult,-10); }