Linux下Cppunit的簡單運用
作業系統:
軟體版本:cppunit-1.12.0.tar.gz
程式碼除錯通過
一、 CppUnit的原理
先簡單介紹幾個CppUnit的基本術語:
1、Fixture:一個或一組測試用例的測試物件。可以是你要測試的物件或者函式。
2、TestCase:測試用例。是對測試物件的某個功能或流程編寫的測試程式碼。對一個Fixture,可能有多個測試用例。
3、TestSuite:同時執行的測試用例的集合。可以是一個fixture的多個測試函式、也可以是多個fixture的所有測試用例。
使用時,在測試的主檔案中將TestCase註冊到TestSuite中,並執行。
二、 下載與安裝
可以在http://sourceforge.net/projects/cppunit/找到最新的原始碼並下載至本地。我下載的版本是cppunit-1.12.0.tar.gz
解壓:tar -zxvf cppunit-1.12.0.tar.gz
進入cppunit-1.12.0的目錄
//因為我是非root使用者,沒有對/usr/local/lib/和/usr/include的相應許可權,//所以將安裝的根目錄設定為我的個人目錄
.configure –prefix=/home/me
make
make install
這樣,庫檔案就複製到/home/me了。
還要將cppunit-1.12.0中的標頭檔案include複製到/home/me中。
三、利用cppunit建立測試的一般框架
通常將測試程式碼和被測的程式碼放在不同的工程裡面,以免對我們要測試的程式碼造成汙染,這也是運用cppunit的優點之一吧。
這樣我們便有兩個工程:
其一、待測工程:~/money
有兩個檔案:
Money.h
Money.cpp
- /**********************************************
- Money.h
- ***********************************************/
- #ifndef _MONEY_H
- #define _MONEY_H
- #include <iostream>
- #include <string>
- using namespace std;
- class CMoney
- {
- public:
- CMoney( double amount, string currency )
- : m_amount( amount )
- , m_currency( currency )
- {
- }
- ~CMoney(){}
- double GetAmount() const;
- string GetCurrency() const;
- bool operator ==( const CMoney &other ) const;
- bool operator !=( const CMoney &other ) const;
- CMoney &operator +=( const CMoney &other );
- private:
- double m_amount;
- string m_currency;
- };
- #endif
- /*********************************************
- Money.cpp
- ***********************************************/
- #include <iostream>
- #include <string>
- #include "Money.h"
- using namespace std;
- double CMoney::GetAmount() const
- {
- return m_amount;
- }
- string CMoney::GetCurrency() const
- {
- return m_currency;
- }
- bool CMoney::operator ==( const CMoney &other ) const
- {
- return ((m_amount == other.m_amount) &&
- (m_currency == other.m_currency));
- }
- bool CMoney::operator !=( const CMoney &other ) const
- {
- return !(*this == other);
- }
- CMoney &CMoney::operator +=( const CMoney &other )
- {
- if ( m_currency != other.m_currency )
- cout << "Incompatible moneys" << endl;
- m_amount += other.m_amount;
- return *this;
- }
測試工程:~/MoneyTest
該工程下有三個檔案:
Money_Test.h
Money_Test.cpp
Money_Test_Main.cpp
這三個檔案的作用分別是:
Money_Test.h:宣告一個TestSuite,並將你所需要的測試用例都在此處進行宣告
Mone_Test.cpp:編寫測試用例
Money_Test_Main.cpp:執行測試。該檔案與具體的測試用例無關。
- /*******************************************
- Money_Test.h
- 2010.5.28
- ********************************************/
- #ifndef _MONEY_TEST_H
- #define _MONEY_TEST_H
- #include "cppunit/extensions/HelperMacros.h"
- #include "Money.h"
- class CMoneyTest:public CppUnit::TestFixture
- {
- /*宣告一個TestSuite*/
- CPPUNIT_TEST_SUITE(CMoneyTest);
- /*新增測試用例到TestSuite,定義新的測試用例都要在這裡宣告;
- 如果此處未宣告某個測試用例,程式編譯和執行都不會報錯
- 僅僅是該測試用例不會被執行。
- */
- CPPUNIT_TEST(testConstructor);
- CPPUNIT_TEST(testOptorEqual);
- CPPUNIT_TEST(testOptorNotEqual);
- CPPUNIT_TEST(testOptorAdd);
- /*TestSuite宣告完成*/
- CPPUNIT_TEST_SUITE_END();
- public:
- CMoneyTest(){}
- /*初始化 */
- void setUp();
- /*清除動作 */
- void tearDown();
- /*test app in Money.cpp*/
- /*test case */
- void testConstructor();
- void testOptorEqual();
- void testOptorNotEqual();
- void testOptorAdd();
- };
- #endif
- /************************************
- Money_Test.cpp
- 5.28
- ****************************************/
- #include "Money_Test.h"
- #include "Money.h"
- #include <string>
- using namespace std;
- /* 將該TestSuite註冊到名字為“alltest”的TestSuite中,如果未定義會自動定義,也可以使用CPPUNIT_TEST_SUITE_REGISTRATION( MathTest );定義到全域性未命名的TestSuite中 */
- CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(CMoneyTest,"alltest");
- /*初始化動作*/
- void CMoneyTest::setUp()
- {
- }
- /*清除動作*/
- void CMoneyTest::tearDown()
- {
- }
- /*編寫測試用例,
- 此處編寫四個用例分別來測試CMoney類的四個成員函式*/
- /*test app in Money.cpp*/
- /*test constructor*/
- void CMoneyTest::testConstructor()
- {
- double dNum = 22124.44;
- string sCurrency = "DD";
- CMoney MyMoney(dNum, sCurrency);
- CPPUNIT_ASSERT_EQUAL(dNum, MyMoney.GetAmount());
- CPPUNIT_ASSERT_EQUAL(sCurrency, MyMoney.GetCurrency());
- }
- /*test operator ==()*/
- void CMoneyTest::testOptorEqual()
- {
- // Set up
- const CMoney money123FF( 123, "FF" );
- const CMoney money123USD( 123, "USD" );
- const CMoney money12FF( 12, "FF" );
- const CMoney money12USD( 12, "USD" );
- // Process & Check
- CPPUNIT_ASSERT(money123FF == money123FF); // ==
- CPPUNIT_ASSERT(!(money12FF == money123FF)); // != amount
- CPPUNIT_ASSERT(!(money123USD == money123FF)); // != currency
- CPPUNIT_ASSERT(!(money12USD == money123FF));
- // != currency and != amount
- }
- /*test operator!=()*/
- void CMoneyTest::testOptorNotEqual()
- {
- // Set up
- const CMoney money123FF( 123, "FF" );
- const CMoney money123USD( 123, "USD" );
- const CMoney money12FF( 12, "FF" );
- const CMoney money12USD( 12, "USD" );
- // Process & Check
- CPPUNIT_ASSERT(!(money123FF != money123FF)); // ==
- CPPUNIT_ASSERT(money12FF != money123FF); // != amount
- CPPUNIT_ASSERT(money123USD != money123FF); // != currency
- CPPUNIT_ASSERT(money12USD != money123FF);
- // != currency and != amount
- }
- /*test operator+=()*/
- void CMoneyTest::testOptorAdd()
- {
- // Set up
- const CMoney money12FF( 12, "FF" );
- const CMoney expectedMoney( 135, "FF" );
- // Process
- CMoney money( 123, "FF" );
- money += money12FF;
- // Check
- CPPUNIT_ASSERT( expectedMoney == money ); // add works
- }
- /****************************************************
- Money_Test_Main.cpp
- 2010.5.28
- ********************************************************/
- #include <cppunit/extensions/TestFactoryRegistry.h>
- #include <cppunit/ui/text/TestRunner.h>
- int main()
- {
- CppUnit::TextUi::TestRunner runner;
- /*從註冊的TestSuite獲取特定的TestSuite,
- 沒有引數的話則獲取未命名的TestSuite*/
- CppUnit::TestFactoryRegistry ®istry = CppUnit::TestFactoryRegistry::getRegistry("alltest");
- /*新增這個TestSuite到TestRunner中*/
- runner.addTest(registry.makeTest());
- /*執行測試*/
- runner.run();
- }
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時失敗
關於CPPUNIT_ASSERT_EQUAL還有一點要說明,該巨集對於expected和actual是有要求的,也就是所謂的Requirement:
- 具有相同的型別(比如都是std::string)
- 可以使用<<序列化到std::strstream(assertion_traits<T>::toString中指明)
- 能用==作比較(assertion_traits<T>::equal中指明)
不過,後兩條可以通過為assertion_traits定製特化版本去除掉。
四、編譯與除錯
編譯、連結動態庫:
g++ -o test Money_Test.cpp Money_Test_Main.cpp ~/money/Money.cpp -I ~/money -I ~/cppunit/include -lcppunit -ldl -L ~/cppunit/lib
執行前要將共享庫的目錄放到LD_LIBRARY_PATH中。
export LD_LIBRARY_PATH=~/cppunit/lib:$LD_LIBRARY_PATH
執行:
./test
測試結果:
OK (4 tests)
說明所寫的4個測試用例均成功。
參考資料
Tx7do@上海半丁 Linux下的CppUnit 的HelloWorld手記
李群:便利的開發工具 CppUnit 快速使用指南
http://www.ibm.com/developerworks/cn/linux/l-cppunit/index.html
CppUnit使用指南
相關文章
- golang 切片簡單運用Golang
- 策略模式簡單運用模式
- Python Requests簡單運用Python
- linux下mail的簡單用法LinuxAI
- linux下oracle的簡單操作LinuxOracle
- Linux下GPG的簡單使用Linux
- linux下lvm的簡單操作LinuxLVM
- vue.js:最簡單的v-if運用Vue.js
- shell指令碼的一則簡單運用案例指令碼
- js物件的屬性的運用簡單介紹JS物件
- Linux下getopt()函式的簡單使用Linux函式
- iPython在Linux下的簡單使用PythonLinux
- 運用node實現簡單爬蟲爬蟲
- Linux下selinux簡單梳理Linux
- Linux下history命令簡單原理Linux
- 寫了一個簡單的Linux Shell用來下載檔案Linux
- 簡單的磁碟運維運維
- Python運用於資料分析的簡單教程Python
- POJ3461-KMP演算法的簡單運用KMP演算法
- CppUnit使用指南
- Linux主流架構運維工作簡單剖析Linux架構運維
- linux下ftp伺服器的簡單的搭建LinuxFTP伺服器
- Linux下簡單部署伺服器Linux伺服器
- linux 下增加硬碟簡單介紹Linux硬碟
- hadoop的Linux下簡單安裝步驟HadoopLinux
- Linux 下 Apache 與 Tomcat 整合的簡單方法LinuxApacheTomcat
- linux下簡單的傳送與接受檔案Linux
- 簡單配置linux下的網路鄰居samba(轉)LinuxSamba
- python 類和元類(metaclass)的理解和簡單運用Python
- javascript的in運算子簡單介紹JavaScript
- Linux下Apache與Tomcat整合的簡單方法(轉)LinuxApacheTomcat
- Linux下檔案的切分與合併的簡單方法Linux
- Linux簡單的操作Linux
- Linux運維有什麼職責工作?linux簡單學習Linux運維
- pytest跟我練01-->安裝&簡單運用
- logstash5.x安裝及簡單運用H5
- 位運算簡單操作
- CppUnit測試框架入門框架