1

目标指定自定义RunListener不工作

为了有一个自定义RunListener运行使用咖啡的Android仪器测试时,在测试故障进行自定义的东西。

TL;博士

InstrumentationInfo.metaDatanull,即使ApplicationInfo.metaData有我的信息。为什么?

进展迄今

我可以让我RunListener用下面的ADB命令的工作:这是AndroidJUnitRunner here的文档中指定

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 

然而,文档还指出一个可以指定在AndroidManifest.xml元数据元素的RunListener。迄今为止,我没有成功实现这一目标。

AndroidManifest.xml中

我加入main/AndroidManifest.xml下面我<application>元素:

<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

回答

3

有时候,直到你花时间彻底解释所有事情,你终于明白了问题所在。解决的办法是把它添加到<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>元素。

原来我有点遗憾,因为CustomAndroidJUnitRunnercom.myproject在Android Studio中都以红色突出显示。但一切都编译得很好。

我希望这可以帮助别人!