作為一個(gè)Java開(kāi)發(fā)者,你有很多個(gè)測(cè)試框架可選,這一節(jié)我將介紹傳統(tǒng)的JUnit和TestNG,如果你沒(méi)有接觸過(guò)這些框架,你可以先看看他們的在線(xiàn)文檔。
你將給你之前的ToDo應(yīng)用的存儲(chǔ)類(lèi)InMemoryToDoRepository.java編寫(xiě)單元測(cè)試,為了突出不同框架的相同和不同之處,所有的單元測(cè)試都會(huì)驗(yàn)證同一個(gè)類(lèi)的功能。接下來(lái)你給子項(xiàng)目repository編寫(xiě)測(cè)試,放置測(cè)試代碼的正確位置是在測(cè)試的標(biāo)準(zhǔn)布局里,在src/test/java目錄下創(chuàng)建一個(gè)名叫InMemoryToDoRepositoryTest.java的類(lèi),你可以學(xué)習(xí)測(cè)試驅(qū)動(dòng)開(kāi)發(fā)的相關(guān)理論,在代碼中添加適當(dāng)?shù)臄嘌哉Z(yǔ)句,下面這段代碼用來(lái)測(cè)試插入功能的正確性。
import com.manning.gia.todo.model.ToDoItem;
import org.junit.Before;
import org.junit.Test;
import java.util.List;
import static org.junit.Assert.*;
public class InMemoryToDoRepositoryTest {
private ToDoRepository inMemoryToDoRepository;
//用這個(gè)注解標(biāo)識(shí)的都會(huì)在類(lèi)的所有測(cè)試方法之前執(zhí)行
@Before
public void setUp() {
inMemoryToDoRepository = new InMemoryToDoRepository();
}
//用這個(gè)注解的都會(huì)作為測(cè)試用例
@Test
public void insertToDoItem() {
ToDoItem newToDoItem = new ToDoItem();
newToDoItem.setName("Write unit tests");
Long newId = inMemoryToDoRepository.insert(newToDoItem); //錯(cuò)誤的斷言會(huì)導(dǎo)致測(cè)試失敗
assertNull(newId);
ToDoItem persistedToDoItem = inMemoryToDoRepository.findById(newId);
assertNotNull(persistedToDoItem);
assertEquals(newToDoItem, persistedToDoItem);
}
}
接下來(lái)你需要在依賴(lài)配置中添加JUnit的依賴(lài):
project(':repository')repositories {
mavenCentral()
}
{
}
dependencies {
compile project(':model')
testCompile 'junit:junit:4.11'
}
之前我們講過(guò)test任務(wù)會(huì)先編譯源代碼,生成Jar文件,然后編譯測(cè)試代碼最后執(zhí)行測(cè)試,下面的命令行輸出顯示了有一個(gè)斷言出錯(cuò)的情況:
$ gradle :repository:test
:model:compileJava
:model:processResources UP-TO-DATE
:model:classes
:model:jar
:repository:compileJava
:repository:processResources UP-TO-DATE
:repository:classes
:repository:compileTestJava
:repository:processTestResources UP-TO-DATE
:repository:testClasses
:repository:test
com.manning.gia.todo.repository.InMemoryToDoRepositoryTest
> testInsertToDoItem FAILED//出錯(cuò)方法的名字
java.lang.AssertionError at InMemoryToDoRepositoryTest.java:24
//測(cè)試結(jié)果概括
1 test completed, 1 failed
:repository:test FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':repository:test'.
> There were failing tests. See the report at:
? file:///Users/ben/dev/gradle-in-action/code/chapter07/junit-test-
? failing/repository/build/reports/tests/index.html
從輸出可以看出一個(gè)斷言失敗了,這正是你想看到的,顯示的信息并沒(méi)有告訴你為什么測(cè)試失敗了,指示告訴你第24行的斷言失敗了,如果你有很多個(gè)測(cè)試,你需要打開(kāi)測(cè)試報(bào)告才能找到出錯(cuò)的原因,你可以在任務(wù)使用-i選項(xiàng)打印日志輸出:
$ gradle :repository:test –i
...
com.manning.gia.todo.repository.InMemoryToDoRepositoryTest
> testInsertToDoItem FAILED
java.lang.AssertionError: expected null, but was:<1>
at org.junit.Assert.fail(Assert.java:88)
at org.junit.Assert.failNotNull(Assert.java:664)
at org.junit.Assert.assertNull(Assert.java:646)
at org.junit.Assert.assertNull(Assert.java:656)
at com.manning.gia.todo.repository.InMemoryToDoRepositoryTest
? .testInsertToDoItem(InMemoryToDoRepositoryTest.java:24)
...
在堆棧樹(shù)我們可以找到出錯(cuò)的原因是newId的值我們假定是null的實(shí)際上為1,所以斷言出錯(cuò)了,修改之后再運(yùn)行可以看到所有測(cè)試都通過(guò)了:
$ gradle :repository:test
:model:compileJava
:model:processResources UP-TO-DATE
:model:classes
:model:jar
:repository:compileJava
:repository:processResources UP-TO-DATE
:repository:classes
:repository:compileTestJava
:repository:processTestResources UP-TO-DATE
:repository:testClasses
:repository:test
Gradle可以生成更加視覺(jué)化的測(cè)試報(bào)告,你可以在build/reports/test目錄下找到HTML文件,打開(kāi)HTML文件你應(yīng)該可以看到類(lèi)似這樣的東西:
http://wiki.jikexueyuan.com/project/gradleIn-action/images/dag54.png" alt="" />
你可能在你的項(xiàng)目中想使用其他的測(cè)試框架比如TestNG和Spock
使用testNG
比如你想用testNG來(lái)編寫(xiě)相同的測(cè)試類(lèi),相似的,你用testNG指定的注解來(lái)標(biāo)識(shí)相應(yīng)的方法,要想你的構(gòu)建執(zhí)行testNG測(cè)試,你需要做兩件測(cè)試:
如下圖所示來(lái)配置腳本文件:
project(':repository'){
repositories {
mavenCentral()
}
dependencies {
compile project(':model')
testCompile 'org.testng:testng:6.8'
}
//設(shè)置使用testNG來(lái)測(cè)試
test.useTestNG()
}