工具簡介
Evosuite是國外大學機構主導開發的一款開源的Java單測代碼生成工具,在數次SBST Unit Testing Tool Competition中評測獲得最高分。官網地址:http://www.evosuite.org/。
Evosuite的主要特性(翻譯自官網):
1.對於指定類,生成Junit4類型的單測代碼。
2.根據不同覆蓋指標調整生成的用例,例如 行覆蓋,分支覆蓋,輸出覆蓋等。
3.單測用例最小化,只有對覆蓋率有貢獻的單測用例才會被保留。
4.生成的單測用例中包含Junit斷言。
5.測試運行在sandbox中。
6.虛擬文件系統。
7.虛擬網絡。
工具安裝方法
工具支持4種方式,包括:1.命令行,2.Eclipst plugin,3.Idea plugin,4.Maven plugin。因為我們工程都是maven工程,因此使用Maven plugin方式介紹。(其他詳細用法可參考官網)
1.首先確保項目中有Junit,推薦Junit4.12以上
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency>
2.在pom.xml中添加下面三段(前兩段必須,第三段可選)。 第一段里 evosuite-standalone-runtime.jar是跑單測代碼時需要用到的Evosuie運行時環境。第二段 maven plugin用來生成單測代碼。第三段是evosuite統計單測覆蓋率的plugin。
<dependency> <groupId>org.evosuite</groupId> <artifactId>evosuite-standalone-runtime</artifactId> <version>${evosuiteVersion}</version> <scope>test</scope> </dependency>
-------------------------------------------------------
<pluginManagement> <plugins> <plugin> <groupId>org.evosuite.plugins</groupId> <artifactId>evosuite-maven-plugin</artifactId> <version>1.0.6</version> <executions><execution> <goals> <goal> prepare </goal> </goals> <phase> process-test-classes </phase> </execution></executions> </plugin> </plugins> </pluginManagement>
-----------------------------------------------------
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.17</version> <configuration> <properties> <property> <name>listener</name> <value>org.evosuite.runtime.InitializingListener</value> </property> </properties> </configuration> </plugin>
工具使用方法
Evosuite maven plugin主要包括以下用法:1.generate用來生成單測代碼,生成后的單測代碼在.evosuite目錄下;2.export用來把.evosuite中的單測代碼移到指定文件夾下,
默認目標路徑是src/test/java,指定路徑時使用-DtargetFolder參數;3.info用來顯示生成的單測代碼信息;4.clean用來清除.evosuite目錄下的單測代碼;
示例1:mvn evosuite:help -Ddetail=true -Dgoal=generate 顯示generate的詳細用法,支持的參數。
示例2:mvn evosuite:generate -Dcuts=com.ucenter.users.service.impl.ApiServiceImpl 只針對對ApiServiceImpl生成單測用例。注意:Evosuite基於字節碼來生成單測代碼,因此源代碼必須先編譯后,才能使用evosuite.
示例3:mvn -DmemoryInMB=2000 -Dcores=2 evosuite:generate evosuite:export test,終極用法,編譯-》會針對所有類生成單測用例並導出到src/test/java下-》運行單測,-DmemoryInMB=2000表示試用2000MB的內存,-Dcores=2表示用2個cpu來並行加快生成速度。
注意:當工程代碼量大時,生成花費的時間可能很長。
工具效果評估
使用業務工程中server層一個service類ApiServiceImpl進行試用,會生成兩份文件,ApiServiceImpl_ESTest.java包含單測用例,ApiServiceImpl_ESTest_scaffolding.java 用例基類,用來在測試前初始化Evosuite的沙盒環境。
1.可以看到Evosuite會自動對servce依賴的其他對象進行mock。
2.針對被測方法的參數,根據參數類型會使用各種邊界值進行測試。使用evoSuite生成的單測代碼覆蓋率可以達到:方法覆蓋100%,行覆蓋51%。
3.工具存在的不足之處是,Mock對象的方法調用只能返回空值null值等, 沒有對方法進行特定的stub,因此正常的邏輯無法走到。EvoSuite生成的單測用例更適用於測試邊界情況和異常情況。作為測試邊界和異常情況時,使用Evosuite是可以省不少力的。