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

単純には動作せず

まず、単純に Android JUnit プロジェクトを作成し、昨日のコードを移植。
プロジェクトを選択して Run As Android JUnit Test を実行してみました。

しかし、何も起こりません。
各テストケースを選択した場合は動作するので、テストケースの問題ではなさそうです。

どういうこと?
と思いつつ調べてみると、どうも Android JUnit を立ち上げた時に走る InstrumentationTestRunner は独自コンストラクタのテストケースを無視するみたいです。

解決策

少し調べてみたところ、独自の TestRunner を作成してやれば良いことがわかりました。

以下が具体的な TestRunner です。
getAllTests() をオーバーライドして、実行したい TestSuite を返すようにします。
TestSuite については、先日のエントリを参照して下さい。

AndroidJUnit3ExperimentTestRunner.java
public class AndroidJUnit3ExperimentTestRunner extends
        InstrumentationTestRunner {

    @Override
    public TestSuite getAllTests() {
        TestSuite testSuite = new TestSuite();

        testSuite.addTest(CalcTwiceTest.suite());
        testSuite.addTest(CalcSquareTest.suite());

        return testSuite;
    }
}

AndroidManifest.xml を以下のように書き換えます。
Android JUnit プロジェクトを作成すると、instrumentationTestRunner はデフォルトで記述されていますが、それを自作のものに挿げ替えるわけです。

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.kokufu.android.experiment.junit3.test"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="10" />

    <instrumentation
        android:name=".AndroidJUnit3ExperimentTestRunner"
        android:targetPackage="com.kokufu.android.experiment.junit3" />

    <application>
        <uses-library android:name="android.test.runner" />
    </application>

</manifest>


テスト実行

この状態でプロジェクトを選択して Run As Android JUnit Test とすると、見事動作しました。

AndroidManifest を書き換えた後にエラーが出ることがある

一度、Android JUnit Test を走らせた後に、AndroidManifest を書き換えると、以下のようなエラーが出ることがあります。

XXX is not configured correctly for running tests: A targetPackage attribute for instrumentation YYY in its AndroidManifest.xml could not be found!


この場合は、Run → Run Configurations...
実行しようとしている Android JUnit Test の構成仕様を削除 を実行すると直ります。


2.2以前では動作せず

このテストを Android 2.2 以前の端末で動かした場合、以下のようなエラーが出て正しく動作しませんでした。

Test run failed: Test run failed to complete. Expected 10 tests, received 0

ちょっと原因を追いきれていないのですが、複数の端末&Emulatorで同様の結果となったことから、Android 2.2以前と2.3の間に何か変更があったようです。
残念ながら、このテストは Android 2.3 以降で動かす必要がありますので、ご注意ください。

0 件のコメント: