領測軟件測試網
軟件單元測試的測試用例編寫方法
MILY: 宋體; mso-ascii-font-family: " Times Roman?; mso-hansi-font-family: ?Times New Roman??>我在這里用最常用的方法:基本路徑測試法來進行單元測試,因為我要用一個實際的例子來進行說明,所以就編寫了下面一個程序模塊,就暫且命名為“詳細查詢模塊”吧。
我先寫一下基本過程:
1 分析模塊函數;
2 在模塊中找到相應的關鍵點(函數);
3 根據第二點,畫出模塊程序流程圖;
4 計算圈復雜度;
5 根據圈復雜度算出測試用例的最優個數;
6 根據路徑測試法和圈復雜度寫出具體測試用例;
7 進行測試。
void CXIANGXIDLG::OnOK()
{
CoInitialize(NULL);//初始化COM環境
_ConnectionPtr m_pConnection;//連接對象
HRESULT hr;
try
{
hr = m_pConnection.CreateInstance("ADODB.Connection");//創建Connection對象
if(SUCCEEDED(hr))
{
hr=m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=shouji.mdb","","",adModeUnknown);//連庫
}
}
catch(_com_error e)
{
AfxMessageBox("數據庫連接失敗,確認數據庫連接字符串是否正確");
}
//操縱表
_RecordsetPtr m_pRecordset; //記錄集對象
UpdateData(TRUE);
CString strSQL;
if (m_name=="") //路徑1
{
MessageBox("用戶名不能為空!"); //函數A
}
else {UpdateData(TRUE); //函數B
int lenth=0;
lenth=m_name.GetLength();
if (lenth>12 || length<2) //路徑2
{MessageBox("輸入的用戶名不正確或沒有該用戶!請重新輸入!"); //函數C
}
Else
{
if(m_pipei) //路徑3
{
strSQL="SELECT * FROM sj_T_ShouJiKa where 用戶姓名 = '"+m_name+"'"; //函數D
}
Else
{
strSQL="SELECT * FROM sj_T_ShouJiKa where 用戶姓名 like '%"+m_name+"%'";//函數E
}
try
{
hr=m_pRecordset.CreateInstance("ADODB.Recordset");
if(SUCCEEDED(hr))
{ //從數據庫中打開表
m_pRecordset->Open(_bstr_t(strSQL),m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
}
else
{
AfxMessageBox("查詢不成功!");
}
}
catch (_com_error e)
{
CString strError;
strError.Format("警告:打開數據表時發生異常。 錯誤信息: %s",e.ErrorMessage());
AfxMessageBox(strError);
return;
}
while(!m_pRecordset->adoEOF) //路徑4
{ //函數F
_bstr_t name="";
_bstr_t shoujikahao="";
_bstr_t tongxinzhishi="";
_bstr_t fuwushang="";
int i=0;
m_list5.DeleteAllItems();
while(!m_pRecordset->adoEOF)
{
name=(_bstr_t)m_pRecordset->GetCollect("用戶姓名");
shoujikahao=(_bstr_t)m_pRecordset->GetCollect("手機卡號");
tongxinzhishi=(_bstr_t)m_pRecordset->GetCollect("通信制式");
fuwushang=(_bstr_t)m_pRecordset->GetCollect("服務商");
m_list5.InsertItem(i,name);
m_list5.SetItemText(i,1,shoujikahao);//設置該行的不同列的顯示字符
m_list5.SetItemText(i,2,tongxinzhishi);
m_list5.SetItemText(i,3,fuwushang);
m_pRecordset->MoveNext();
i=i+1;
}
}
//關閉連接、釋放com資源m_pRecordset->Close(); //路徑5
m_pRecordset.Release();
m_pConnection->Close();
m_pConnection.Release();
CoUninitialize();
}
}
}
我們根據這個程序來畫出它的程序流程圖,如下,是我畫好的:
有了圖以后我們就要知道到底我們要寫多少個測試用例,才能滿足基本路徑測試。
這里有有了一個新概念——圈復雜度。
圈復雜度是一種為程序邏輯復雜性提供定量測試的軟件度量。將該度量用于計算程序的基本獨立路徑數目。為確保所有語句至少執行一次的測試數量的下界。
公式圈復雜度 V(G)=E-N+2,E是流圖中邊的數量,N是流圖中結點的數量。
從圖中我們可以看到,
V(G)=8條邊-6結點+2=4
上圖的圈復雜圖是4。這個結果對我們來說有什么意義呢?它表示我們只要最多4個測試用例就可以達到基本路徑覆蓋。
下一步我們就要導出程序基本路徑。
程序基本路徑:基本獨立路徑就是從程序的開始結點到結束可以選擇任何的路徑遍歷,但是每條路徑至少應該包含一條已定義路徑不曾用到的邊。
我們可以得到基本路徑是:
1: A
2: B->C
3: B->D->F
4: B->E->F
下面我們開始寫測試用例。
“詳細查詢測試”做完了嗎?沒有,因為對于上表的每一個路徑,如果結果有不同的,即:結果有對的,也有不對的。那么,我們就還需要進行進一步的測試,下面的工作我就不做了,照搬就是。
單元測試是編寫高質量代碼的前提,通過編寫有效的單元測試即可以保證代碼的質量又可以提高開發速度,因為大多數問題都可以通過單元測試發現并解決而不需要部署到應用服務器?v覽網上流行的優秀開源框架,無一不提供完整的單元測試用例。Spring框架便是其中的代表和佼佼者,因為Spring所遵循的控制反轉(IoC)和依賴注入(DI)原則使編寫有效、干凈的單元測試用例變得更加方便、快捷。
編寫單元測試用例
本文所采用的案例非常簡單,就是對數據庫表的增、刪、改、查操作進行測試。假設我們有這樣一個表url(MySql數據庫):
正如你所見,該表只有幾個字段,但對于我們的案例來說完全夠用。
看到此處,你應該清楚我們是要對數據庫操作進行單元測試。如果你是一位經驗豐富的開發人員,此時已經會有許多疑問,甚至已經失去繼續閱讀本文的興趣:
單元測試不應該直接操作數據庫?
對數據庫操作的單元測試可以采用DAO模式,Mock一個實現類?
使用內存數據庫?
其他?