android單元測試JUnit 4

JUnit 4

  • 單元測試(unit testing),是指對軟件中的最小可測試單元進行檢查和驗證祝沸。在android中常將一個方法或者一個類作為一個最小可測試單元。
  • JUnit 4是Android Testing Support Library庫中提供的用戶單元測試的一個框架越庇。在Android studio中可以直接使用罩锐。

本地單元測試 Local Unit Tests

  • Local Unit Tests運行在本地開發(fā)環(huán)境的JVM上,不需要連接android設(shè)備悦荒,但是同時也無法測試使用了與android相關(guān)的API
    的單元唯欣。
  • Local Unit Tests測試用例的編寫主要依靠一些注解來進行已經(jīng)依靠assertxxx來斷言測試是否通過。

Junit 4注解

  • @Before標注setup方法搬味,每個單元測試用例方法調(diào)用之前都會調(diào)用
  • @After標注teardown方法境氢,每個單元測試用例方法調(diào)用之后都會調(diào)用
  • @Test標注的每個方法都是一個測試用例
  • @BeforeClass標注的靜態(tài)方法,在當前測試類所有用例方法執(zhí)行之前執(zhí)行
  • @AfterClass標注的靜態(tài)方法碰纬,在當前測試類所有用例方法執(zhí)行之后執(zhí)行
  • @Test(timeout=)為測試用例指定超時時間

斷言

  • assertTrue(condition):condition為真pass萍聊,否則fail
  • assertFalse(condition):condition為假pass,否則fail
  • fail():直接fail
  • assertEquals(expected, actual):expected equal actual pass悦析,否則fail
  • assertSame(expected, actual):expected == actual pass寿桨,否則fail

實例

  • 編寫測試用例
/**
 * Created by jason on 2018/2/28.
 */
public class CalculationTest {

    Calculation calculation;

    @BeforeClass
    public static void start() {
        System.out.println("類運行時調(diào)用一次");
    }

    @AfterClass
    public static void end() {
        System.out.println("類結(jié)束時調(diào)用一次");
    }

    @Before
    public void before() {
        calculation = new Calculation();
        System.out.println("每個test方法前都會調(diào)用");
    }

    @After
    public void after() {
        System.out.println("每個test方法結(jié)束都會調(diào)用");
    }

    @Test
    public void add() throws Exception {
        System.out.println("test add");
        int r = calculation.add(2, 3);
        Assert.assertEquals(5, r);
    }

}
  • 輸出
類運行時調(diào)用一次
每個test方法前都會調(diào)用
test add
每個test方法結(jié)束都會調(diào)用
類結(jié)束時調(diào)用一次
  • 修改斷言使測試不通過
    @Test
    public void add() throws Exception {
        System.out.println("test add");
        int r = calculation.add(2, 3);
        Assert.assertEquals(6, r);//修改為結(jié)果為6時測試通過
    }
  • 修改后輸出
類運行時調(diào)用一次
每個test方法前都會調(diào)用
test add
每個test方法結(jié)束都會調(diào)用

java.lang.AssertionError: 
Expected :6
Actual   :5
 <Click to see difference>
...

  • 修改add方法,添加由Android提供的API强戴,由于Local Unit Tests只能測試jdk提供的方法亭螟,所以應(yīng)該是會報錯的。
import static android.content.ContentValues.TAG;

/**
 * Created by jason on 2018/2/28.
 */

public class Calculation {


    public int add(int a , int b) {
        Log.d(TAG, "add: ");
        return a+b;
    }

}
  • 結(jié)果報錯
類運行時調(diào)用一次
每個test方法前都會調(diào)用
test add
每個test方法結(jié)束都會調(diào)用

java.lang.RuntimeException: Method d in android.util.Log not mocked. See http://g.co/androidstudio/not-mocked for details.
...

設(shè)備單元測試 Instrumented Unit Tests

  • Instrumented Unit Tests需要連接安卓設(shè)備或者模擬器骑歹,與上面的本地單元測試相比预烙,自然是多了可以測試android的API。
  • 在使用上相比本地單元測試該測試類必須以@RunWith(AndroidJUnit4.class) 注解作為前綴道媚。
  • 相比Local Unit Tests 多了訪問設(shè)備信息扁掸、測試篩選功能。

