在 AndroidManifest 元数据中指定自定义 RunListener 不起作用
Specifying custom RunListener in AndroidManifest metadata not working
目标
当 运行 Android 使用 Espresso 进行仪器测试时,自定义 RunListener
在测试失败时执行自定义操作。
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 here.
的文档中指定
但是,该文档还指出可以在 AndroidManifest.xml
元数据元素中指定 RunListener。到目前为止,我一直没能成功。
AndroidManifest.xml
我在 main/AndroidManifest.xml
中的 <application>
元素中添加了以下内容:
<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;
...return 我一个 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
?
有时直到您花时间彻底解释所有内容后,您才最终理解问题所在。解决方案是将此添加到 <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>
我刚刚从生成的 debug/AndroidManifest.xml
文件中复制粘贴了 <instrumentation>
元素。
最初我有点不高兴,因为 CustomAndroidJUnitRunner
和 com.myproject
在 Android Studio 中都以红色突出显示。但是一切都编译得很好。
我希望这对其他人有帮助!
目标
当 运行 Android 使用 Espresso 进行仪器测试时,自定义 RunListener
在测试失败时执行自定义操作。
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 here.
的文档中指定但是,该文档还指出可以在 AndroidManifest.xml
元数据元素中指定 RunListener。到目前为止,我一直没能成功。
AndroidManifest.xml
我在 main/AndroidManifest.xml
中的 <application>
元素中添加了以下内容:
<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;
...return 我一个 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
?
有时直到您花时间彻底解释所有内容后,您才最终理解问题所在。解决方案是将此添加到 <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>
我刚刚从生成的 debug/AndroidManifest.xml
文件中复制粘贴了 <instrumentation>
元素。
最初我有点不高兴,因为 CustomAndroidJUnitRunner
和 com.myproject
在 Android Studio 中都以红色突出显示。但是一切都编译得很好。
我希望这对其他人有帮助!