2011-08-19 116 views
1

是否可以測量從現有測試用例中傳遞給被測試類的方法的有多少不同輸入。在Java測試用例中測量輸入覆蓋率

我想測量一些代碼覆蓋範圍,但是用於輸入。

+0

當然,它的*可能*。測量代碼以收集所有輸入並對其進行計數。你在問一個這樣的工具嗎? –

+0

我不知道Clover是否具有此功能,但它是編寫測試代碼的好插件http://www.atlassian.com/software/clover/ – WillHaack

+0

@Ira我正在尋找一個工具。但我想這可以做到。我會檢查三葉草。我一直在使用EclEmma。 –

回答

0

我不知道任何計算輸入範圍的COTS工具,所以我希望您必須構建一個能夠做到您想要的工具。

我的技術文章Branch Coverage for Arbitrary Languages Made Easy描述了一種使用Program transformation system爲任意語言構建測試覆蓋率工具以將任意探測器插入源代碼的方法。

本文主要關注構建代碼覆蓋率,但探針插入技術是一般性的,您可以決定探針的位置以及它們的功能。在你的情況下,你只想在方法入口處放置探測器,並且你希望探測器跟蹤輸入參數實例。本白皮書介紹瞭如何通過使用源代碼模式來指示插入點的位置探測器的位置;方法條目很容易被描述爲一種模式。

捕獲輸入實例比較笨拙但可行。你必須決定什麼是「輸入」;它只是參數值,還是參數的某種深層副本?可能你需要做的是創建一個對象類型(per-method instrumented),它的數據成員對應於這些參數,用一個副本實例化這個對象(適當的深度),然後將這個對象存儲在每個方法中哈希表。 (一旦你知道你想做的代碼成語,轉化規則就可以插入所有這些)。所有這些,在執行時,你的哈希表建立了參數集,這是你想要的關鍵。

您可以(連續)計數通過控制將重複項插入散列表時發生的情況來確定唯一的參數集實例;該計數(每個方法)可以在程序完成時導出的全局數組中進行管理。本文討論了這樣一個全局數組,以及一般導出/顯示的各種方法。

我們的線test coverageprofilers是使用本文中的技術構建的。分析器在這樣的全局數組中保持計數/次數(基本上就是你所需要的)並將它們導出到顯示引擎,該引擎繪製熱直方圖,顯示熱點的位置。這些顯示引擎是語言和探測數據源不可知的現成的,因爲它們都包含在我們的任何一個(探查器)工具中,包括Java探查器,因此您可以將其中一個工具用於顯示任務。