1. 程式人生 > >自動化單元工具EvoSuie的程式碼覆蓋報告

自動化單元工具EvoSuie的程式碼覆蓋報告

EvoSuite是由Sheffield等大學聯合開發的一種開源工具,用於自動生成測試用例集,生成的測試用例均符合Junit的標準,可直接在Junit中執行。得到了Google和Yourkit的支援。

生成的測試cases的執行依賴

由EvoSuite生成的測試cases需要EvoSuite框架的runtime包支援才能進行測試,因此要在工程中加入如下的Maven依賴

<dependency>
<groupId>org.evosuite</groupId> <artifactId>evosuite-standalone-runtime</artifactId> <version>1.0.6</version> <scope>test</scope>
</dependency>

 

 

注意:EvoSuite的bytecode instrumentation和類似Jacoco這類工具在bytecode instrumentation上有可能有衝突,導致最後的覆蓋率統計都是0

bytecode instrumentation是改變了編譯器上生成的一個類的bytecode,用它可以完成如:計算一個方法被執行需要多長時間、改變它的執行流程等特別的流程。使用者可以新增/改變應用程式的位元組碼,自從有了這個功能後,就不需要修改整個應用程式源。

EvoSuite的位元組碼檢測

在EvoSuite的bytecode instrumentation有兩種選擇如下:

其一、在EvoSuite的 @RunWith(EvoRunner.class)中,會呼叫EvoSuite自己的classloader,而在這個過程中就呼叫它自己提供的bytecode instrumentation來完成對應的分析。這就導致了EvoSuite的bytecode instrumentation是早於其他程式碼覆蓋工具完成。

其二、EvoSuite會啟動一個Java的代理,代理會攔截全部的class loading,然後加入其EvoSuie的bytecode instrumentation。

EvoSuite目前預設是第一種,但是如果可以使用第二種,測者建議使用第二種,因為第二種可以有效避免和類似Jacoco工具的bytecode instrumentation的衝突,但是如果在測試在代理啟動前就執行了,那麼就不會起作用了範圍會報EvoSuite的錯誤。

在使用過程中,如果發現程式碼覆蓋報告全部是0,可以嘗試通過一下方式切換上面的兩種bytecode instrumentation方式。

@RunWith(EvoRunner.class) 
@EvoRunnerParameters(mockJVMNonDeterminism = true,
useVFS = true, useVNET = true, resetStaticState = true,
separateClassLoader = true, useJEE = true)

 

修改separateClassLoader = true為false(從方式1 變成方式2),如果一切自效果,那麼可以再Maven的pom中加入對應的配置:

<configuration>
    <extraArgs> -Duse_separate_classloader=false </extraArgs>
</configuration>