ゴール
RunListener
Espresso を使用して Android インストルメンテーション テストを実行する際に、カスタムにテストの失敗時にカスタム処理を実行させる。
tl;dr
InstrumentationInfo.metaData
ですがnull
、ApplicationInfo.metaData
私の情報があります。なんで?
これまでの進捗
RunListener を次の adb コマンドで動作させることができます。
adb shell am instrument -w -e listener com.myproject.test.runlisteners.CustomRunListener -e class com.myproject.test.ui.HomeActivityTest#testWillFail com.myproject.test/android.support.test.runner.AndroidJUnitRunner
こちらの AndroidJUnitRunner のドキュメントで指定されています。
AndroidManifest.xml
ただし、そのドキュメントには、メタデータ要素で RunListener を指定できることも記載されています。これまでのところ、これを機能させることに失敗しています。
AndroidManifest.xml
<application>
の要素にmain/AndroidManifest.xml
次を追加しました。
<meta-data
android:name="listener"
android:value="com.myproject.test.runlisteners.CustomRunListener" />
これは何の効果もありませんでした。さまざまな方法で、これらのコード行 (マニフェストからカスタム メタデータ引数を取得するためにAndroidJUnitRunner
使用される) を発見しました。RunnerArgs
InstrumentationInfo instrInfo = pm.getInstrumentationInfo(
getComponentName(), PackageManager.GET_META_DATA);
Bundle b = instrInfo.metaData;
null
...バンドルを返してください。
生成された にメタデータ タグがないことに気付いたdebug/AndroidManifest.xml
ので、実験として、androidTest/AndroidManifest.xml
ファイルにも追加しました。それは次のようになります。
<application
android:name=".BaseApplication">
<meta-data
android:name="listener"
android:value="com.sirius.test.runlisteners.CustomRunListener" />
</application>
...その後、生成されたものに次のdebug/AndroidManifest.xml
ように表示されます。
<application android:name="com.myproject.BaseApplication" >
<meta-data
android:name="listener"
android:value="com.sirius.test.runlisteners.CustomRunListener" />
<uses-library android:name="android.test.runner" />
</application>
これも効果がありませんでした。
別の実験
CustomAndroidJUnitRunner
AndroidJUnitRunner を拡張するという名前のカスタム テスト ランナーを作成しました。私がこれを行う場合:
ApplicationInfo ai = packageManager.getApplicationInfo(
getComponentName().getPackageName(), PackageManager.GET_META_DATA);
Bundle b = ai.metaData;
Object o = b.get("listener");
Log.d(TAG, "listener=" + o.toString());
...logcat は次のように言います:
D/CustomAndroidJUnitRunner: listener=com.myproject.test.runlisteners.CustomRunListener
そうですねApplicationInfo.metaData
。なぜしないInstrumentationInfo.metaData
のですか?