淺談Android單元測(cè)試的作用以及簡(jiǎn)單示例
前提概要
受人嫌棄的單元測(cè)試
對(duì)于單元測(cè)試這個(gè)知識(shí)點(diǎn),其實(shí)很多開(kāi)發(fā)者是不太接觸的,包括筆者,在實(shí)習(xí)之前也并未實(shí)用過(guò)單元測(cè)試,或者說(shuō)并沒(méi)感受到單元測(cè)試的好處。
對(duì)于bug的調(diào)試,筆者之前更傾向于使用log和斷點(diǎn)調(diào)試,可以說(shuō)會(huì)了這兩個(gè),大部分的邏輯bug都能自己解決了。這兩個(gè)與看似臃腫的單元測(cè)試代碼相比更受大家的喜愛(ài)。
但是,使用log和斷點(diǎn)調(diào)試的前提是開(kāi)發(fā)人員較少,甚至是單人開(kāi)發(fā)的情況。如果我自己開(kāi)發(fā),我完全可以每次都使用集成測(cè)試,我知道每一個(gè)功能會(huì)涉及哪些模塊的代碼,然后根據(jù)邏輯設(shè)置log或者斷點(diǎn)調(diào)試。
多人開(kāi)發(fā)難以處理的問(wèn)題
然而,如果是多人開(kāi)發(fā)呢?每一個(gè)模塊的代碼很可能是由不同的人分開(kāi)負(fù)責(zé)的,bug的產(chǎn)生由不同模塊共同產(chǎn)生。每一個(gè)模塊的代碼可能都比較復(fù)雜,產(chǎn)生bug后,閱讀其他人的模塊本身比較浪費(fèi)時(shí)間,其次基本不可能讓你去修改其他人的代碼,這可能會(huì)破壞他人的代碼結(jié)構(gòu)。
而且錯(cuò)誤可能也并不在其他人的代碼中,也可能是你們的交互方式有問(wèn)題。產(chǎn)生bug的原因有太多,并且由單人直接log或者斷點(diǎn)調(diào)試難以處理,那么這種情況怎么辦呢?
單元測(cè)試就一定程度上處理了這種困難的情況:給每一個(gè)模塊加上單元測(cè)試,如果該模塊可以通過(guò)單元測(cè)試,就代表沒(méi)有問(wèn)題。
在這種情況下,程序員們面對(duì)的問(wèn)題不再是要讓整個(gè)項(xiàng)目到達(dá)理想的效果,而是讓自己所面對(duì)的單元測(cè)試可以通過(guò)。這樣就大大減少了多人開(kāi)發(fā)中的交互成本。
簡(jiǎn)單示例
主要就兩個(gè)文件:

package com.example.xujiajia_sx.myexpressotest;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public static int calculate(int a,int b){
return a+b+1;
}
}
package com.example.xujiajia_sx.myexpressotest;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Created by xujiajia_sx on 2017/8/14.
*/
public class SimpleTest {
@Test
public void CalculateTest() throws Exception {
assertEquals(4, MainActivity.calculate(1,2));
}
}
這個(gè)例子是測(cè)試了MainActivity.calculate()方法??梢栽诓贿\(yùn)行這個(gè)app的情況下直接通過(guò)按SimpleTest .CalculateTest()左邊的小三角測(cè)試,如下圖:

我們calculate()方法的邏輯是返回a+b+1,所以是4,最終不會(huì)報(bào)錯(cuò),如果我們把a(bǔ)ssertEquals中的4改成3,效果如下:

