Help us understand the problem. What is going on with this article?

続・AndroidでJUnit4を使う方法(Android SDKで正式サポートされました!)

More than 3 years have passed since last update.

はじめに

Androidアプリケーション開発者にでっかいクリスマスプレゼント?が投げ込まれましたー。

Espressoが2.0にバージョンアップすると共に、Android Support Library の一部として取り込まれ、JUnit4がサポートされました!!

Espresso 2.0 is here!: Google+
Espresso 2.0 が Android support library の一部としてリリースされた

SDK ManagerでAndroid Support RepositoryをインストールすればEspressoのjarをlib等に置くことなく使えるということかな?(まだ試してません・・・)

(参考)こちらも併せてどうぞ

Setup

変更点

build.gradle
# Esporesso1.1までの書き方
androidTestCompile files('libs/espresso-1.1-bundled.jar')  
androidTestCompile files('libs/testrunner-1.1*.jar')

" 2.0~の書き方
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.0'
androidTestCompile 'com.android.support.test:testing-support-lib:0.1'
HogeTest.java
// ~1.1
com.google.android.apps.common.testing.ui.espresso
// 2.0~
android.support.test.espresso

サンプル

build.gradle
apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
        applicationId "com.my.awesome.app"
        minSdkVersion 10
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    }
    ...
}

dependencies {
    // App's dependencies, including test
    compile 'com.android.support:support-annotations:21.0.3'

    // Testing-only dependencies
    androidTestCompile 'com.android.support.test:testing-support-lib:0.1'
    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.0'
}

Getting Started

AndroidJUnitRunnerについて

ざっくりですが、Espresso 2.0 で導入された AndroidJUnitRunner のオフィシャルWikiのJUnit4関連部分を抜粋・意訳しました。

誤訳等あったらごめんなさい。

以下翻訳

JUnit4

(訳注: このセクションはほとんどJUnit4自体の説明なので知っている人は読み飛ばしてください。特に後半のアノテーションの説明。)

 AndroidJUnitRunner は、JUnit3と完全な上位互換性を保ちながらJUnit4に完全対応しています。AndroidRunnerBuilder はJUnitの AllDefaultPossibilitiesBuilder を継承しておりJUnit3とJUnit4の両方のテストを収集するため、既存のJUnit3のテストを書き換えることなく、Junit4の新たなテストを書くことができます。

注意:一つのクラス内に、JUnit3方式とJUnit4方式のテストを混ぜないでください。

 JUnit4のテストには @RunWith(AndroidJUnit4.class) アノテーションをつけてください。AndroidJUnitRunner は全てのJUnit4アノテーションをサポートしており、テストの実行やコーディングがより簡単で理解しやすくなります。

 よく使うアノテーションを挙げましょう。

  • @Test アノテーションは、JUnit3のtestXXXプレフィックスの代替機能です。JUnit4のテストクラスは TestCase クラスを継承する必要はありませんし、継承するとJUnit3のテストとして扱われます。

  • @Test(expected=IllegalArgumentException.class) 。JUnit4では@Test アノテーションの後ろに期待するパラメータを書くことで、コード量を減らせます(訳注: 原文の toredudes は to reduces のタイポ??自信なし)。JUnit3では以下のようなコードでした。

try{ 
    foo.bar();
    fail("IllegalArgumentException expected");
} catch (IllegalArgumentException expected) {}
  • @Before はJUnit3の setUp() メソッドに相当し、各テストメソッドの実行前に呼び出されます。テストフィクスチャのセットアップ等に使います。複数の @Before メソッドがあってもよいですが、呼び出し順は一定ではありません。

  • @AftertearDown() に相当し、各テストメソッド終了時に実行されます。リソース解放に使いましょう。

  • @BeforeClass はテストクラス毎に一度だけ呼び出されます。DB接続などコストのかかる処理に使うとよいでしょう。

  • @AfterClass はクラス内の全テストメソッド実行後に呼ばれます。 BeforeClassで作成したリソースの解放に使います。

AndroidテストAPIへの適用

ActivityInstrumentationTestCase2

 ActivityInstrumentationTestCase2 のような既存のAndroidテストAPIでJUnit4構文を使うには、次の5ステップを行います。

  • ActivityInstrumentationTestCase2 に @RunWith(AndroidJUnit4.class) アノテーションを付けます。(訳注: 原文の ! はタイポ??)
  • setUp() メソッドをオーバーライドし、@Before アノテーションを付け、super.setUp() を呼び出します。
  • InstrumentationRegistry を使用して Instrumentation をインジェクトします。以前はInstrumentationTestRunner によりインジェクトされていましたが、手動で行う必要があります。
injectInstrumentation(InstrumentationRegistry.getInstrumentation());
  • AndroidJUnitRunner に認識させるため、全てのテストに @Test を付けます。
  • tearDown をオーバライドし @After を付け、 super.tearDown() を呼び出します。これはオブジェクトのリークを防ぐために重要です。

ActivityInstrumentationTestCase2 でJUnit4を使った例です。

@RunWith(AndroidJUnit4.class)
@LargeTest
public class MyJunit4ActivityInstrumentationTest
            extends ActivityInstrumentationTestCase2<MyActivity> {

    private MyActivity mActivity;

    public MyJunit4ActivityInstrumentationTest() {
        super(MyActivity.class);
    }

    @Before
    public void setUp() throws Exception {
        super.setUp();
        injectInstrumentation(InstrumentationRegistry.getInstrumentation());
        mActivity = getActivity();
    }

    @Test
    public void checkPreconditions() {
        assertThat(mActivity, notNullValue());
        // Check that Instrumentation was correctly injected in setUp()
        assertThat(getInstrumentation(), notNullValue());
    }

    @After
    public void tearDown() throws Exception {
        super.tearDown();
    }

}

Instrumentation Thread Handlers

(訳注: よくわかっていないので省略します)

参考

JUnit4についてはこの本が勉強になりました。初心者にもわかりやすかったです。
Androidのテストに関する記述もあって(eclipseベースだったりして)若干古いですが、考え方はいまでも充分役に立ちます。

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)
JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした