成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java JUnit 單元測(cè)試小結(jié)

Rainie / 1787人閱讀

摘要:一旦你完成了相應(yīng)函數(shù),只需要把注解刪去,就可以進(jìn)行正常的測(cè)試。表示該方法只執(zhí)行一次,并且在所有方法之后執(zhí)行。

測(cè)試類型 單元測(cè)試(Unit test)

單元測(cè)試關(guān)注單一的類. 它們存在的目的是檢查這個(gè)類中的代碼是否按照期望正確運(yùn)行.

集成測(cè)試(Integration test)

顧名思義, 集成測(cè)試是檢查開發(fā)的模塊和其他模塊整合時(shí)是否正常工作.
雖然集成測(cè)試的代碼影響范圍比單元測(cè)試要廣, 但是集成測(cè)試和單元測(cè)試一樣, 也是針對(duì)于開發(fā)者而言的.

端到端測(cè)試(End-to-End test)

端到端測(cè)試是將整個(gè)系統(tǒng)作為一個(gè)整體, 然后從用戶的角度進(jìn)行測(cè)試的.
端到端測(cè)試的目的是測(cè)試系統(tǒng)在實(shí)際使用的是否正常的, 因此通常來(lái)說是不需要測(cè)試替身的(Test Double)

單元測(cè)試基本概念 什么是單元測(cè)試

單元測(cè)試的目的: 測(cè)試當(dāng)前所寫的代碼是否是正確的, 例如輸入一組數(shù)據(jù), 會(huì)輸出期望的數(shù)據(jù); 輸入錯(cuò)誤數(shù)據(jù), 會(huì)產(chǎn)生錯(cuò)誤異常等.
在單元測(cè)試中, 我們需要保證被測(cè)系統(tǒng)是獨(dú)立的(SUT 沒有任何的 DOC), 即當(dāng)被測(cè)系統(tǒng)通過測(cè)試時(shí), 那么它在任何環(huán)境下都是能夠正常工作的. 編寫單元測(cè)試時(shí), 僅僅需要關(guān)注單個(gè)類就可以了. 而不需要關(guān)注例如數(shù)據(jù)庫(kù)服務(wù), Web 服務(wù)等組件.

被測(cè)系統(tǒng)

被測(cè)系統(tǒng)(System under test, SUT)表示正在被測(cè)試的系統(tǒng), 目的是測(cè)試系統(tǒng)能否正確操作.
根據(jù)測(cè)試類型的不同, SUT 指代的內(nèi)容也不同, 例如 SUT 可以是一個(gè)類甚至是一整個(gè)系統(tǒng).

測(cè)試依賴組件(DOC)

被測(cè)系統(tǒng)所依賴的組件, 例如進(jìn)程 UserService 的單元測(cè)試時(shí), UserService 會(huì)依賴 UserDao, 因此 UserDao 就是 DOC.

測(cè)試替身(Test Double)

一個(gè)實(shí)際的系統(tǒng)會(huì)依賴多個(gè)外部對(duì)象, 但是在進(jìn)行單元測(cè)試時(shí), 我們會(huì)用一些功能較為簡(jiǎn)單的并且其行為和實(shí)際對(duì)象類似的假對(duì)象來(lái)作為 SUT 的依賴對(duì)象, 以此來(lái)降低單元測(cè)試的復(fù)雜性和可實(shí)現(xiàn)性. 在這里, 這些假對(duì)象就被稱為 測(cè)試替身(Test Double).
測(cè)試替身有如下 5 種類型:

Test stub, 為 SUT 提供數(shù)據(jù)的假對(duì)象.
我們舉一個(gè)例子來(lái)展示什么是 Test stub.

假設(shè)我們的一個(gè)模塊需要從 HTTP 接口中獲取商品價(jià)格數(shù)據(jù), 這個(gè)獲取數(shù)據(jù)的接口被封裝為 getPrice 方法. 在對(duì)這個(gè)模塊進(jìn)行測(cè)試時(shí), 我們顯然不太可能專門開一個(gè) HTTP 服務(wù)器來(lái)提供此接口, 而是提供一個(gè)帶有 getPrice 方法的假對(duì)象, 從這個(gè)假對(duì)象中獲取數(shù)據(jù).
在這個(gè)例子中, 提供數(shù)據(jù)的假對(duì)象就叫做 Test stub.

Fake object
實(shí)現(xiàn)了簡(jiǎn)單功能的一個(gè)假對(duì)象. Fake object 和 Test stub 的主要區(qū)別就是 Test stub 側(cè)重于用于提供數(shù)據(jù)的假對(duì)象, 而 Fake object 沒有這層含義.

