鍍金池/ 教程/ 物聯(lián)網(wǎng)/ 單元測(cè)試
依賴(lài)管理實(shí)戰(zhàn)
配置遠(yuǎn)程倉(cāng)庫(kù)
安裝Gradle
簡(jiǎn)介
項(xiàng)目自動(dòng)化簡(jiǎn)介
配置子項(xiàng)目
Gradle強(qiáng)大的特性
自動(dòng)化測(cè)試
簡(jiǎn)介
掌握構(gòu)建生命周期
使用命令行操作
構(gòu)建Java項(xiàng)目
管理任務(wù)
構(gòu)建工具
連續(xù)傳遞的特性
用Gradle開(kāi)發(fā)Web項(xiàng)目
聲明依賴(lài)
構(gòu)建塊
簡(jiǎn)介
測(cè)試Java應(yīng)用
java構(gòu)建工具
為什么選擇Gradle
拆分項(xiàng)目文件
單元測(cè)試
多項(xiàng)目打包
Gradle 起步
介紹這個(gè)Gradle項(xiàng)目
簡(jiǎn)介
自定義腳本
Gradle包裝器
簡(jiǎn)要概述依賴(lài)管理
項(xiàng)目模塊化

單元測(cè)試

作為一個(gè)Java開(kāi)發(fā)者,你有很多個(gè)測(cè)試框架可選,這一節(jié)我將介紹傳統(tǒng)的JUnit和TestNG,如果你沒(méi)有接觸過(guò)這些框架,你可以先看看他們的在線(xiàn)文檔。

使用JUnit

你將給你之前的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="" />

使用其他測(cè)試框架

你可能在你的項(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è)試:

  1. 聲明對(duì)testNG庫(kù)的依賴(lài)
  2. 調(diào)用Test#useTestNG()方法來(lái)聲明測(cè)試過(guò)程使用testNG框架

如下圖所示來(lái)配置腳本文件:

    project(':repository'){
        repositories {
            mavenCentral()
        }
         
        dependencies {
            compile project(':model')
            testCompile 'org.testng:testng:6.8'
        }
        //設(shè)置使用testNG來(lái)測(cè)試
        test.useTestNG()
     
    }