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

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

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

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

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

圖6
其中Method的內容是:
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進行測試的時候就會得到輸出我們需要的內容。
關于python的語法我這里就不寫了,畢竟和這篇文章的內容美關系。如果想要了解,可以去下載相關資料,我這里建議使用 Orielly的 Python in a Nutshell 。
四.不足點
作為一個能自定義規則的靜態測試工具,不得不佩服parasoft兄弟們的才智。但是我覺得還有一些改善點的:(當然也不排除,已經有,但我沒有發現的情況,如果各位知道請指教,謝謝先)
1. 通過pyhon我們可以干涉規則的制定,比如,對于上例變量的確定,如果們不使用collect set的Difference|left menus(就是圖4中最下的那個6邊形),而用python一樣的可以對比2個List。但是就像他提供的功能是靜態測試一樣,這里我們得到的永遠是經過處理的集合。而不能把python插入檢測的循環中,不能一次得到一個變量,做點操作然后等下次的變量。
2. 集合的概念在這里有 他的優點,也有缺點,如果我們想要明確的得到代碼里相同變量的出現次數,那么通過現有的rulewizard是得不到的,因為我們得到的集合總是經過“合并”的、沒有重復的數據結構。
3. 就我看到的資料,所有的內置的node都沒有為用戶提供接口。不能夠把通過python的處理結果正確的傳遞給內置的node。感覺所有的python做成的node 都是“葉子”。
4. 技術支持和官方論壇人氣低到,看了渾身發抖的地步。沒有交流,沒有討論。不知道是不是因為太貴的原因。
5. 貴?。。≌娴暮苜F。動輒就是4XXX$。-_-! 反正貴。
就寫這么多,希望大家多多交流,國內關于軟件的新聞有不少,經驗卻沒有,希望能給我仍的“磚”能換來大家“玉”。謝謝!