中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

初入Android單元測(cè)試

2018-07-20    來(lái)源:編程學(xué)習(xí)網(wǎng)

容器云強(qiáng)勢(shì)上線!快速搭建集群,上萬(wàn)Linux鏡像隨意使用

前言

在今年的Android開發(fā)技術(shù)中,MVP & RxJava & Retrofit 已經(jīng)成為各個(gè)項(xiàng)目的標(biāo)配了。了解過MVP的人都知道,其中的一個(gè)優(yōu)點(diǎn)就是便于 單元測(cè)試 的編寫。那么我們今天就步入單元測(cè)試的這個(gè)深坑吧。

單元測(cè)試是什么

單元測(cè)試(unit testing),是指對(duì)軟件中的最小可測(cè)試單元進(jìn)行檢查和驗(yàn)證。對(duì)于單元測(cè)試中單元的含義,一般來(lái)說,要根據(jù)實(shí)際情況去判定其具體含義,如C語(yǔ)言中單元指一個(gè)函數(shù),Java里單元指一個(gè)類,圖形化的軟件中可以指一個(gè)窗口或一個(gè)菜單等?偟膩(lái)說,單元就是人為規(guī)定的最小的被測(cè)功能模塊。單元測(cè)試是在軟件開發(fā)過程中要進(jìn)行的最低級(jí)別的測(cè)試活動(dòng),軟件的獨(dú)立單元將在與程序的其他部分相隔離的情況下進(jìn)行測(cè)試。

其實(shí)很容易理解,對(duì)于我們開發(fā)者來(lái)說就是驗(yàn)證一個(gè)功能是否正確的一個(gè)過程。

為什么要寫單元測(cè)試

相信很多東西都有自己的測(cè)試人員,所以有的人就會(huì)問了。為什么我們開發(fā)者還需要自己寫代碼來(lái)進(jìn)行測(cè)試呢?

首先我們要知道,單元測(cè)試一般是開發(fā)人員最應(yīng)該關(guān)注的事情之一,單元測(cè)試只是測(cè)試一個(gè)方法單元, 他不是測(cè)試整個(gè)流程沒有問題。引入單元測(cè)試,帶來(lái)的好處是顯而易見的,首先可以直接幫我們尋找出 bug,并且在加入新的功能模塊時(shí),可以發(fā)現(xiàn)它是否影響并破壞了我們?cè)械墓δ。單元測(cè)試還可以強(qiáng)迫讓我們的代碼變得精煉短小,因?yàn)樘^復(fù)雜的代碼無(wú)法引入單元測(cè)試。單元測(cè)試還可以節(jié)省測(cè)試成本,不需要啟動(dòng)整個(gè)系統(tǒng),就可以直接的,針對(duì)性的對(duì)任意模塊進(jìn)行測(cè)試。而且可以簡(jiǎn)單的模擬各種情況覆蓋其各種分支。這是降低整體開發(fā)時(shí)間,提高軟件質(zhì)量的一種有效方法。

當(dāng)然單元測(cè)試不僅需要學(xué)習(xí),而且你要學(xué)習(xí)的東西還真不少,你要學(xué)習(xí) JUnit 的使用,你要學(xué)習(xí) Mokito 的使用, Robolectric 的使用, 依賴注入 的概念和使用等等等。

簡(jiǎn)單的單元測(cè)試

單元測(cè)試其實(shí)并沒有你想象中的那么復(fù)雜。

我們先用Java來(lái)舉例看一下就知道了,

// 這是一個(gè)普通的類
public class Calculator {
    public int add(int one, int another) {
        // 為了簡(jiǎn)單起見,暫不考慮溢出等情況。
        return one + another;
    }

    public int multiply(int one, int another) {
        // 為了簡(jiǎn)單起見,暫不考慮溢出等情況。
        return one * another;
    }
}
// 這是對(duì)應(yīng)的測(cè)試代碼
public class CalculatorTest {
    public static void main(String[] args) {
        Calculator calculator = new Calculator();
        int sum = calculator.add(1, 2);
        if(sum == 3) {
            System.out.println("add() works!")
        } else {
            System.out.println("add() does not works!")
        }

        int product = calculator.multiply(2, 4);
        if (product == 8) {
            System.out.println("multiply() works!")
        } else {
            System.out.println("multiply() does not works!")
        }
    }
}

也許這個(gè)示例比較簡(jiǎn)單,讓你覺得這個(gè)測(cè)試代碼反而很多余了。如果你的類中方法一旦變多變復(fù)雜了,這樣的測(cè)試就顯得很重要了。當(dāng)然也有人會(huì)說,我自己寫那么多判斷的代碼,然后還要在看著terminal的輸出,才知道測(cè)試是通過還是失敗。同時(shí),也有人會(huì)問,我們Android中,很多方法也都沒有返回值啊,我們應(yīng)該怎么測(cè)呢?

