C++ Test 之 RuleWizard 使用心得
***************************************
關(guān)鍵字:C++Test Rulewizard Python
難易度:中
軟件版本:Parasoft C++ Test 6.5
時(shí)間:2005-11-23
Author:Kino
********************************
一.介紹一下C++Test吧(這一部分請(qǐng)?jiān)试S我ctrl + c/v )
是單元測(cè)試和靜態(tài)分析工具,自動(dòng)測(cè)試C和C++類別、功能或組件,而無(wú)需編寫單個(gè)測(cè)試實(shí)例、測(cè)試驅(qū)動(dòng)程序或樁調(diào)用。只需點(diǎn)擊按鈕,C++Test即會(huì)采用業(yè)內(nèi)編碼標(biāo)準(zhǔn)執(zhí)行代碼的靜態(tài)分析,測(cè)試代碼構(gòu)造(白盒測(cè)試),測(cè)試代碼功能性(黑盒測(cè)試),并保持代碼完整性(回歸測(cè)試)。可以巡行在Windows 2000/XP 、Linux 、Solaris 7, 8, 9平臺(tái)之上。她的主要功能可以參見下邊的鏈接網(wǎng)頁(yè):
http://www.superinst.com/cn/products/software_engineering/unit_testing/parasoft/ctest.html
這里我想說(shuō)明的不是C++Test有多么好用,而是要說(shuō)明她內(nèi)置的RuleWizard?定制編碼機(jī)能。那么什么才是RuleWizard呢?他到底能干什么?
二.RuleWizard
C++Test內(nèi)置了300多個(gè)靜態(tài)測(cè)試項(xiàng),一般的情況下其實(shí)也就夠用了。但是如果有特殊的測(cè)試要求,動(dòng)輒幾十K的代碼,用眼睛看,腦子想,太辛苦,也不“安全”。那么使用rulewizard定制自己的規(guī)則還是很有用的。
我們首先要明確,rulewizard定制的是 不成功 的情況。也就是應(yīng)該被排除的。
Rule的創(chuàng)建有2種方式,一種是手工寫規(guī)則,另一種是寫入需要剔除的代碼,讓rulewizard去幫你生成規(guī)則(最好別用,弱弱的autocreate)。我這里主要重點(diǎn)放在自己寫規(guī)則方面。
Rulewizard的界面如下圖:
*******
圖1。RuleWizard界面
右邊的就是我們寫的規(guī)則。
那么我們先來(lái)大概的介紹一下rulewizard定義的基本組成部分吧。(實(shí)在不太會(huì)翻譯,那么就沿用英文名字了,請(qǐng)大家多多包涵)
Node:規(guī)則的基本組成部分,通過(guò)Node你可以很清楚的知道它的功能。比如表達(dá)式a=b、變量的類型測(cè)試。。。分為:
parentNode:規(guī)則中的主分支Node或者次分支的主Node。內(nèi)容可以是表達(dá)式、變量、函數(shù)等
childNode:規(guī)則的組成單元。
Commands:用來(lái)在Node和Nodes之間建立關(guān)聯(lián)關(guān)系。形象一點(diǎn)就是點(diǎn)中一個(gè)Node然后右鍵顯示出的快捷菜單的上半部分。如下圖:

圖2
介紹一下主要的Command
Collector:集合。這個(gè)概念更像數(shù)學(xué)中的集合而不是Java中的廣義集合。滿足一定條件的數(shù)據(jù)或者方法或者變量的全體。比如,所有被聲明過(guò)的變量,如下圖

圖3
isDecl是用來(lái)返回前邊的node是不是一個(gè)聲明。那么body的membervariable返回了所有的包涵指定類型變量得語(yǔ)句(包括 變量付值、聲明、判斷等)那么這個(gè)圖被理解為,所有不是聲明得語(yǔ)句內(nèi)使用的變量的集合。
沒(méi)有被聲明的變量,如下圖。

