目标
要使用自定义RunListener
,请在使用Espresso运行Android工具测试时针对测试失败进行自定义操作。
tl;博士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
我在
<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
bundle 包。我注意到生成的
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>
我只是从生成的
<instrumentation>
文件中复制粘贴了debug/AndroidManifest.xml
元素。最初,我有点不高兴,因为
CustomAndroidJUnitRunner
和com.myproject
在Android Studio中都以红色突出显示。但是一切都可以编译。我希望这可以帮助其他人!
关于android - 在AndroidManifest元数据中指定自定义RunListener无效,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35230276/