如圖,測(cè)試會(huì)直接報(bào)錯(cuò),并且定位到錯(cuò)誤的那一行,然后我們就可以看到是MainActivity.calculate()輸出的值不等于3所造成的。
Assert方法
示例本身比較簡(jiǎn)單,但是對(duì)于剛剛接觸單元測(cè)試讀者可能對(duì)assertEquals()比較陌生,這是Assert這個(gè)類中的靜態(tài)方法,單元測(cè)試中一般就是通過(guò)它來(lái)判斷是否達(dá)到理想的效果。
筆者此處使用了int之間的判斷,Assert中還有很多其他的用法,筆者可以去AndroidDevelpers上自己查看,此處為了方便,筆者為了方便就直接復(fù)制了。
static void assertEquals(boolean expected, boolean actual) static void assertEquals(String message, long expected, long actual) static void assertEquals(short expected, short actual) static void assertEquals(String message, String expected, String actual) static void assertEquals(String message, int expected, int actual) static void assertEquals(Object expected, Object actual) static void assertEquals(String message, boolean expected, boolean actual) static void assertEquals(String expected, String actual) static void assertEquals(String message, short expected, short actual) static void assertEquals(String message, Object expected, Object actual) static void assertEquals(char expected, char actual) static void assertEquals(byte expected, byte actual) static void assertEquals(double expected, double actual, double delta) static void assertEquals(String message, char expected, char actual) static void assertEquals(float expected, float actual, float delta) static void assertEquals(String message, double expected, double actual, double delta) static void assertEquals(String message, byte expected, byte actual) static void assertEquals(String message, float expected, float actual, float delta) static void assertEquals(long expected, long actual) static void assertEquals(int expected, int actual) static void assertFalse(String message, boolean condition) static void assertFalse(boolean condition) static void assertNotNull(Object object) static void assertNotNull(String message, Object object) static void assertNotSame(String message, Object expected, Object actual) static void assertNotSame(Object expected, Object actual) static void assertNull(String message, Object object) static void assertNull(Object object) static void assertSame(String message, Object expected, Object actual) static void assertSame(Object expected, Object actual) static void assertTrue(String message, boolean condition) static void assertTrue(boolean condition) static void fail(String message) static void fail() static void failNotEquals(String message, Object expected, Object actual) static void failNotSame(String message, Object expected, Object actual) static void failSame(String message) static String format(String message, Object expected, Object actual)
總結(jié)
這篇文章主要介紹了Android單元測(cè)試的作用和簡(jiǎn)單的示例。但是簡(jiǎn)單的對(duì)方法的測(cè)試相信并不能滿足求知欲強(qiáng)烈的讀者。
下一篇文章筆者會(huì)講述android單元測(cè)試中對(duì)Activity的測(cè)試方法。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 詳解appium+python 啟動(dòng)一個(gè)app步驟
- Python腳本在Appium庫(kù)上對(duì)移動(dòng)應(yīng)用實(shí)現(xiàn)自動(dòng)化測(cè)試
- 詳解Android單元測(cè)試最佳實(shí)踐
- android開(kāi)機(jī)自啟動(dòng)APP及使用adb命令測(cè)試方法
- Android利用Espresso進(jìn)行UI自動(dòng)化測(cè)試的方法詳解
- 在Android打包中區(qū)分測(cè)試和正式環(huán)境淺析
- Android單元測(cè)試之對(duì)Activity的測(cè)試示例
- Android和iOS 測(cè)試五個(gè)最好的開(kāi)源自動(dòng)化工具
- Android 中構(gòu)建快速可靠的 UI 測(cè)試
- 簡(jiǎn)單談?wù)刟ndroid studio 的單元測(cè)試
- Android Monkey壓力測(cè)試詳細(xì)介紹
- Ubuntu中為Android系統(tǒng)上實(shí)現(xiàn)內(nèi)置C可執(zhí)行程序測(cè)試Linux內(nèi)核驅(qū)動(dòng)程序
- Android App開(kāi)發(fā)的自動(dòng)化測(cè)試框架UI Automator使用教程
- Android自動(dòng)測(cè)試工具M(jìn)onkey的實(shí)現(xiàn)方法
- Android測(cè)試中Appium的一些錯(cuò)誤解決技巧
相關(guān)文章
Android Activity的生命周期與啟動(dòng)模式全面解讀
雖然說(shuō)我們天天都在使用Activity,但是你真的對(duì)Activity的生命機(jī)制完全了解了嗎?Activity的生命周期方法只有七個(gè),但是其實(shí)那只是默認(rèn)的情況。也就是說(shuō)在其他情況下,Activity的生命周期可能不會(huì)是按照我們以前所知道的流程,這就要說(shuō)到Activity的啟動(dòng)模式2021-10-10
深入Android HandlerThread 使用及其源碼完全解析
這篇文章主要介紹了深入Android HandlerThread 使用及其源碼完全解析,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
Android開(kāi)發(fā)之Android.mk模板的實(shí)例詳解
這篇文章主要介紹了Android開(kāi)發(fā)之Android.mk模板的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下2017-10-10
Android自定義可循環(huán)的滾動(dòng)選擇器CycleWheelView
Android自定義可循環(huán)的滾動(dòng)選擇器CycleWheelView替代TimePicker/NumberPicker/WheelView,很實(shí)用的一篇文章分享給大家,感興趣的小伙伴們可以參考一下2016-07-07
SimpleCommand框架ImageLoader API詳解(三)
這篇文章主要為大家詳細(xì)介紹了SimpleCommand框架ImageLoader API,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
Android應(yīng)用的Material設(shè)計(jì)中圖片的相關(guān)處理指南
這篇文章主要介紹了Android應(yīng)用的Material設(shè)計(jì)中圖片的相關(guān)處理指南,除了介紹新的方法外文中還給出了一些設(shè)計(jì)標(biāo)準(zhǔn)樣例僅供參考,需要的朋友可以參考下2016-04-04
Android定時(shí)開(kāi)機(jī)的流程詳解
這篇文章給大家分享了Android定時(shí)開(kāi)機(jī)及其實(shí)現(xiàn)流程,對(duì)此知識(shí)點(diǎn)有興趣的朋友,可以學(xué)習(xí)參考下。2018-07-07
Android Binder入門(mén)學(xué)習(xí)筆記
這篇文章主要給大家介紹了關(guān)于Android Binder入門(mén)學(xué)習(xí)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)各位Android開(kāi)發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02