圖4
這里的意思是所有作為聲明語(yǔ)句的變量的集合。
那么通常情況下,A集合和B集合應(yīng)該是相等的,也就是說(shuō)所有被聲明過(guò)的變量(B集合內(nèi)容)應(yīng)該都被使用/付值/判斷(A集合的內(nèi)容)。那么對(duì)于存在聲明了但沒(méi)有被使用的變量的特殊情況應(yīng)該怎么樣表示呢?
Node Set:Node對(duì)Node集合的處理。分為Union(合并)、Intersection(交叉)、Difference(差值,左差/右差)、Xor(異或)。如下圖:

圖5
如果 滿足這個(gè)規(guī)則,那么輸出相應(yīng)得警告信息。
Output:如果滿足check的條件,向用戶返回一個(gè)消息(箭頭表示)
三.Python
這里python是用來(lái)給rulewizard作補(bǔ)充的一個(gè)腳本語(yǔ)言。通過(guò)python可以定制一些特殊的,rulewizard的node不能完成的規(guī)則。Python可以使用2種方式被加入到規(guī)則中:
作為一個(gè)輸出:如果規(guī)則沒(méi)有被遵守那么可以調(diào)用一個(gè)違反規(guī)則的方法。(類似于輸出錯(cuò)誤消息,只不過(guò)這里用來(lái)啟動(dòng)一個(gè)方法而已)
作為一個(gè)單獨(dú)的方法組件:其實(shí)就是一個(gè)方法而已。比如,以上圖為例子,如果我們不判斷B 和 A的大小關(guān)系,就是想打印一下A、B的內(nèi)容,那么就得到如下的圖:

圖6
其中Method的內(nèi)容是:
def showCollectorContext(node,context):
a = context.getList("A")
b = context.getList("B")
context.report("D's Context is " + str(a) + "C's Context is " + str(b))
那么在c++test進(jìn)行測(cè)試的時(shí)候就會(huì)得到輸出我們需要的內(nèi)容。
關(guān)于python的語(yǔ)法我這里就不寫了,畢竟和這篇文章的內(nèi)容美關(guān)系。如果想要了解,可以去下載相關(guān)資料,我這里建議使用 Orielly的 Python in a Nutshell 。
四.不足點(diǎn)
作為一個(gè)能自定義規(guī)則的靜態(tài)測(cè)試工具,不得不佩服parasoft兄弟們的才智。但是我覺(jué)得還有一些改善點(diǎn)的:(當(dāng)然也不排除,已經(jīng)有,但我沒(méi)有發(fā)現(xiàn)的情況,如果各位知道請(qǐng)指教,謝謝先)
1. 通過(guò)pyhon我們可以干涉規(guī)則的制定,比如,對(duì)于上例變量的確定,如果們不使用collect set的Difference|left menus(就是圖4中最下的那個(gè)6邊形),而用python一樣的可以對(duì)比2個(gè)List。但是就像他提供的功能是靜態(tài)測(cè)試一樣,這里我們得到的永遠(yuǎn)是經(jīng)過(guò)處理的集合。而不能把python插入檢測(cè)的循環(huán)中,不能一次得到一個(gè)變量,做點(diǎn)操作然后等下次的變量。
2. 集合的概念在這里有 他的優(yōu)點(diǎn),也有缺點(diǎn),如果我們想要明確的得到代碼里相同變量的出現(xiàn)次數(shù),那么通過(guò)現(xiàn)有的rulewizard是得不到的,因?yàn)槲覀兊玫降募峡偸墙?jīng)過(guò)“合并”的、沒(méi)有重復(fù)的數(shù)據(jù)結(jié)構(gòu)。
3. 就我看到的資料,所有的內(nèi)置的node都沒(méi)有為用戶提供接口。不能夠把通過(guò)python的處理結(jié)果正確的傳遞給內(nèi)置的node。感覺(jué)所有的python做成的node 都是“葉子”。
4. 技術(shù)支持和官方論壇人氣低到,看了渾身發(fā)抖的地步。沒(méi)有交流,沒(méi)有討論。不知道是不是因?yàn)樘F的原因。
5. 貴!!!真的很貴。動(dòng)輒就是4XXX$。-_-! 反正貴。
就寫這么多,希望大家多多交流,國(guó)內(nèi)關(guān)于軟件的新聞?dòng)胁簧伲?jīng)驗(yàn)卻沒(méi)有,希望能給我仍的“磚”能換來(lái)大家“玉”。謝謝!