本章將在Jenkins中自動執(zhí)行單元測試腳本,并生成測試報告。使用了較為方便的Spock測試框架,非常值得在Java項目的單元測試中推廣應用。
(一)使用Spock框架進行自動化單元測試
- Spock的介紹
談到java的單元測試框架,一般常用的是JUnit,但我們今天推薦的單元測試框架是Spock。
Spock是基于groovy和Java語言的框架,它的特點是能夠高效方便的進行編碼和展示測試結(jié)果。Spock用groovy語言編寫,groovy語言是基于Java的,語法很多類似Python,Java程序員可以無縫掌握。
Spock框架的優(yōu)點很多。除了繼承了groovy的方便的語法外,還有兩個比較重要的優(yōu)點:
- 方法名稱、輸入輸出都可以用字符串表示,并出現(xiàn)在測試報告內(nèi)。這樣,直接通過方法名稱和輸入輸出名稱,就能直觀的看到測試了哪些內(nèi)容。
- 測試結(jié)果能夠很直觀的展現(xiàn),便于查找問題,這是區(qū)別于Junit最明顯的一點。
Spock的幾個優(yōu)點我們會在后面的案例里逐步演示。
- pom的配置
要在代碼中使用Spock框架,首先當然是在pom中聲明依賴項。Spock的依賴項可以分為兩個部分,一個是框架本身的依賴項,一個是生成測試報告的依賴項,具體的配置項如下所示。
</plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.6</version>
<configuration>
<userFile>false</userFile>
<includes>
<include>**/*Spec.java</include>
<include>**/*Test.java</include>
</includes>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-core</artifactId>
<version>1.1-groovy-2.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.4.4</version>
<scope>test</scope>
</dependency>
<!---->
<!-- 單元測試報告 -->
<dependency>
<groupId>com.athaydes</groupId>
<artifactId>spock-reports</artifactId>
<version>1.6.1</version>
<scope>test</scope>
<!-- this avoids affecting your version of Groovy/Spock -->
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- // if you don't already have slf4j-api and an implementation of it in the classpath, add this! -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.13</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.13</version>
<scope>test</scope>
</dependency>
- 單元測試的編碼
下面使用Spock開發(fā)單元測試編碼。簡單的對一個變量賦值方法進行測試。方法所在的類如下所示。
public class test {
int i;
public String j;
public String AAA;
public void mytest() {
if(AAA !=j)
j = AAA;
}
}
方法的測試代碼如下所示。
class myTest extends spock.lang.Specification{
def "測試基本功能"(){
given:"賦初始值"
def test1 = new test()
test1.j = j
test1.AAA = a
when:"執(zhí)行賦值語句"
test1.mytest()
then:"兩個值相等"
test1.j == test1.AAA
where:"給定初始值"
j | a
"01" | "02"
}
}
測試結(jié)果如圖所示,明顯測試已通過。

通過上面的測試代碼可以發(fā)現(xiàn),Spock的語法是非常直觀方便的,測試內(nèi)容,輸入輸出都能夠通過命名一目了然。
為了進一步演示Spock的特點,我們將測試要求做一點修改,將兩個變量判等,修改為判不等,那么測試當然是無法通過的,我們看看對于測試失敗的情況,Spock會如何顯示,顯示結(jié)果見下圖。

由圖中可見,Spock對于失敗的測試,清晰的顯示了輸入輸出和最終失敗的原因。

- 測試結(jié)果和報告
Spock對于測試報告也有非常直觀的顯示方式,有專用的spock-reports插件進行測報顯示。測報效果如圖。

- 代碼提交遠程服務器
至此,我們的單元測試腳本已經(jīng)編碼執(zhí)行完畢,需要將代碼提交到遠程服務器,準備交由Jenkins去執(zhí)行。設置好遠程服務器地址,add和commit代碼后,就可以push到遠程服務器了。
(二)Jenkins的配置
- 任務配置
要在Jenkins內(nèi)自動進行單元測試,需要在兩個位置進行配置。一個是在編譯時,配置maven來執(zhí)行test部分代碼,一個是在編譯后,向Jenkins指定測試報告路徑,在Jenkins任務內(nèi)顯示單元測報。下面我們來看具體配置。

- 執(zhí)行結(jié)果
在Jenkins內(nèi)進行手工構建,執(zhí)行結(jié)果見下圖。在頁面上可以點擊測報的超鏈接,進一步查看測報。


總結(jié)
至此,我們完成了在Jenkins內(nèi)的自動化單元測試腳本的執(zhí)行和生成測報。通過本章,我們接觸了Spock這一方便的Java項目測試框架,大家有興趣可以進一步了解groovy和Spock。另外對于Jenkins內(nèi)的單元測試調(diào)用配置也是非常方便,通過本章也能有個大概的了解。