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中都以紅色突出顯示。但一切都編譯得很好。

我希望這可以幫助別人!