使用 Fake object 的最主要的原因就是在測(cè)試時(shí)某些組件不可用或運(yùn)行速度太慢, 因而使用 Fake object 來(lái)代替它們.

Mock object
用于模擬實(shí)際的對(duì)象, 并且能夠校驗(yàn)對(duì)這個(gè) Mock object 的方法調(diào)用是否符合預(yù)期.

實(shí)際上, Mock object 是 Test stub 或 Fake object 一種, 但是 Mock object 有 Test stub/Fake object 沒有的特性, Mock object 可以很靈活地配置所調(diào)用的方法所產(chǎn)生的行為, 并且它可以追蹤方法調(diào)用, 例如一個(gè) Mock Object 方法調(diào)用時(shí)傳遞了哪些參數(shù), 方法調(diào)用了幾次等.

Dummy object: 在測(cè)試中并不使用的, 但是為了測(cè)試代碼能夠正常編譯/運(yùn)行而添加的對(duì)象. 例如我們調(diào)用一個(gè) Test Double 對(duì)象的一個(gè)方法, 這個(gè)方法需要傳遞幾個(gè)參數(shù), 但是其中某個(gè)參數(shù)無(wú)論是什么值都不會(huì)影響測(cè)試的結(jié)果, 那么這個(gè)參數(shù)就是一個(gè) Dummy object.
Dummy object 可以是一個(gè)空引用, 一個(gè)空對(duì)象或者是一個(gè)常量等.

簡(jiǎn)單的說, Dummy object 就是那些沒有使用到的, 僅僅是為了填充參數(shù)列表的對(duì)象.

Test Spy
可以包裝一個(gè)真實(shí)的 Java 對(duì)象, 并返回一個(gè)包裝后的新對(duì)象. 若沒有特別配置的話, 對(duì)這個(gè)新對(duì)象的所有方法調(diào)用, 都會(huì)委派給實(shí)際的 Java 對(duì)象.

mock 和 spy 的區(qū)別是: mock 是無(wú)中生有地生出一個(gè)完全虛擬的對(duì)象, 它的所有方法都是虛擬的; 而 spy 是在現(xiàn)有類的基礎(chǔ)上包裝了一個(gè)對(duì)象, 即如果我們沒有重寫 spy 的方法, 那么這些方法的實(shí)現(xiàn)其實(shí)都是調(diào)用的被包裝的對(duì)象的方法.

Test fixture

所謂 test fixture, 就是運(yùn)行測(cè)試程序所需要的先決條件(precondition). 即對(duì)被測(cè)對(duì)象進(jìn)行測(cè)試時(shí)鎖需要的一切東西(The test fixture is everything we need to have in place to exercise the SUT). 這個(gè) 東西 不單單指的是數(shù)據(jù), 同時(shí)包括對(duì)被測(cè)對(duì)象的配置, 被測(cè)對(duì)象所需要的依賴對(duì)象等.
JUnit4 之前是通過 setUp, TearDown 方法完成, 在 JUnit4這, 我們可以使用@Before 代替 setUp 方法, @After 代替 tearDown 方法.

注意, @Before 在每個(gè)測(cè)試方法運(yùn)行前都會(huì)被調(diào)用, @After 在每個(gè)測(cè)試方法運(yùn)行后都會(huì)被調(diào)用.

因?yàn)?@Before 和 @After 會(huì)在每個(gè)測(cè)試方法前后都會(huì)被調(diào)用, 而有時(shí)我們僅僅需要在測(cè)試前進(jìn)行一次初始化, 這樣的情況下, 可以使用@BeforeClass 和@AfterClass 注解.

測(cè)試用例(Test case)

在 JUnit 3中, 測(cè)試方法都必須以 test 為前綴, 且必須是 public void 的, JUnit 4之后, 就沒有這個(gè)限制了, 只要在每個(gè)測(cè)試方法標(biāo)注 @Test 注解, 方法簽名可以是任意的.

測(cè)試套件

通過 TestSuit 對(duì)象將多個(gè)測(cè)試用例組裝成一個(gè)測(cè)試套件, 測(cè)試套件批量運(yùn)行.
通過@RunWith 和@SuteClass 兩個(gè)注解, 我們可以創(chuàng)建一個(gè)測(cè)試套件. 通過@RunWith 指定一個(gè)特殊的運(yùn)行器, 幾 Suite.class 套件運(yùn)行器, 并通過@SuiteClasses 注解, 將需要進(jìn)行測(cè)試的類列表作作為參數(shù)傳入.

JUnit4 HelloWorld 例子

我們已一個(gè)簡(jiǎn)單的例子來(lái)快速展示 JUnit4 的基本用法.
首先新建一個(gè)名為 JUniTest 的 Maven 工程, 然后添加依賴:


    
        junit
        junit
        4.12
    