訪問設(shè)備信息

我們可以使用 InstrumentationRegistry 類訪問與測試運行相關(guān)的信息最域。此類包括 Instrumentation對象谴分、目標應(yīng)用Context對象、測試應(yīng)用Context對象镀脂,以及傳遞到測試中的命令行參數(shù)牺蹄。

測試篩選

  • @RequiresDevice:指定測試僅在物理設(shè)備而不在模擬器上運行。
  • @SdkSupress:禁止在低于給定級別的 Android API 級別上運行測試薄翅。例如钞馁,要禁止在低于 18 的所有 API 級別上運行測試虑省,請使用注解 @SDKSupress(minSdkVersion=18)。
  • @SmallTest僧凰、@MediumTest和@LargeTest:指定測試的運行時長以及運行頻率。

實例

  • 編寫測試用例
@RunWith(AndroidJUnit4.class)
@SdkSuppress(minSdkVersion = 18)
public class ConfigTest {

    private static String userId;

    @Before
    public static void initId() {
        userId  = "123456";
    }

    @Test
    public void setUserId() throws Exception {
        Context context = InstrumentationRegistry.getTargetContext();
        Config.getInstance(context).setUserId(userId);
    }

    @Test
    public void getUserId() throws Exception {
        Context context = InstrumentationRegistry.getTargetContext();
        String id = Config.getInstance(context).getUserId();
        assertEquals(userId, id);
    }

}
  • 輸出
Testing started at 1:47 ...

02/28 01:47:20: Launching ConfigTest
$ adb push D:\androidproject\LocalUnitTest\app\build\outputs\apk\debug\app-debug.apk /data/local/tmp/com.jason.localunittest
$ adb shell pm install -t -r "/data/local/tmp/com.jason.localunittest"
    pkg: /data/local/tmp/com.jason.localunittest
Success


$ adb push D:\androidproject\LocalUnitTest\app\build\outputs\apk\androidTest\debug\app-debug-androidTest.apk /data/local/tmp/com.jason.localunittest.test
$ adb shell pm install -t -r "/data/local/tmp/com.jason.localunittest.test"
    pkg: /data/local/tmp/com.jason.localunittest.test
Success


Running tests

$ adb shell am instrument -w -r   -e debug false -e class com.jason.localunittest.ConfigTest com.jason.localunittest.test/android.support.test.runner.AndroidJUnitRunner
Client not ready yet..
Started running tests
Tests ran to completion.

整合自Android自動化測試--學(xué)習(xí)淺談系列文章

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末熟丸,一起剝皮案震驚了整個濱河市训措,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌光羞,老刑警劉巖绩鸣,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異纱兑,居然都是意外死亡呀闻,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門潜慎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捡多,“玉大人,你說我怎么就攤上這事铐炫±菔郑” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵倒信,是天一觀的道長科贬。 經(jīng)常有香客問我,道長鳖悠,這世上最難降的妖魔是什么榜掌? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮乘综,結(jié)果婚禮上憎账,老公的妹妹穿的比我還像新娘。我一直安慰自己瘾带,他們只是感情好鼠哥,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著看政,像睡著了一般朴恳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上允蚣,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天于颖,我揣著相機與錄音,去河邊找鬼嚷兔。 笑死森渐,一個胖子當著我的面吹牛做入,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播同衣,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼竟块,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了耐齐?” 一聲冷哼從身側(cè)響起浪秘,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎埠况,沒想到半個月后耸携,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡辕翰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年夺衍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喜命。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡沟沙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出渊抄,到底是詐尸還是另有隱情尝胆,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布护桦,位于F島的核電站含衔,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏二庵。R本人自食惡果不足惜贪染,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望催享。 院中可真熱鬧杭隙,春花似錦、人聲如沸因妙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽攀涵。三九已至铣耘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間以故,已是汗流浹背蜗细。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人炉媒。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓踪区,卻偏偏與公主長得像,于是被迫代替她去往敵國和親吊骤。 傳聞我的和親對象是個殘疾皇子缎岗,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

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