2009-01-18 88 views
9

大多數已建立的語言都爲其提供了可靠的測試覆蓋工具,但功能深度各不相同。例如,所有各種虛擬機和編譯器都有這樣的異構結構,編寫代碼覆蓋工具在C語言中的工作必須與Lisp中的工作非常不同。代碼覆蓋工具如何以不同語言工作?

  • Python有sys.settrace直接告訴你具體哪行執行
  • Clover(用於Java)使用它自己的編譯器,並增加了調試的元數據(我最後一次使用它,反正)
  • Emma(用於Java)在運行中具有類加載器,其重新寫入的字節碼
  • COVER(對於Lisp的)已註釋傳遞到儀器的代碼

我間相關捐資代碼覆蓋的實現爲不同的語言:

  1. C0覆蓋,在那裏你可以跟蹤哪些代碼行已經執行的主要方法是什麼?我提到了本機VM內省和上面的靜態和動態代碼工具 - 還有其他方法嗎?

  2. 與C0相比,獲得更多啓發式覆蓋數據(如C1 or C2)似乎是一種與語言無關的任務。對我來說是很大的Karnaugh map操縱;有沒有關於如何真正做到這一點的最佳做法?更多現代邏輯技術如fuzziness發揮作用嗎?

  3. 測試覆蓋率的一個被忽略的方面是將結果顯示給程序員,後者通過C1和C2數據越來越難。坦率地說,雖然他們完成了C0的工作,但我卻被大多數測試覆蓋界面所困擾;您看到覆蓋數據有哪些新穎而直觀的界面?

+0

我不太清楚你在這裏要求什麼,它是如何代碼覆蓋率在低層次上工作,你基本上取樣電腦(http: //en.wikipedia.org/wiki/Program_counter),然後將結果映射到您的源代碼?或者他在尋找什麼? – Johan 2009-01-18 21:49:00

+0

有趣的..所以對個人電腦進行採樣是如何(大多數)覆蓋工具爲編譯爲本地代碼的語言工作。然而,這只是獲得C0的一種方法,而且我對可用於其他語言的技術感興趣。除了原始問題中的第二個和第三個問題。 – 2009-01-19 12:11:17

回答

6

基本上所有的代碼覆蓋工具都會檢測代碼以檢查代碼的哪些部分已經被執行。

正如您提供的鏈接所定義的,從編寫儀器的人的角度來看,C0和C1非常相似。唯一的區別是你放置代碼的地方。我會進一步推測C1比C0更容易,因爲儀表發生在抽象語法級別上,其中行結束不計算很多。

另一個原因,我說的C1是容易的,因爲它相對於詞法句法實體之間的交易:你會如何儀:

if 
c > 1 && c 
< 10 
then 
blabla 
end 

嗯,只是一個想法。

至於C2,我從來沒有見過它在實踐中完成。原因是你可以得到指數式的放大:

if c1 then * else * end 
if c2 then * else * end 
... 
if cn then * else * end 

對於n行代碼,你需要2^n個測試。另外,你做什麼循環?通常情況下,你將它們抽象爲簡單的if語句(即,對於每個循環,您測試的主體在一次測試中執行0次,而在另一次測試中執行至少一次)。

我相信對PC進行採樣是一種特別糟糕的代碼覆蓋方式,因爲您可能會因爲執行過快而錯過某些語句:D同樣適用於模糊邏輯,它用於推理近似值;通常你希望你的代碼覆蓋率是確定性的。

卡諾圖用於最小化布爾函數,我沒有看到任何有用的代碼覆蓋工具鏈接。另外,你的問題有時候並不是非常明確:你想要技術來實現更好的代碼覆蓋,還是隻是實現你感興趣的代碼覆蓋工具?

-2

在.NET中,優選的方式是使用.NET Profiling API,在CLR本身基本上提供一堆接合點。

0

幾乎適用於所有語言的一種方法是使用程序轉換系統插入儀表 。

此處發現的技術文章: http://www.semdesigns.com/Company/Publications/TestCoverage.pdf 說明了如何在一般情況下完成此操作。

我公司,語義設計提供,一大套的測試覆蓋率工具 提供所謂上述C1覆蓋(例如,「科報道」) 所以是的,它通常做法),針對不同的語言 (C,C++,C#,Java,COBOL,PHP,全部爲多種 方言)。 See www.semdesigns.com/Products/TestCoverage/index.html