Android Studio單元測試入門
通常在開發Android app的時候經常會寫一些小函數并驗證它是否運作正确,通常做法我們是把這個函數放到某個界面(Activity上)執行一下,運作整個工程跑一下app,通過打log的方式來驗證。不過,現在我們活用Android Studio自帶的單元測試功能即可免除這種麻煩,直接寫測試用例像Junit那樣來驗證你的小函數
内容提要
- 配置
- 編寫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中應該是這樣的:
如果所寫的測試代碼沒有使用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
右擊并運作它,測試通過,傳回了正确的值
注意本測試用例試用了System.out.println是以測試結果直接列印在了控制台上,如果把列印的地方換成Log.d()呢,你會發現報錯:
這個實際是因為你在java的Unit test中引用了Android的代碼,即android.util.log.Log。是以對于測試Android代碼,需要在androidTest中
Android測試用例我們可以
- 在androidTest下建立一個java類,并且繼承自InstrumentationTestCase
- 編寫一個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,步驟為
- 在androidTest下建立一個java類,并且繼承自ActivityInstrumentationTestCase2,傳入需要測試的Activity的類到泛型
- 複寫setUp方法,獲得Context
- 編寫一個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
github site for this blog
https://github.com/soaringEveryday/BlogRoad/blob/master/Android Studio單元測試入門.md
轉載請注明
http://www.cnblogs.com/soaringEveryday/p/5461970.html