出處
作者:許式偉
寫(xiě)于:2005年3月
背景:
WPS Office 2005 (開(kāi)發(fā)代號(hào): V6)
原文:
why-unit-test.pdf
(pdf格式)
目錄
- 自動(dòng)化單元測(cè)試的重要特征
- 單元測(cè)試的項(xiàng)目意義
- 單元測(cè)試對(duì)設(shè)計(jì)的意義
- cppunit for v6
- 將測(cè)試案例寫(xiě)在dll中
常規(guī)測(cè)試的缺陷
- 一般是基于手工的,不具備可回歸性。因此測(cè)試的效率不高。
- 由于缺乏效率,往往導(dǎo)致測(cè)試僅僅針對(duì)典型數(shù)據(jù),覆蓋面往往也很低。
自動(dòng)化單元測(cè)試的重要特征
- 自動(dòng)化、可回歸性
- Quiet
- 案例的執(zhí)行安全受控
自動(dòng)化、可回歸性
-
測(cè)試的結(jié)果是程序直接檢測(cè)的,而不是
“通過(guò)人眼對(duì)屏幕上的輸出結(jié)果的觀測(cè)”
。
- 測(cè)試的輸入數(shù)據(jù)和預(yù)測(cè)結(jié)果直接在案例中, 除非結(jié)果非預(yù)期,否則不需要任何輸出 。
- 因此,并不推薦屏幕輸出,或者寫(xiě)可視化的測(cè)試單元。
- 案例的執(zhí)行不需要人工干預(yù),可隨時(shí)回放。
- 因此,我們可以通過(guò)大量典型測(cè)試數(shù)據(jù)進(jìn)行回歸,以確保系統(tǒng)的可靠性。
-
對(duì)比:常規(guī)測(cè)試典型過(guò)程
- 在屏幕上提示輸入數(shù)據(jù),然后打印結(jié)果,通過(guò)查看屏幕顯示的結(jié)果,確認(rèn)我們的系統(tǒng)是否存在問(wèn)題。
Quiet
- 絕對(duì)避免在案例執(zhí)行過(guò)程中彈出對(duì)話框或者進(jìn)行其他UI交互。
- (調(diào)試模式下例外)
案例的執(zhí)行安全受控
- 某個(gè)測(cè)試案例執(zhí)行的失敗(甚至出現(xiàn)了異常),不會(huì)導(dǎo)致測(cè)試環(huán)境的崩潰,也不影響另一個(gè)案例的執(zhí)行結(jié)果。
常規(guī)測(cè)試樣例
void main ()
{
int n ;
for ( ;; )
{
std :: cout << " input n(0 to exit): " ;
std :: cin >> n ;
if ( n == 0 )
break ;
std :: cout << " n! = " << fact ( n ) << std :: endl ;
}
}
cppunit測(cè)試案例
class TestFact : public TestCase
{
public :
CPPUNIT_TEST_SUITE ( TestFact ) ;
CPPUNIT_TEST ( test ) ;
CPPUNIT_TEST_SUITE_END () ;
void test ()
{
CPPUNIT_ASSERT ( fact ( 3 ) == 6 ) ;
CPPUNIT_ASSERT ( fact ( 4 ) == 24 ) ;
CPPUNIT_ASSERT ( fact ( 5 ) == 120 ) ;
}
} ;
CPPUNIT_TEST_SUITE_REGISTRATION ( TestFact ) ;
單元測(cè)試的項(xiàng)目意義
- 模塊更加可控。
- 及早發(fā)現(xiàn)問(wèn)題,提高模塊質(zhì)量,降低系統(tǒng)測(cè)試成本。
- 加速開(kāi)發(fā)周期。
單元測(cè)試與項(xiàng)目控制
-
單元測(cè)試不應(yīng)該是程序員的個(gè)人行為,而與項(xiàng)目進(jìn)度控制、質(zhì)量控制息息相關(guān)。
- 通過(guò)監(jiān)測(cè)單元測(cè)試的情況,來(lái)量化模塊開(kāi)發(fā)的進(jìn)度與質(zhì)量。
-
要改善項(xiàng)目的控制,必須“做好單元測(cè)試”。
- 不止是要讓單元測(cè)試成為每個(gè)程序員的例行公事,而且要讓它變得規(guī)范、變得受控。
單元測(cè)試的誤區(qū)
- 一個(gè)很常見(jiàn)誤解是:嗯,單元測(cè)試,好事啊,只是最近時(shí)間很緊,下回做吧。
-
實(shí)際上
單元測(cè)試大家都會(huì)去做
,我們提倡單元測(cè)試,更大程度上是要達(dá)到:
- 規(guī)范單元測(cè)試的編寫(xiě)(手段);
- 最大程度保留下來(lái)我們的測(cè)試案例;
加速開(kāi)發(fā)周期
-
一個(gè)系統(tǒng)自動(dòng)化程度越高,則運(yùn)營(yíng)成本越低。
- 單元(模塊)是最容易,也是最應(yīng)該采用自動(dòng)化測(cè)試的。而集成測(cè)試、系統(tǒng)測(cè)試雖然也有自動(dòng)化的方法和支持工具,但需要更高額的代價(jià)。
-
單元測(cè)試
將問(wèn)題的發(fā)現(xiàn)周期縮短,降低bug修復(fù)成本。
- 如果問(wèn)題在集成測(cè)試、系統(tǒng)測(cè)試期被發(fā)現(xiàn),那么同樣一個(gè)問(wèn)題需要花幾倍甚至幾十倍的時(shí)間進(jìn)行定位、修復(fù)。
- 單元測(cè)試降低了集成測(cè)試、系統(tǒng)測(cè)試的壓力和投入成本。
單元測(cè)試的主要檢查點(diǎn)
- 案例的覆蓋度
- Bug量與Bug反復(fù)情況
- 案例文檔的規(guī)范
單元測(cè)試對(duì)設(shè)計(jì)的意義
- 設(shè)計(jì)應(yīng)該以可測(cè)試性為第一目標(biāo)。
- 及時(shí)發(fā)現(xiàn)模塊構(gòu)架調(diào)整引發(fā)的潛在Bug。
模塊的可測(cè)試性
-
可測(cè)試性 = 低耦合
- 環(huán)境模擬(依賴的模塊、數(shù)據(jù)輸入)
- 模塊設(shè)計(jì)應(yīng)該首先保證可測(cè)試性。
- 堅(jiān)持進(jìn)行單元測(cè)試可提高設(shè)計(jì)能力。
- 一個(gè)模塊可以很方便地進(jìn)行測(cè)試,那么就可以說(shuō)它是一個(gè)設(shè)計(jì)優(yōu)良的模塊。
發(fā)現(xiàn)模塊構(gòu)架調(diào)整的潛在Bug
- 通常 模塊在架構(gòu)調(diào)整期(代碼重構(gòu))最容易引入Bug。
- 只有在模塊開(kāi)發(fā)中就不斷積累經(jīng)典數(shù)據(jù)、以案例的形式固化已知Bug,才可能在架構(gòu)調(diào)整等最容易引發(fā)問(wèn)題的情形下獲得最佳效果。
cppunit for v6
- 引入調(diào)試模式
- 通用的調(diào)試開(kāi)關(guān)
- 有選擇的運(yùn)行測(cè)試案例
- 獨(dú)特的dll測(cè)試模式
調(diào)試模式
-
同一套測(cè)試代碼,兩種工作模式。
- cppunit提供了安全可控的自動(dòng)化測(cè)試平臺(tái)。
- 但是是代碼總會(huì)有bug。為了讓測(cè)試案例可調(diào)試,v6在開(kāi)源的cppunit基礎(chǔ)上,結(jié)合kfc的調(diào)試策略,引入調(diào)試模式。
通用的調(diào)試開(kāi)關(guān)
-
/ndebug
- 進(jìn)入自動(dòng)化測(cè)試模式。默認(rèn)為調(diào)試模式。
-
/output:<xmlfile>
- 輸出結(jié)果到xml文件。注意:/output:后不能有空格。
- 默認(rèn)輸出到控制臺(tái)。
-
/run:<testclass>[.<testmethod>]
- 執(zhí)行<testclass>類(lèi)所有案例,或者執(zhí)行<testclass>的<testmethod>案例。
有選擇的運(yùn)行測(cè)試案例
- 你可以只執(zhí)行某個(gè)TestCase類(lèi),或者只是執(zhí)行某個(gè)TestCase中的某個(gè)method。
- 演示rununit程序的參數(shù)含義:
<testclass> <testmethod>
- 演示通用開(kāi)關(guān):
/run:<testclass>[.<testmethod>]
將測(cè)試案例寫(xiě)在dll中
- 測(cè)試案例同步更新
- 測(cè)試dll內(nèi)部組件
- 關(guān)于rununit工具
基于dll的單元測(cè)試
-
對(duì)比
- 為dll寫(xiě)測(cè)試程序(exe方式)
-
優(yōu)點(diǎn)
-
方便測(cè)試案例的同步更新
- 并且強(qiáng)迫你同步更新測(cè)試案例
- 可測(cè)試dll的內(nèi)部組件
- 去除了建立新工程的過(guò)程(有點(diǎn)麻煩)。
-
方便測(cè)試案例的同步更新
關(guān)于rununit工具
-
用rununit調(diào)試你的dll
- rununit程序是一個(gè)通用的testcaseRunner,可用于執(zhí)行(或調(diào)試)一個(gè)dll中的部分或全部案例。
- 命令行
rununit testcase[.dll] [testclass] [testmethod] [/ndebug] [/pause] [/output:<xmlfile>]
Visual Studio中調(diào)試dll
今天,你“單元測(cè)試”了嗎?
- 如果你沒(méi)有,那么我告訴你,你已經(jīng)落伍啦!
附錄
- rununit.exe: 參考ksdn中關(guān)于該程序的詳細(xì)說(shuō)明。
- CreateCppUnitTestCase宏: 參考KSRule.dsm(macros for Visual Studio)。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
