2013/03/06

InstrumentationTestRunner の起動シーケンス図を描いてみた

Android JUnit のテスト実行役である InstrumentationTestRunner の起動シーケンス図を描いてみました。


Application.onCreate()AndroidTestRunner.runTest() は別スレッドで動作しているのです。(赤枠で囲ったとこ)
つまり、「テスト開始時に Application.onCreate() が呼ばれている保証はないよ」ってことですね。

mainスレッド(UIスレッド)を使ってテストを行う場合は問題ありませんが、テスト用のスレッドをそのまま使う場合バックグラウンド処理等は注意が必要です。

2013/03/05

Eclipse の Android JUnit Test は 2回実行される

Android で JUnit Test をしていた時、ちょっと気になる現象を発見してしまいました。
たまたま、android.app.Application を継承した独自実装の Application を使用して、その onCreate() にログを仕込んでいた状態だったので気づいたのです。
以下、その詳細です。

コード

実際のコードをあげるのは大変なので、以下に簡略化したものをあげておきます。

MyApplication.java (Target)
public class MyApplication extends Application {
    private static final String TAG = "MyApplication";

    @Override
    public void onCreate() {
        super.onCreate();

        Log.d(TAG, "onCreate");
    }
}

AndroidManifest.xml (Target)
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.kokufu.android.test.sampletarget"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <application
        android:name=".MyApplication"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        
        <!-- 省略 -->
        
    </application>

</manifest>


このアプリに対し、以下のようなテストを作成。
(テストとしての役割は全く果たしていませんが…)

MyTest.java (Test)
public class MyTest extends TestCase {
    private static final String TAG = "MyTest";

    public void testA() {
        Log.d(TAG, "testA");
    }

    public void testB() {
        Log.d(TAG, "testB");
    }
}

Application.onCreate() が2度呼ばれている

Eclipse から
Run → Run As → Android JUnit Test
と実行してみると、
以下の様な結果が。
onCreate が2度呼ばれています。
間違えて 2度実行してしまったわけではありません。
たった1度、実行操作を行っただけです。

さらによく見てみると、最初の onCreate だけ PID が異なります。
どうも、別プロセスで 2回実行されているようですが、テスト自体は2回目だけ実行されるようです。
2012/07/28

Android JUnit で Parameterized test case

@Android 2.3.3 (API 10) 以降

先日、
JUnit3 で Parameterized test case (1)
JUnit3 で Parameterized test case (2)
というエントリを書きましたが、本当は、Android JUnit で Parameterized test をしたかったのです。
Native Java Project なら、おとなしく JUnit4 を使っておけば良いわけですから。

というわけで、早速 JUnit3 で Parameterized test case (2) で作成したコードを Android JUnit に移植してみました。

今回のプロジェクトは以下にアップしてあります。ご自由にお使いください。
AndroidJUnit3Experiment.zip
2012/07/27

JUnit3 で Parameterized test case (2)

昨日、JUnit3 で Parameterized test case (1) というエントリを書いたのですが、その後いろいろいじっていると、ちょっと不満が出てきたので改造してみました。

本日のコードも以下にアップしてありますので、ご自由にお使いください。
JUnit3Experiment_02.zip

昨日の問題点

一番の不満は、テストを走らせるときに、AllTests.java を選択してから走らせなければならないということ。
「全部走らせる」 = 「プロジェクトを選択して Run」 が Eclipse っぽいような気がします。

JUnit3 で Parameterized test case (1)

JUnit4 には Parameters アノテーションがあって、同じテストをパラメータを変えて実行することができます。
しかし、JUnit3 にはそのような機能がないため、本来はパラメータ毎にテストメソッドを記述しなければなりません。
なんてイマイチな仕様なんだ…

しかし、よく考えてみると、 TestSuite を利用すれば、JUnit4 と同じように Parameterized test が出来ることに気づきました。
以下、やってみた結果です。

今回、作成したプロジェクトは以下においてあります。
ご自由にお使いください。
JUnit3Experiment_01.zip

2012/7/28 追記
ちょっとだけ不満が残ったので、改造してみました。
穀風: JUnit3 で Parameterized test case (2)