這些一切的一切,都由框架來(lái)替我們解決了,所以我們應(yīng)該掌握幾個(gè)單元測(cè)試的框架。

有哪些單元測(cè)試框架

測(cè)試是一個(gè)比較大的東西,對(duì)于Android而言,有UI測(cè)試,功能測(cè)試,集成測(cè)試,扒拉扒拉扒拉的很多,當(dāng)然也有很多的測(cè)試方法。今天我們就先來(lái)看看有哪些測(cè)試的方法或者說是測(cè)試框架:

JUnit :能夠直接在PC上執(zhí)行;

Mokito

Robolectric :在不需要依賴Android環(huán)境的前提下,實(shí)現(xiàn)在PC上直接運(yùn)行Android的單元測(cè)試;

Robotium :第三方UI測(cè)試框架;

Espresso :Google推出的測(cè)試框架;

UI Automator :流程的UI測(cè)試框架;

在此我列舉的也只是部分常用的第三方測(cè)試框架,但是不要急著就去學(xué)習(xí)它們了。我們應(yīng)該先來(lái)了解一些基本的概念,這樣才能更好的掌握理解框架。

Mock

一個(gè)類的方法可以分為兩種,一種是有返回值的,另一種是沒有返回值的。對(duì)于有返回值的方法,我們要測(cè)起來(lái)比較容易,就跟上面的 Calculator 例子那樣,輸入相應(yīng)的參數(shù),得到相應(yīng)的返回值,然后驗(yàn)證得到的返回值跟我們預(yù)期的值一樣,就好了。

但是沒有返回值的方法,要怎么測(cè)試呢?

這里我們就以Android中的一個(gè)login流程來(lái)進(jìn)行分析一下:

// 一個(gè)Login頁(yè)面,上面有兩個(gè)輸入框和一個(gè)button。兩個(gè)輸入框分別用于輸入用戶名和密碼。點(diǎn)擊button以后,有一個(gè)UserManager會(huì)去執(zhí)行performlogin操作,然后將結(jié)果返回,更新頁(yè)面。
public void login() {
    String username = ...//get username from username EditText
    String password = ...//get password from password EditText
    //do other operation like validation, etc
    ...

    mUserManager.performlogin(username, password);
}

這個(gè)方法是void的,那么怎么驗(yàn)證這個(gè)方法是正確的呢?其實(shí)仔細(xì)想想,這個(gè)方法也是有輸出的,它的輸出就是,調(diào)用了mUserManager的performLogin方法,同時(shí)傳給他兩個(gè)參數(shù)。所以只要驗(yàn)證mUserManager

的performLogin方法得到了調(diào)用,同時(shí)傳給他的參數(shù)是正確的,就說明這個(gè)方法是能正常工作的。

那怎么樣驗(yàn)證這個(gè)Activity的login()方法,會(huì)調(diào)用mUserManager的performLogin方法呢?這里涉及到 mock 的概念,所以我們就先來(lái)講講什么是 Mock

所謂的 Mock 就是創(chuàng)建一個(gè)類的虛假的對(duì)象,在測(cè)試環(huán)境中,用來(lái)替換掉真實(shí)的對(duì)象,主要提供兩大功能:

  • 驗(yàn)證這個(gè)對(duì)象的某些方法的調(diào)用情況,調(diào)用了多少次,參數(shù)是什么等等
  • 指定這個(gè)對(duì)象的某些方法的行為,返回特定的值,或者是執(zhí)行特定的動(dòng)作

要使用 Mock,一般需要用到 Mock 框架,常見的就是 Mockito 這個(gè)框架,這個(gè)是Java界使用最廣泛的一個(gè)mock框架。

小結(jié)

本篇文章,從為什么要做單元測(cè)試到單元測(cè)試所涉及的一些概念,框架進(jìn)行了介紹。同時(shí)引入了Mockito這個(gè)框架,但是這個(gè)框架的使用也不是一兩句話就可以介紹清楚的,所以打算在下一篇文章對(duì)Mockito的使用進(jìn)行進(jìn)一步的講解。

 

 

來(lái)自:http://www.jianshu.com/p/78a67817ee5a

 

標(biāo)簽: Google 代碼 開發(fā)者

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。

上一篇:Wireshark 抓包 iOS 入門教程

下一篇:Android里巧妙實(shí)現(xiàn)緩存