2

ゴール

RunListenerEspresso を使用して Android インストルメンテーション テストを実行する際に、カスタムにテストの失敗時にカスタム処理を実行させる。

tl;dr

InstrumentationInfo.metaDataですがnullApplicationInfo.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>

これも効果がありませんでした。

別の実験

CustomAndroidJUnitRunnerAndroidJUnitRunner を拡張するという名前のカスタム テスト ランナーを作成しました。私がこれを行う場合:

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のですか?

4

1 に答える 1

5

時間をかけてすべてを徹底的に説明するまで、問題が何であるかを最終的に理解できない場合があります。<manifest>解決策は、これを要素に追加することです:

<instrumentation
    android:name="com.myproject.test.runner.CustomAndroidJUnitRunner"
    android:functionalTest="false"
    android:handleProfiling="false"
    android:label="Tests for com.myproject"
    android:targetPackage="com.myproject">

    <meta-data
        android:name="listener"
        android:value="com.myproject.test.runlisteners.CustomRunListener" />

</instrumentation>

生成されたファイル<instrumentation>から要素をコピーして貼り付けただけです。debug/AndroidManifest.xml

Android Studio では と の両方が赤で強調表示されていたCustomAndroidJUnitRunnerため、当初は少し気が遠くなりました。com.myprojectしかし、すべてがうまくコンパイルされます。

これが他の誰かに役立つことを願っています!

于 2016-02-05T17:50:14.993 に答える