工具嘗鮮--單元測試自動(dòng)生成工具 evosuite
作者|高嘉怡
Evosuite簡介EvoSuite是由Sheffield等大學(xué)聯(lián)合開發(fā)的一種開源工具,用于自動(dòng)生成測試用例集,生成的測試用例均符合Junit的標(biāo)準(zhǔn),可直接在Junit中運(yùn)行。
通過使用此自動(dòng)測試工具能夠在保證代碼覆蓋率的前提下極大地提高測試人員的開發(fā)效率。但是只能輔助測試,并不能完全取代人工,測試用例的正確與否還需人工判斷。
官方提供了包括:命令行工具、eclipse 插件、idea 插件、maven 插件 在內(nèi)的數(shù)種運(yùn)行方式。本文主要介紹:idea 插件、maven 插件。
Evosuite的配置與使用maven -- EvoSuite插件
1、pom.Xml配置
配置?junit 版本
<dependencies><dependency><groupId>junitgroupId><artifactId>junitartifactId><version>4.12version>dependency>配置evosuite 插件:<build><plugins><plugin><groupId>org.evosuite.pluginsgroupId><artifactId>evosuite-maven-pluginartifactId><version>1.0.6version>plugin>plugins>build><dependency><groupId>org.evosuitegroupId><artifactId>evosuite-standalone-runtimeartifactId><version>1.0.6version><scope>compilescope>dependency>
2、maven -- EvoSuite插件使用
使用之前先了解一下基本命令:
prepare:需要同時(shí)運(yùn)行EvoSuite測試和現(xiàn)有測試mvn evosuite:prepare test
compile:表示編譯。evosuite 是基于編譯后的 .class 文件生成用例的,所以需要先編譯
-DmemoryInMB=2000:表示使用 2000MB 的內(nèi)存
-Dcores=2 表示用2個(gè) cpu 來并行加快生成速度
-Dcuts=alexp.blog.service.PostServiceImpl
表示只針對(duì) alexp.blog.service.PostServiceImpl 這個(gè)類生成用例。多個(gè)用例可以用英文逗號(hào)分隔
-DtargetFolder=src/test/java/evosuite
表示生成的用例放到 src/test/java/evosuite
evosuite:generate :表示執(zhí)行生成用例
evosuite:export:默認(rèn)情況下,EvoSuite在“ .evosuite”文件夾中創(chuàng)建測試。通過使用“導(dǎo)出”,將生成的測試復(fù)制到另一個(gè)文件夾,該文件夾可以使用“ targetFolder”選項(xiàng)設(shè)置(默認(rèn)值為“ src / test / java”)
evosuite:clean:刪除“ .evosuite”文件夾中的所有數(shù)據(jù),該文件夾用于存儲(chǔ)到目前為止生成的所有最佳測試
具體更多詳情可evosuite:help進(jìn)行查看
準(zhǔn)備被測試方法,如:demoService

控制臺(tái)執(zhí)行:
mvn?compile?evosuite:generate? -Dcuts=demoTest.testService.demoTwoService? evosuite:export? -DtargetFolder=src/main/java/testcase
對(duì)指定文件進(jìn)行編譯生成用例 放置指定文件
生成結(jié)果如下,有兩個(gè)文件:
demoService_ESTest:測試用例文件
demoService_ESTest_scaffolding:用例基類,用于在開始測試前初始化

注意:
1、運(yùn)行后會(huì)產(chǎn)生evosuite 文件 存儲(chǔ)生成測試用例文件
2、用例生成地址為:DtargetFolder+ Dcuts被測文件路徑,
原因:evosuite:export 通過用“導(dǎo)出”,將生成的測試復(fù)制
到另一個(gè)文件夾,(根據(jù)自身情況)導(dǎo)出后對(duì)package 與
import需要手動(dòng)調(diào)整

查看運(yùn)行結(jié)果
Example 1:被測試內(nèi)容demoTwoService.java
mvn? compile? evosuite:generate? -Dcuts
=demoTest.testService.demoTwoService?

生成測試方法case:

IDEA-- EvoSuite插件的配置與使用
1、打開IDE,進(jìn)入setting(mac版本是Preferences)選擇plugins,點(diǎn)擊Browse repositories,搜索EvoSuite Plugin,然后選擇Install plugin

2、重啟IDEA
3、打開idea選擇文件右鍵,就可以看見Run EvoSuite

4、點(diǎn)擊Run EvoSuite 可以看見參數(shù)輸入框

-DmemoryInMB=2000 表示使用 2000MB 的內(nèi)存
-Dcores=2 表示用2個(gè) cpu 來并行加快生成速度
Mavenlocation:Maven地址,當(dāng)項(xiàng)目是Maven
項(xiàng)目時(shí)需要
EvoSuite location:evosuite-1.0.6.jar包地址,當(dāng)
項(xiàng)目是非Maven項(xiàng)目時(shí)需要
配置maven(D:\workspace\maven\apache-maven
-3.6.3\bin\mvn.cmd)路徑或EvoSuitejar路徑
如上,配置完Maven location(or EvoSuite location)
回車即觸發(fā)執(zhí)行,執(zhí)行完畢后會(huì)提示:

Example 2:被測試內(nèi)容demoService
使用插件進(jìn)行生成測試用例publicclass demoTwoService {publicintMath(int a, int b) {if(a == 0) {System.out.println("運(yùn)行1");return a;} elseif(b == 0) {System.out.println("運(yùn)行2");return0;} else{System.out.println("運(yùn)行3");return a/b;}}
查看控制臺(tái):根據(jù)參數(shù)生成了執(zhí)行命令
查看生成用例結(jié)構(gòu)與maven命令行生成一樣
生成的測試用例:

覆蓋率:

使用EvoSuite的幾種情況
例1:以Example 1:被測試內(nèi)容demoTwoService.java
為例,查看本類調(diào)用生成測試用例情況
被測試內(nèi)容如下:
publicclass TEST {publicintMath(int a, int b) {if(a == 0) {System.out.println("運(yùn)行1");return0;} elseif(b == 0) {System.out.println("運(yùn)行2");return b;} else{System.out.println("運(yùn)行3");return a / b;}}publicintTest(int a, int b) {int aa = this.Math(a, b);System.out.println("結(jié)果"+ aa);return aa;}}
生成測試用例
(因?yàn)楸绢?個(gè)方法,只截取Test方法的用例):

運(yùn)行Test方法的用例:

很明顯的是Test調(diào)用本類的Math方法,但生成的測試用例
卻少了一條 b=0的情況。
覆蓋率為84%

例2:不在同一個(gè)類調(diào)用方法

生成測試用例:

運(yùn)行結(jié)果:

就生成用例與結(jié)果看來,未有a=0 與b=0的情況,
而是以結(jié)果為正數(shù),負(fù)數(shù),0
覆蓋率:

測試用例的生成一般以被生成的方法的結(jié)果為導(dǎo)向,
會(huì)將被測方法的每種if與輸出結(jié)果的情況進(jìn)行覆蓋。
但不會(huì)全面覆蓋方法中調(diào)用的方法。生成的測試
用例只能輔助測試,并不能完全取代人工,
測試用例的正確與否還需人工判斷。

