Java 程式碼覆蓋率注入方式
阿新 • • 發佈:2019-01-23
得到程式碼覆蓋率大致需要三步:
1. 注入(instrumentation)
2.執行Tests,得到Coverage data
3.生成報表
所以注入這一步是得到程式碼覆蓋率的基礎。注入的目的是給被測試的程式碼加一些額外的程式碼用於在測試執行Test時統計及儲存那些語句被Test執行了。反編譯了一個Cobertura注入的方法就能夠大致瞭解注入是怎麼一回事了:
原方法:
public HashMap<String, String> handleRequest() { HashMap<String, String> model = new HashMap<String, String>(); String helloRaptor = "Say hello to Raptor!" ; model.put("greeting", helloRaptor); return model; }
注入後的方法:
public HashMap<String, String> handleRequest() { __cobertura_counters[2] += 1; HashMap model = new HashMap(); __cobertura_counters[3] += 1; String helloRaptor = "Say hello to Raptor!"; __cobertura_counters[4] += 1; model.put("greeting", helloRaptor); __cobertura_counters[5] += 1; return model; }
由此可見執行測試用例時就可以通過注入好的程式碼統計每一行程式碼是否被執行。
業界做程式碼覆蓋率的 注入主要有三種方式:
1. 直接原始碼注入
2. 注入到編譯好的Class
3. 注入到JVM執行時位元組碼中
我們來看一下業界常用的程式碼覆蓋率工具是如何做的。商用的Clover的注入方式是1,原始碼注入。 Cobertura和Emma採用的是第2種,注入到編譯好的Class檔案中,也被稱為Offline 位元組碼注入。Jacoco採用第三種方式,採用JVM Tool Interface將Agent加入到JVM後啟動,注入到JVM中的Class,即On-The-Fly位元組碼注入。
當然不同的注入方式和統計方式勢必導致程式碼覆蓋率統計結果的差別。另外這種為得到程式碼覆蓋率進行的注入也會導致測試執行的時間增長。