接著編寫測(cè)試套件:

import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class TestJunit {
    @Test
    public void testingCrunchifyAddition() {
        assertEquals("Here is test for Addition Result: ", 30, addition(27, 3));
    }

    @Test
    public void testingHelloWorld() {
        assertEquals("Here is test for Hello World String: ", "Hello + World", helloWorld());
    }

    public int addition(int x, int y) {
        return x + y;
    }

    public String helloWorld() {
        String helloWorld = "Hello +" + " World";
        return helloWorld;
    }
}

隨后使用測(cè)試用例:

public class App {
    public static void main(String[] args) {
        Result result = JUnitCore.runClasses(TestJunit.class);
        for (Failure failure : result.getFailures()) {
            System.out.println(failure.toString());
        }
        if (result.wasSuccessful()) {
            System.out.println("Both Tests finished successfully...");
        }
    }
}

這就是一個(gè)完整的 JUnit 測(cè)試?yán)恿?

定義測(cè)試

一個(gè) JUnit 測(cè)試是一個(gè)在專用于測(cè)試的類中的一個(gè)方法, 并且這個(gè)方法被 @org.junit.Test 注解標(biāo)注. 例如:

public class TestJunit {
    @Test
    public void testingCrunchifyAddition() {
        assertEquals("Here is test for Addition Result: ", 30, addition(27, 3));
    }
    ...
}
JUnit4 生命周期

JUnit4測(cè)試用例的完整的生命周期要經(jīng)歷如下幾個(gè)階段:

類級(jí)初始化資源處理

方法級(jí)初始化資源處理

執(zhí)行測(cè)試用例中的方法

方法級(jí)銷毀資源處理

類級(jí)銷毀資源處理

其中, 類級(jí)初始化和銷毀資源處理在每一個(gè)測(cè)試用例類這僅僅執(zhí)行一次, 方法級(jí)初始化, 銷毀資源處理方法在執(zhí)行測(cè)試用例這的每個(gè)測(cè)試方法中都會(huì)被執(zhí)行一次.

JUnit4 注解

@Test (expected = Exception.class) 表示預(yù)期會(huì)拋出Exception.class 的異常

@Ignore 含義是“某些方法尚未完成,暫不參與此次測(cè)試”。這樣的話測(cè)試結(jié)果就會(huì)提示你有幾個(gè)測(cè)試被忽略,而不是失敗。一旦你完成了相應(yīng)函數(shù),只需要把@Ignore注解刪去,就可以進(jìn)行正常的測(cè)試。

@Test(timeout=100) 表示預(yù)期方法執(zhí)行不會(huì)超過 100 毫秒,控制死循環(huán)

@Before 表示該方法在每一個(gè)測(cè)試方法之前運(yùn)行,可以使用該方法進(jìn)行初始化之類的操作

@After 表示該方法在每一個(gè)測(cè)試方法之后運(yùn)行,可以使用該方法進(jìn)行釋放資源,回收內(nèi)存之類的操

@BeforeClass 表示該方法只執(zhí)行一次,并且在所有方法之前執(zhí)行。一般可以使用該方法進(jìn)行數(shù)據(jù)庫(kù)連接操作,注意該注解運(yùn)用在靜態(tài)方法。

@AfterClass 表示該方法只執(zhí)行一次,并且在所有方法之后執(zhí)行。一般可以使用該方法進(jìn)行數(shù)據(jù)庫(kù)連接關(guān)閉操作,注意該注解運(yùn)用在靜態(tài)方法。

@Test 注解

被@Test 標(biāo)注的方法就是執(zhí)行測(cè)試用例的測(cè)試方法, 例如:

public class TestJunit {
    @Test
    public void  myTest() {
        assertEquals("Here is test for Addition Result: ", 30, addition(27, 3));
    }
}

方法myTest 被注解@Test 標(biāo)注, 表示這個(gè)方法是一個(gè)測(cè)試方法, 當(dāng)運(yùn)行測(cè)試用例時(shí), 會(huì)自動(dòng)調(diào)用這個(gè)方法 .

@BeforeClass , @AfterClass, @Before, @After

使用@BeforeClass 和 @AfterClass 兩個(gè)注解標(biāo)注的方法會(huì)在所有測(cè)試方法執(zhí)行前后各執(zhí)行一次
使用@Before 和 @After 兩個(gè)注解標(biāo)注的方法會(huì)在每個(gè)測(cè)試方法執(zhí)行前后都執(zhí)行一次.

TestSuite

如果有多個(gè)測(cè)試類, 可以合并成一個(gè)測(cè)試套件進(jìn)行測(cè)試, 運(yùn)行一個(gè) Test Suite, 那么就會(huì)運(yùn)行在這個(gè) Test Suite 中的所用的測(cè)試.
例如:

