Android Unit Test 單元測試基本介紹

基本概念

維基百科的定義:單元測試(又稱為模塊測試, Unit Testing)是針對程序模塊(軟件設(shè)計的最小單位)來進行正確性檢驗的測試工作标捺。程序單元是應用的最小可測試部件茶敏。在過程化編程中,一個單元就是單個程序、函數(shù)诬烹、過程等此虑;對于面向?qū)ο缶幊蹋钚卧褪欠椒庹ɑ悾ǔ悾┣⒊橄箢悺⒒蛘吲缮悾ㄗ宇悾┲械姆椒ā?/p>

《軟件測試方法和技術(shù)》(朱少民 清華大學出版社 2005年7月第一版):
單元測試是對軟件基本組成單元的測試褥符。單元測試的對象是軟件設(shè)計的最小單位——模塊洞渤。很多參考書中將單元測試的概念誤導為一個具體函數(shù)或一個類的方法。一個最小的單元應該有明確的功能属瓣、性能定義载迄、接口定義而且可以清晰地與其他單元區(qū)分開來。一個菜單抡蛙、一個顯示界面或者能夠獨立完成的具體功能都可以是一個單元护昧。某種意義上單元的概念已經(jīng)擴展為組件(component)


名詞解釋

  • JUnit: java單元測試最普及的框架
  • testCompile: 用于src/test下的代碼測試,在JVM環(huán)境下
  • androidTestCompile: 用于src/androidTest下的代碼測試粗截,在Android device(or an emulator)

小特點說明

  • 在JUnit 4中可以不用在測試方法前加test前綴了(JUnit 3中還需要加)

AS依賴

應用模塊的 build.gradle 文件中指定測試庫依賴項(來自Google官方文檔):

dependencies {
    // Required for local unit tests (JUnit 4 framework)
    testCompile 'junit:junit:4.12'

    // Required for instrumented tests
    androidTestCompile 'com.android.support:support-annotations:24.0.0'
    androidTestCompile 'com.android.support.test:runner:0.5'
}

Android項目中惋耙,你創(chuàng)建單元測試文件在module-name/src/test/java/路徑下。這個路徑在創(chuàng)建項目的時候已經(jīng)創(chuàng)建了。

你也需要設(shè)置項目依賴绽榛,如上例所示 JUnit4框架湿酸,如果你的單元測試需要用到Android的依賴,則需要Mockito庫灭美,下文有關(guān)于Mock的介紹推溃。


創(chuàng)建AS單元測試

注解解釋

注解可以方便的設(shè)置你想要測試的功能

  • @BeforeClass:針對類中所有測試,只執(zhí)行一次届腐,且必須為static void
  • @Before:初始化方法铁坎,針對每個測試方法執(zhí)行一次
  • @Test:測試方法,包括使用斷言判定待測試方法的輸出是否正確犁苏、是否拋出特定異常等
  • @After:釋放資源硬萍,針對每個測試方法執(zhí)行一次
  • @AfterClass:針對所有測試,只執(zhí)行一次围详,且必須為static void
  • @Ignore:忽略的測試方法
  • @RunWith(Suite.class) @Suite.SuiteClasses({ *.class}) 指定測試套件朴乖,一次運行多個測試類中的測試方法

斷言

除了使用assertEquals、assertTrue助赞,為了提高可讀性寒砖,還可以使用JUnit4.4引入的Hamcrest框架,assertThat嫉拐。詳細的斷言可以看API文檔哩都。

舉個例子

用網(wǎng)上最流行的例子,Calculator.java

public class Calculator{

    public double sum(double a, double b){
        return0;
    }

    public double substract(double a, double b){
        return0;
    }
    
    public double divide(double a, double b){
        return0;
    }
    
    public double multiply(double a, double b){
        return0;
    }
}

相應的單元測試類

import org.junit.Before;
import org.junit.Test;

import static org.junit.Assert.*;

public class CalculatorTest{

    private Calculator mCalculator;

    @Before
    public void setUp() throws Exception {
        mCalculator = new Calculator();
    }
    
    @Test
    public void testSum() throws Exception {
        //expected: 6, sum of 1 and 5
        assertEquals(6, mCalculator.sum(1, 5));
    }
    
    @Test
    public void testSubstract() throws Exception {
        assertEquals(1, mCalculator.substract(5,4));
    }
    
    @Test
    public void testDivide() throws Exception {
        assertEquals(4d, mCalculator.divide(20d, 5d));
    }
    
    @Test public void testMultiply() throws Exception {
        assertEquals(10d, mCalculator.multiply(2d, 5d));
    }
}    

Mock

有時在單元測試中需要用到Android相關(guān)的類婉徘,比如說Context漠嵌、Activity,但是在其他JUnit中不存在這些類盖呼,這時我們就要用到Mock和Mockito儒鹿,是一個模擬測試框架,可以獲取你需要的各種類几晤。

  • 如何依賴
repositories { jcenter() }

dependencies { 
testCompile "org.mockito:mockito-core:2.+" 
}

Mockito例子

更多信息見官網(wǎng)API文檔

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.CoreMatchers.*;
import static org.mockito.Mockito.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import android.content.SharedPreferences;

@RunWith(MockitoJUnitRunner.class)
public class UnitTestSample {

    private static final String FAKE_STRING = "HELLO WORLD";

    @Mock
    Context mMockContext;

    @Test
    public void readStringFromContext_LocalizedString() {
        // Given a mocked Context injected into the object under test...
        when(mMockContext.getString(R.string.hello_word))
                .thenReturn(FAKE_STRING);
        ClassUnderTest myObjectUnderTest = new ClassUnderTest(mMockContext);

        // ...when the string is returned from the object under test...
        String result = myObjectUnderTest.getHelloWorldString();

        // ...then the result should be the expected one.
        assertThat(result, is(FAKE_STRING));
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末约炎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蟹瘾,更是在濱河造成了極大的恐慌圾浅,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件憾朴,死亡現(xiàn)場離奇詭異狸捕,居然都是意外死亡,警方通過查閱死者的電腦和手機众雷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門灸拍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來做祝,“玉大人,你說我怎么就攤上這事鸡岗』旎保” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵轩性,是天一觀的道長声登。 經(jīng)常有香客問我,道長炮姨,這世上最難降的妖魔是什么捌刮? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任碰煌,我火速辦了婚禮舒岸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘芦圾。我一直安慰自己蛾派,他們只是感情好,可當我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布个少。 她就那樣靜靜地躺著洪乍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪夜焦。 梳的紋絲不亂的頭發(fā)上壳澳,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天,我揣著相機與錄音茫经,去河邊找鬼巷波。 笑死,一個胖子當著我的面吹牛卸伞,可吹牛的內(nèi)容都是我干的抹镊。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼荤傲,長吁一口氣:“原來是場噩夢啊……” “哼垮耳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起遂黍,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤终佛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后雾家,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體查蓉,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年榜贴,在試婚紗的時候發(fā)現(xiàn)自己被綠了豌研。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妹田。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鹃共,靈堂內(nèi)的尸體忽然破棺而出鬼佣,到底是詐尸還是另有隱情,我是刑警寧澤霜浴,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布晶衷,位于F島的核電站,受9級特大地震影響阴孟,放射性物質(zhì)發(fā)生泄漏晌纫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一永丝、第九天 我趴在偏房一處隱蔽的房頂上張望锹漱。 院中可真熱鬧,春花似錦慕嚷、人聲如沸哥牍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嗅辣。三九已至,卻和暖如春挠说,著一層夾襖步出監(jiān)牢的瞬間澡谭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工损俭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蛙奖,地道東北人。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓撩炊,卻偏偏與公主長得像外永,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子拧咳,可洞房花燭夜當晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,769評論 25 707
  • Android單元測試介紹 處于高速迭代開發(fā)中的Android項目往往需要除黑盒測試外更加可靠的質(zhì)量保障伯顶,這正是單...
    東經(jīng)315度閱讀 3,096評論 6 37
  • 什么是單元測試 在計算機編程中,單元測試(Unit Testing)又稱為模塊測試, 是針對程序模塊(軟件設(shè)計的最...
    HelloCsl閱讀 10,942評論 1 46
  • 最近看到一則新聞—— 英國諾貝爾獎得主蒂姆·亨特在公開場合談起女孩們在實驗室?guī)Ыo他的“麻煩”骆膝,稱“女孩子出現(xiàn)在實驗...
    林小抒閱讀 15,034評論 11 17
  • 說實話祭衩,我自己不敢以“寫作”為題。在自己看來阅签,寫作是一件非常高大上的事情掐暮;作家是文思泉涌,下筆生花政钟,是一份高大上...
    星渝閱讀 299評論 3 0