原創(chuàng)|行業(yè)資訊|編輯:龔雪|2014-03-18 09:31:47.000|閱讀 643 次
概述:單元測(cè)試在整個(gè)軟件測(cè)試工程中非常重要,本文總結(jié)了單元測(cè)試需要注意的一些事項(xiàng)。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
11 只測(cè)試公有接口
單元測(cè)試可以被定義為 通過(guò)類的公有 API 對(duì)類進(jìn)行進(jìn)行測(cè)試。 一些測(cè)試工具允許測(cè)試一個(gè)類的私有成員, 但這種做法應(yīng)該避免, 它讓測(cè)試變得繁瑣而且更難維護(hù)。 如果有私有成員確實(shí)需要進(jìn)行直接測(cè)試, 可以考慮把它重構(gòu)到工具類的公有方法中。 但要注意這么做是為了改善設(shè)計(jì), 而不是幫助測(cè)試。
12 看成是黑盒
從在第三方使用者的角度, 測(cè)試類是否滿足規(guī)定的需求。 并設(shè)法讓它出問(wèn)題 (譯注: 原文 tear it apart, 本意 “將它撕碎”, 我的理解是崩潰, 出問(wèn)題, 不能正確工作)。
13 看成是白盒
畢竟被測(cè)試類是程序員自寫(xiě)自測(cè)的, 應(yīng)該在最復(fù)雜的邏輯部分多花些精力測(cè)試。
14 芝麻函數(shù)也要測(cè)試
通常建議所有重要的函數(shù)都應(yīng)該被測(cè)試到, 一些芝麻方法, 如簡(jiǎn)單的 setter 和 getter 都可以忽略。 但是仍然有充分的理由支持測(cè)試芝麻函數(shù):
芝麻 很難定義。 對(duì)于不同的人有不同的理解。
從黑盒測(cè)試的觀點(diǎn)看, 是無(wú)法知道哪些代碼是普通的。
即便是再芝麻的函數(shù), 也可能包含錯(cuò)誤, 通常是 “復(fù)制粘貼” 代碼的后果:
private double weight_;
private double x_, y_;
public void setWeight(int weight)
{
weight = weight_; // error
}
public double getX()
{
return x_;
}
public double getY()
{
return x_; // error
}
因此建議測(cè)試所有方法。 畢竟芝麻函數(shù)也容易測(cè)試。
15 先關(guān)注執(zhí)行覆蓋率
區(qū)別對(duì)待 執(zhí)行覆蓋率 和 實(shí)際測(cè)試覆蓋率。 測(cè)試的最初目標(biāo)應(yīng)該是確保較高的執(zhí)行覆蓋率。 這樣能保證代碼在 某些 參數(shù)輸入時(shí)能有效執(zhí)行。 一旦執(zhí)行覆蓋率就緒, 就應(yīng)該開(kāi)始改進(jìn)測(cè)試覆蓋率了。 注意, 實(shí)際的測(cè)試覆蓋率很難衡量 (而且往往趨近于 0%)。
思考以下公有方法:
void setLength(double length);
調(diào)用 setLength(1。0) 你可能會(huì)得到 100% 的執(zhí)行覆蓋率。 要達(dá)到 100% 的實(shí)際測(cè)試覆蓋率, 有多少個(gè) double 浮點(diǎn)數(shù)這個(gè)方法就必須被調(diào)用多少次, 并且要一一驗(yàn)證行為的正確性。 這無(wú)疑是不可能的任務(wù)。
16 覆蓋邊界值
確保參數(shù)邊界值均被覆蓋。 對(duì)于數(shù)字, 測(cè)試負(fù)數(shù), 0, 正數(shù), 最小值, 最大值, NaN (非數(shù)字), 無(wú)窮大等。 對(duì)于字符串, 測(cè)試空字符串, 單字符, 非 ASCII 字符串, 多字節(jié)字符串等。 對(duì)于集合類型, 測(cè)試空, 1, 第一個(gè), 最后一個(gè)等。 對(duì)于日期, 測(cè)試 1月1號(hào), 2月29號(hào), 12月31號(hào)等。 被測(cè)試的類本身也會(huì)暗示一些特定情況下的邊界值。 基本要點(diǎn)是盡可能徹底的測(cè)試這些邊界值, 因?yàn)樗鼈兌际侵饕?nbsp;“疑犯”。
17 提供一個(gè)隨機(jī)值生成器
當(dāng)邊界值都覆蓋了, 另一個(gè)能進(jìn)一步改善測(cè)試覆蓋率的簡(jiǎn)單方法就是生成隨機(jī)參數(shù), 這樣每次執(zhí)行測(cè)試都會(huì)有不同的輸入。
想要做到這點(diǎn), 需要提供一個(gè)用來(lái)生成基本類型 (如: 浮點(diǎn)數(shù), 整型, 字符串, 日期等) 隨機(jī)值的工具類。 生成器應(yīng)該覆蓋各種類型的所有取值范圍。
如果測(cè)試時(shí)間比較短, 可以考慮再裹上一層循環(huán), 覆蓋盡可能多的輸入組合。 下面的例子是驗(yàn)證兩次轉(zhuǎn)換 little endian 和 big endian 字節(jié)序后是否返回原值。 由于測(cè)試過(guò)程很快, 可以讓它跑上個(gè)一百萬(wàn)次。
void testByteSwapper()
{
for (int i = 0; i < 1000000; i++) {
double v0 = Random。getDouble();
double v1 = ByteSwapper。swap(v0);
double v2 = ByteSwapper。swap(v1);
assertEquals(v0, v2);
}
}
18 每個(gè)特性只測(cè)一次
在測(cè)試模式下, 有時(shí)會(huì)情不自禁的濫用斷言。 這種做法會(huì)導(dǎo)致維護(hù)更困難, 需要極力避免。 僅對(duì)測(cè)試方法名指示的特性進(jìn)行明確測(cè)試。
因?yàn)閷?duì)于一般性代碼而言, 保證測(cè)試代碼盡可能少是一個(gè)重要目標(biāo)。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn