CppUnit的缺陷與改進

2021-04-16 05:39:43 字數 1250 閱讀 5282

許式偉2006-12-19

cppunit提供了自動化、安全可控的執行環境。這是它的精華。然而它的問題在於,在測試案例執行失敗,也就是說當模組存在bug時,沒有乙個很好的方式去跟蹤它。展開來說,主要的問題有兩點:

不方便之處在於,我得找到相應的檔案,然後開啟它,定位到出錯的行,設定斷點,跟蹤。有沒有可能做得更加方便一些?不充足之處在於,也許出錯行並不是每次執行都出錯,而是在n次執行的時候出錯。那麼直接跑到出錯行設斷點,不是什麼好主意。

我們知道,mfc的assert(或者atl的atlassert)很好用,因為它在斷言失敗時可以停下來,進入除錯狀態。有沒有可能,cppunit_assert也可以在出錯的時候停下來?嗯,好像不行?cppunit強調的是自動化,如果停下來就麻煩了。——各位讀者想到可什麼主意了?

特別是每個案例執行時間如果較長,那麼漫長的等待也許讓你有挫傷感。另外的問題是,也許幾個案例測試的是從不同角度去測試同乙個功能(函式),這樣你設定的斷點可能經常被那些沒有bug的案例干擾。這些問題都導致了不愉快的體驗。那麼怎麼辦呢?把其他案例都注釋掉?也許一直以來你都這樣去做了。可有更好的辦法嗎?

下面我們看看winx中是如何支援單元測試的。當然更重要的是,如何解決上面的這些問題的。

我曾經基於cppunit寫過乙個增強版本的cppunit。這個版本的cppunit引入了兩個概念(注意下面列了3條。第3條是寫winx時引入的):

在除錯模式下,cppunit_assert的行為與assert/atlassert一致,也是彈出斷言對話方塊。而在普通模式下,則cppunit_assert報告案例執行錯誤,並不停下來。

也就是說,你可以選擇只執行符合特定條件的案例。

寫winx的時候,我為是否要把cppunit引入到winx中,仔仔細細考察了下cppunit。最終我決定,依據cppunit的思想,寫乙個mini版本的cppunit,而不直接基於cppunit。

這是因為,winx的單元測試觀念在cppunit的測試理念之上,加了一條:

這樣做的好處是:

template 

<

class

logt

>

class

testfilebuf : public testcase

};void

"testfilebuf", 

"test");

//this means to run the testfilebuf::test function.

//winx_test_class(testfilebuf);}

以上**參見:

sqlite加密設計的缺陷與改進

sqlite是 乙個非常小巧的跨平台嵌入式資料庫,它本身不提供加密功能,不過設計者明顯也考慮了加密的方案,我們在原始碼中可以找到兩個預留的加密接 口 sqlite3 key和sqlite3 rekey,可以通過實現這兩個介面來達到加密的目的。sqlite資料庫加密的一種解決方案 我這裡要說的是這種方...

改進CPP Unit,提供更高的自動化

眾所周知,如果想使用cppunit作為測試框架,得使用不少cpp unit提供的巨集,特別是在定義類時,每乙個測試用例函式都得用cppunit巨集包裝起來,否則cpp unit不會自動執行這個用例,這個過程是否可以省掉呢?結合c 的虛函式位址被乙個緊接乙個安插在vtbl中的特性,就可以達到這個目的,...

cppunit與裝飾模式

當乙個介面需要重複測試時,就需要考慮將這個重複的次數放到什麼地方了,repeatedtest就是用來裝飾乙個普通測試用例的。其宣告如下 class cppunit api repeatedtest public testdecorator testdecorator直接從test派生 void ru...