import org.junit.runner.RunWith;  
import org.junit.runners.Suite;  
import org.junit.runners.Suite.SuiteClasses;  
  
@RunWith( Suite.class )  
@SuiteClasses( { JUnitTest1.class, JUnitTest2.class } )  
public class AllTests {

}

在這個(gè)例子中, 我們定義了一個(gè) Test Suite, 這個(gè) Test Suite 包含了兩個(gè)測(cè)試類: JUnitTest1 和 JUnitTest2, 因此運(yùn)行 這個(gè) Test Suite 時(shí), 就會(huì)自動(dòng)運(yùn)行這兩個(gè)測(cè)試類了.

在 IntelliJ IDEA 中使用 JUnit 4

創(chuàng)建一個(gè)名為 JUnitTest 的 HelloWorld 工程, 添加依賴:


    
        junit
        junit
        4.11
    

然后創(chuàng)建 src/tests, 在File -> Project Structure -> Modules -> Sources 中, 右鍵選中 tests, 將其設(shè)置為 Test, 此時(shí) tests 目錄就變?yōu)榫G色:

然后創(chuàng)建需要進(jìn)行測(cè)試的類:

public class HelloWorld {
    public String sayHello() {
        return "Hello World!";
    }
}

在 HelloWorld 類名上按下 alt + enter 后, 就可以自動(dòng)生成測(cè)試類了:


IntelliJ 在生tests/ 目錄下生成了一個(gè)測(cè)試類, 我們可以添加自動(dòng)測(cè)試內(nèi)容:

import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class HelloWorldTest {

    @Test
    public void testSayHello() throws Exception {
        HelloWorld helloWorld = new HelloWorld();
        assertEquals(helloWorld.sayHello(), "Hello World!");
    }
}

本文由 yongshun 發(fā)表于個(gè)人博客, 采用署名-非商業(yè)性使用-相同方式共享 3.0 中國(guó)大陸許可協(xié)議.
非商業(yè)轉(zhuǎn)載請(qǐng)注明作者及出處. 商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者本人
Email: [email protected]
本文標(biāo)題為: Java JUnit 單元測(cè)試小結(jié)
本文鏈接為: https://segmentfault.com/a/11...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/65081.html

相關(guān)文章

  • Android單元測(cè)試 - 如何開始?

    摘要:寫單元測(cè)試時(shí),應(yīng)該把這些依賴隔離,讓每個(gè)單元保持獨(dú)立。以上的各種原因,都會(huì)影響單元測(cè)試的結(jié)果。在單元測(cè)試的基礎(chǔ)上,將相關(guān)模塊組合成為子系統(tǒng)或系統(tǒng)進(jìn)行測(cè)試,稱為集成測(cè)試??梢钥吹剑瑔卧獪y(cè)試速度比集成測(cè)試,也叫測(cè)試要快,并且開發(fā)成本也是最低。 showImg(/img/remote/1460000006811144); 原文鏈接:http://www.jianshu.com/p/bc996...

    Developer 評(píng)論0 收藏0
  • Android單元測(cè)試(三):JUnit單元測(cè)試框架的使用

    摘要:我們寫單元測(cè)試,一般都會(huì)用到一個(gè)或多個(gè)單元測(cè)試框架,在這里,我們介紹一下這個(gè)測(cè)試框架。除了幫我們找出所有的測(cè)試方法,并且方便運(yùn)行意外,單元測(cè)試框架還幫我們做了其他事情。 我們寫單元測(cè)試,一般都會(huì)用到一個(gè)或多個(gè)單元測(cè)試框架,在這里,我們介紹一下JUnit4這個(gè)測(cè)試框架。這是Java界用的最廣泛,也是最基礎(chǔ)的一個(gè)框架,其他的很多框架,包括我們后面會(huì)看到的Robolectric,都是基于或兼...

    X1nFLY 評(píng)論0 收藏0
  • Android 單元測(cè)試: 首先,從是什么開始

    摘要:所以,寫單元測(cè)試,就是給你的每個(gè)類的每個(gè)方法寫對(duì)于的測(cè)試方法。常見的單元測(cè)試框架有等等。那么我們給這個(gè)東西做單元測(cè)試的時(shí)候,不是測(cè)這一整個(gè)流程。叫做集成測(cè)試,而不是單元測(cè)試。那對(duì)于這個(gè)例子,單元測(cè)試是怎么樣的呢這個(gè)請(qǐng)看下一小節(jié)。 這是一系列安卓單元測(cè)試的文章,目測(cè)主要會(huì)cover以下的主題: 什么是單元測(cè)試 為什么要做單元測(cè)試 JUnit Mockito Robolectric Da...

    DevTTL 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<