EvoSuite是由Sheffield等大學(xué)聯(lián)合開(kāi)發(fā)的一種開(kāi)源工具,用于自動(dòng)生成測(cè)試用例集革答,生成的測(cè)試用例均符合Junit的標(biāo)準(zhǔn)战坤,可直接在Junit中運(yùn)行。得到了Google和Yourkit的支持残拐。
生成的測(cè)試cases的運(yùn)行依賴
由EvoSuite生成的測(cè)試cases需要EvoSuite框架的runtime包支持才能進(jìn)行測(cè)試途茫,因此要在工程中加入如下的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上有可能有沖突,導(dǎo)致最后的覆蓋率統(tǒng)計(jì)都是0
bytecode instrumentation是改變了編譯器上生成的一個(gè)類的bytecode溪食,用它可以完成如:計(jì)算一個(gè)方法被執(zhí)行需要多長(zhǎng)時(shí)間囊卜、改變它的執(zhí)行流程等特別的流程。用戶可以添加/改變應(yīng)用程序的字節(jié)碼错沃,自從有了這個(gè)功能后栅组,就不需要修改整個(gè)應(yīng)用程序源。
EvoSuite的字節(jié)碼檢測(cè)
在EvoSuite的bytecode instrumentation有兩種選擇如下:
其一枢析、在EvoSuite的 @RunWith(EvoRunner.class)中玉掸,會(huì)調(diào)用EvoSuite自己的classloader,而在這個(gè)過(guò)程中就調(diào)用它自己提供的bytecode instrumentation來(lái)完成對(duì)應(yīng)的分析登疗。這就導(dǎo)致了EvoSuite的bytecode instrumentation是早于其他代碼覆蓋工具完成排截。
其二、EvoSuite會(huì)啟動(dòng)一個(gè)Java的代理辐益,代理會(huì)攔截全部的class loading,然后加入其EvoSuie的bytecode instrumentation断傲。
EvoSuite目前默認(rèn)是第一種,但是如果可以使用第二種智政,測(cè)者建議使用第二種认罩,因?yàn)榈诙N可以有效避免和類似Jacoco工具的bytecode instrumentation的沖突,但是如果在測(cè)試在代理啟動(dòng)前就執(zhí)行了续捂,那么就不會(huì)起作用了范圍會(huì)報(bào)EvoSuite的錯(cuò)誤垦垂。
在使用過(guò)程中,如果發(fā)現(xiàn)代碼覆蓋報(bào)告全部是0牙瓢,可以嘗試通過(guò)一下方式切換上面的兩種bytecode instrumentation方式劫拗。
@RunWith(EvoRunner.class) @EvoRunnerParameters(mockJVMNonDeterminism = true, useVFS = true, useVNET = true, resetStaticState = true, separateClassLoader = true, useJEE = true)
修改separateClassLoader = true為false(從方式1 變成方式2),如果一切自效果矾克,那么可以再M(fèi)aven的pom中加入對(duì)應(yīng)的配置:
<configuration>
<extraArgs> -Duse_separate_classloader=false </extraArgs>
</configuration>
關(guān)注測(cè)者页慷,關(guān)注測(cè)試