在AndroidManifest元数据中指定自定义RunListener不起作用

时间:2016-02-05 17:40:41

标签: android junit android-manifest metadata android-instrumentation

目标

在使用Espresso运行Android检测测试时,让自定义RunListener在测试失败时执行自定义操作。

TL;博士

InstrumentationInfo.metaDatanull,即使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 here的文档中指定了哪一个。

但是,该文档还指出可以在AndroidManifest.xml元数据元素中指定RunListener。到目前为止,我没有成功实现这一目标。

的AndroidManifest.xml

我将以下内容添加到<application>中的main/AndroidManifest.xml元素:

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

这没有任何效果。通过各种方式,我发现这些代码行(AndroidJUnitRunnerRunnerArgs用来从清单中获取自定义元数据参数)

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

1 个答案:

答案 0 :(得分:4)

有时候直到你花时间彻底解释一切,你终于明白了问题是什么。解决方案是将其添加到<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中的CustomAndroidJUnitRunnercom.myproject都以红色突出显示。但是一切都很好。

我希望这有助于其他人!