Android Studio 單元測試入門

soaringEveryday發表於2016-05-05

通常在開發Android app的時候經常會寫一些小函式並驗證它是否執行正確,通常做法我們是把這個函式放到某個介面(Activity上)執行一下,執行整個工程跑一下app,通過打log的方式來驗證。然後現在我們活用Android Studio自帶的單元測試功能即可免除這種麻煩

內容提要

  • 配置
  • 編寫Java測試用例
  • 編寫Android測試用例
  • 其他測試基類

配置

在Android Studio中進行單元測試並不需要什麼外掛或者過多的配置,Android Studio本身就整合了測試環境,無論是單純的java程式碼單元測試還是依賴Android SDK的Android程式碼單元測試,都能得心應手。

首先在你的gradle中加入Junit的依賴,注意這裡的依賴方式是測試期間的依賴(testCompile):

dependencies {
    testCompile 'junit:junit:4.12'
}

再在專案的app/src下面和main資料夾同級的建立androidTest和test目錄,並且分別在各自目錄下建議java/com/xxx/xxx類似的和主工程一致的包名目錄,建立好後,你的專案在Android Studio的Project中應該是這樣的:

project structure

編寫Java測試用例

如果所寫的測試程式碼沒有使用android sdk(android.***下的程式碼),那麼可以在test目錄下新建,本例中即為ExampleUnitTest,例子中測試了一個RxJava的Observable的發射後被消費的結果。

注意測試用例即一個public void的方法,並且加上@Test註解,這是Junit的標準用法

package com.jason.rxjavademo;
import org.junit.Test;
import rx.Observer;
import rx.subjects.PublishSubject;

public class ExampleUnitTest {

    @Test
    public void testPublishSubject() {
        PublishSubject<String> stringPublishSubject = PublishSubject.create();
        stringPublishSubject.subscribe(new Observer<String>() {
            @Override
            public void onCompleted() {
                System.out.println("Observable completed");
            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(String s) {
                System.out.println("Observer consumed " + s);
            }
        });
        stringPublishSubject.onNext("hello world");
        stringPublishSubject.onCompleted();
    }
}

這時候開啟Android Studio左邊的Structure的皮膚,可以看到測試用例方法testPublishSubject

java structure

右擊並執行它,測試通過,返回了正確的值

java result

注意本測試用例試用了System.out.println所以測試結果直接列印在了控制檯上,如果把列印的地方換成Log.d()呢,你會發現報錯:

java error

這個實際是因為你在java的Unit test中引用了Android的程式碼,即android.util.log.Log。所以對於測試Android程式碼,需要在androidTest中

編寫Android測試用例

Android測試用例我們可以

  1. 在androidTest下新建一個java類,並且繼承自InstrumentationTestCase
  2. 編寫一個public void的方法,但是必須要是方法名以test打頭,比如testPublishSubject,並不需要@Test註解
public class TestSubject extends InstrumentationTestCase {
    private static final String LOG_TAG = "test";

    public void testPublishSubject() {
        PublishSubject<String> stringPublishSubject = PublishSubject.create();
        stringPublishSubject.subscribe(new Observer<String>() {
            @Override
            public void onCompleted() {
                Log.d(LOG_TAG, "Observable completed");
            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(String s) {
                Log.d(LOG_TAG, "Observer consumed " + s);
            }
        });
        stringPublishSubject.onNext("hello world");
        stringPublishSubject.onCompleted();
    }
}

本例執行後,會在Android Monitor中以test這個LOGTAG打出和上一節一樣的Log

Android Studio也提供了測試單個Activity或者多個Activities的測試用例方法基類,比如ActivityInstrumentationTestCase2,步驟為

  1. 在androidTest下新建一個java類,並且繼承自ActivityInstrumentationTestCase2,傳入需要測試的Activity的類到泛型
  2. 複寫setUp方法,獲得Context
  3. 編寫一個public void的方法,但是必須要是方法名以test打頭,比如testStart,並不需要@Test註解
public class TestActivity extends ActivityInstrumentationTestCase2<MainActivity> {

    private Context ctx;

    public TestActivity() {
        super(MainActivity.class);
    }

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        ctx = getActivity().getApplicationContext();
    }

    public void testStart() {
        Intent intent = new Intent(ctx, MainActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        ctx.startActivity(intent);
    }
}

執行這個測試用例,你會發現模擬器上單獨啟動了這個Activity

其他測試基類

除了InstrumentationTestCase和ActivityInstrumentationTestCase2外,android.test還提供了很多別的測試基類,比如

  • ActivityUnitTestCase
  • MockApplication
  • ServiceTestCase

相關文章