三 測試用例
下面說說測試用例、輸入數據及預期輸出。輸入數據是測試用例的核心,老納對輸入數據的定義是:被測試函數所讀取的外部數據及這些數據的初始值。外部數據是對于被測試函數來說的,實際上就是除了局部變量以外的其他數據,老納把這些數據分為幾類:參數、成員變量、全局變量、IO媒體。IO媒體是指文件、數據庫或其他儲存或傳輸數據的媒體,例如,被測試函數要從文件或數據庫讀取數據,那么,文件或數據庫中的原始數據也屬于輸入數據。一個函數無論多復雜,都無非是對這幾類數據的讀取、計算和寫入。預期輸出是指:返回值及被測試函數所寫入的外部數據的結果值。返回值就不用說了,被測試函數進行了寫操作的參數(輸出參數)、成員變量、全局變量、IO媒體,它們的預期的結果值都是預期輸出。一個測試用例,就是設定輸入數據,運行被測試函數,然后判斷實際輸出是否符合預期。下面舉一個與成員變量有關的例子:
產品函數:
void CMyClass::Grow(int years)
{
mAge += years;
if(mAge < 10)
mPhase = "兒童";
else if(mAge <20)
mPhase = "少年";
else if(mAge <45)
mPhase = "青年";
else if(mAge <60)
mPhase = "中年";
else
mPhase = "老年";
}
測試函數中的一個測試用例:
CaseBegin();{
int years = 1;
pObj->mAge = 8;
pObj->Grow(years);
ASSERT( pObj->mAge == 9 );
ASSERT( pObj->mPhase == "兒童" );
}CaseEnd();
在輸入數據中對被測試類的成員變量mAge進行賦值,在預期輸出中斷言成員變量的值,F在可以看到老納所推薦的格式的好處了吧,這種格式可以適應很復雜的測試。在輸入數據部分還可以調用其他成員函數,例如:執行被測試函數前可能需要讀取文件中的數據保存到成員變量,或需要連接數據庫,老納把這些操作稱為初始化操作。例如,上例中 ASSERT( ...)之前可以加pObj->OpenFile();。為了訪問私有成員,可以將測試類定義為產品類的友元類。例如,定義一個宏:
#define UNIT_TEST(cls) friend class cls##Tester;
然后在產品類聲明中加一行代碼:UNIT_TEST(ClassName)。
下面談談測試用例設計。前面已經說了,測試用例的核心是輸入數據。預期輸出是依據輸入數據和程序功能來確定的,也就是說,對于某一程序,輸入數據確定了,預期輸出也就可以確定了,至于生成/銷毀被測試對象和運行測試的語句,是所有測試用例都大同小異的,因此,我們討論測試用例時,只討論輸入數據。
文章來源于領測軟件測試網 http://www.kjueaiud.com/