亚洲好骚综合-亚洲黄色录像-亚洲黄色网址-亚洲黄色网址大全-99久久99久久-99久久99久久精品国产

您的位置:軟件測試 > 開源軟件測試 > 開源單元測試工具 >
Java代碼的診斷:單元測試與自動化分析的協同工作
作者:網絡轉載 發布時間:[ 2012/12/25 14:43:58 ] 推薦標簽:

單元測試和靜態分析通常被看作是有助于確保程序的正確性的互不相干的方法。本文研究了這兩種方法之間的關系,并討論了構成每種方法工作構架的工具如何相得益彰。特別地,Eric Allen 討論了一些可用而又令人興奮的新應用程序,這些應用程序允許您進一步提升您的單元測試。

這是一場古老的爭論 — 哪種方法對產生健壯代碼更有價值:測試還是靜態分析和驗證?您會在程序員的日常工作中聽到這種爭論,尤其是在極端編程(Extreme Programming)CC%B3');" target="_self">論壇上。(請參閱我們由 Roy Miller 主持的 XP 論壇。)

支持靜態分析(包括類型檢查)的主要論據是:其結果適用程序所有可能的運行,而通過單元測試只能保證被測試的組件(在測試它們的平臺上)只適用測試組件的特定輸入。

支持單元測試的主要論據是它更容易處理。您可以測試程序的許多約束,這些約束遠遠超出了同期的靜態分析工具所能達到的范圍。

請允許我在此冒昧地說一句:我認為將這兩種工具看作對立的是一個錯誤。每種工具都有助于構建更健壯的程序。實際上,它們可以通過非常強大的方式進行互補。

每種工具都有各自的長處,對于補充另一種工具特別有用:

    單元測試能顯示執行的常用路徑,從而顯示程序是如何運行的。
    分析工具能檢查單元測試提供的覆蓋范圍。

讓我們研究這其中的每個屬性,并討論一些可幫助您將其長處帶給其它方法的工具。

顯示常用執行路徑的單元測試
單元測試套件提供了程序組件的示例用法的穩固基礎。通過檢查測試運行時程序是如何運作的,分析工具可以開發人員希望在程序中保持的不變量進行試探性推測(和程序員閱讀單元測試所做的一樣)。

還有另一種方法,其中單元測試可以是一種可執行的文檔形式。在從單元測試的運行中從特殊到一般地推斷出推測性不變量之后,分析工具可以嘗試從一般到特殊地驗證不變量的存在,或者它可以利用可在運行時檢查的斷言注釋該代碼。

在任何一種情況下,在該工具做任何其它工作之前,好向用戶返回推測的不變量集的報告,以詢問用戶真正想要哪些不變量。順便提一下,如果此類工具向用戶報告了許多他們不想要的不變量,這可能是單元測試出了問題的信號 — 例如,它們不夠一般。

可用這種方式與單元測試一起使用的工具是 Daikon,它是一款來自 MIT 的 Mike Ernst 的程序分析小組的免費的、試驗性的工具。Daikon 分析程序的運行(例如單元測試的運行),并嘗試推測不變量。然后它詢問用戶是否想要這些不變量,并將用戶想要的不變量作為斷言插入程序。

例如,假定我們編寫一個向量(Vector)的適配器,該適配器實現接口 Sequence,該接口包含用于檢索元素的方法 lookup 和用于將元素放在向量末尾的方法 insert。方法 lookup 帶有一個索引 i,用來訪問它所包含的向量。

假定該數組的長度存儲在字段 length 中。通過維護適配器中的長度,我們可以不通知向量本身將元素從其尾部刪除。

讓我們為這個假想的簡單適配器編寫一個簡單的測試用例:

清單 1. 向量容器中簡單查找方法的測試用例
clearcase/" target="_blank" >cccccc height=17>import junit.framework.TestCase;

public class VectorAdapterTest extends TestCase {
public VectorAdapterTest(String name) {
super(name);
}

public void testLookupAndInsert() {
VectorAdapter v = new VectorAdapter();
v.insert("this");
v.insert("is");
v.insert("a");
v.insert("test");
assertEquals("Retrieved and inserted elements don't match",
"a",
v.lookup(2));
}
}

然后我們可以實現我們的適配器以通過這個測試,如下所示:

清單 2. 類 VectorAdapter
import java.util.Vector;

public class VectorAdapter implements Sequence {
private Vector values = new Vector();
private int length = 0;

public void insert(Object o) {
length += 1;
values.addElement(o);
}

public Object lookup(int i) {
return values.elementAt(i);
}
}

interface Sequence {
public void insert(Object o);
public Object lookup(int i);
}

當 Daikon 在這段代碼上運行時,它可能推斷:對于方法 lookup,i 總是小于 length。Daikon 可能從單元測試中推斷出這一點,并向我們的方法報告一條前置條件:i < length。

然后程序員可以檢查 Daikon 報告的不變量,從而更好地了解其測試覆蓋程序的范圍到底怎么樣。例如,如果 Daikon 開始推斷出大量不想要的不變量,這意味著單元測試只是用不具代表性的可能的程序輸入的子集檢測了程序。

盡管 Daikon 是用 Java 語言編寫的,但它需要用 C++ 編寫的前端,這削弱了它原有的可移植性。盡管如此,還是可以在線獲得針對許多主要平臺的前端構建。此外,Daikon 團隊也打算添加其它平臺所需要的構建。

(您可以在參考資料一節找到關于 Daikon 的下載信息和更多內容。)

上一頁12下一頁
軟件測試工具 | 聯系我們 | 投訴建議 | 誠聘英才 | 申請使用列表 | 網站地圖
滬ICP備07036474 2003-2017 版權所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd
主站蜘蛛池模板: 日韩久草视频 | 亚洲 欧美 日韩在线一区 | 国产日韩欧美在线播放 | 日本日批视频 | 久久精品视频8 | 18成禁人视频免费 | 欧美极度极度另类 | 欧美在线日韩 | 国产成人免费高清激情明星 | 午夜剧院官方 | 成人免费xxxxx在线视频 | 国精视频一区二区视频 | 欧美片在线 | 国产精品综合视频 | 天天摸天天舔天天操 | 成人性视频在线三级 | 久99久爱精品免费观看视频 | 伊人网大香 | 日本18网站 | 四虎永久在线精品波多野结衣 | 韩国三级伦理片 | 热综合一本伊人久久精品 | 好吊日在线视频 | 亚洲国产成人久久一区www | 宠文肉细致高h一对一 | 日本高清网站 | 久久永久免费视频 | 色欲麻豆国产福利精品 | 华人欧美国产在线精品 | 另类色综合 | a级黄色毛片免费播放视频 a级黄色毛片 | 精选国产门事件福利在线观看 | 国产一级成人毛片 | 亚洲视频你懂的 | 成人自拍网站 | 日本欧美一区二区三区视频麻豆 | 久久综合久久综合久久综合 | 黄色免费在线网站 | 欧美视频在线免费 | 一区二区在线观看视频 | 黄色片在线观看视频 |