2014-10-07 40 views
20

我嘗試使用以下目錄結構(這是由Android Studio安裝程序)來測試:AndroidManifest在androidTest目錄被忽略

test directory structure

我可以運行一些測試只是罰款,甚至AllTests.java運行正常,但沒有AndroidManifest.xml文件即使在那裏。事情是,對於我的一個新測試,我需要android.permission.INTERNET權限。所以,我添加了以下到位於androidTest目錄中的文件AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
      package="com.example.core" 
      android:versionCode="2" 
      android:versionName="2.0" > 

    <uses-sdk android:minSdkVersion="8" /> 

    <uses-permission android:name="android.permission.INTERNET" /> 
</manifest> 

不幸的是,這是行不通的。我仍然得到以下錯誤,當我運行我的測試之一:

E/RestAPIRequestTest:(?缺少INTERNET許可)許可被拒絕

我已經嘗試設置packagecom.example.core.test在我的AndroidManifest.xml文件中(因爲這是它在我的設置 - >應用程序列表中顯示的內容),但沒有喜悅。

我在想它甚至沒有識別AndroidManifest.xml文件,因爲版本號也沒有顯示在測試應用程序的設置中。

如何爲我的測試項目注入正確的權限?

+1

我知道這是一年前,但你有沒有得到解決?我在src/androidTest/AndroidManifest.xml中的清單沒有被合併到完整的清單中。 – Andrew 2015-11-11 19:20:16

+0

@Andrew不幸的是,我無法爲此找到令人滿意的答案。我們的測試結構發生了顯着變化,所以這對我來說不再是個問題,但在變化之前,沒有任何答案能爲我工作。 :( – jwir3 2015-11-16 17:30:01

回答

17

我需要做類似的事情。我在androidTest旁邊創建了一個名爲「debug」的文件夾,該文件夾對應於該應用程序的調試版本,並將具有該權限的AndroidManifest.xml放入該文件夾中。然後,由於測試應用程序使用調試變體,因此該權限可在測試中運行這並不理想,因爲它模糊了測試和調試之間的界限,這兩者並不完全相同。

我認爲發生的事情是,在androidTest/AndroidManifest.xml中的權限要測試的應用程序,而不是目標的應用程序,雖然它不是100%我清楚,如果確實有兩個不同的APK或什麼。

+0

謝謝!唯一的解決方案爲我工作。贊同它不是理想的,但至少有效,這也是... – 2016-06-24 11:25:50

+0

這是因爲'默認情況下,所有測試運行調試構建類型。你可以閱讀更多關於它[這裏](https://developer.android.com/studio/test/index.html#change_the_test_build_type)。 – epool 2016-06-27 22:46:26

+0

節省了我的時間! – 2017-06-20 14:28:04

10

在早期版本的Android Studio和Android Gradle插件中,androidTest/AndroidManifest.xml文件被忽略。這在當時的tools.android.com網站上有記錄。

隨着Android Studio 1.0+和Android Gradle 1.0+插件在2014年12月發佈,AndroidManifest.xml文件現在應該與普通的main/AndroidManifest.xml文件合併(除了調試和發佈清單文件,如果它們存在)。有關清單合併的更多細節rules are here

如果仍然遇到問題或只是調試清單相關的檢測問題,試試這個 (適應這種略帶適用於Windows):

  1. 下降到終端
  2. 改變對你的項目目錄 cd MyApplication
  3. 構建您的項目,假設'debug'是您想要測試的構建類型,但您也可以使用'release'或構建腳本進行測試。 ./gradlew assembleDebugTest
  4. 然後檢查您的測試APK清單: ls app/build/intermediates/manifests/test/debug/AndroidManifest.xml
  5. 查看您的應用程序APK清單: ls app/build/intermediates/manifests/full/debug/AndroidManifest.xml
  6. 合併輸出日誌可以找到詳細的清單合併過程: ls app/build/outputs/apk/manifest-merger-debug-report.txt

一一些額外的筆記:

  • 工具元素會自動添加到您的測試APK的AndroidManifest.xml中,因此您應該只添加測試APK所需的額外活動,權限等。
  • 如果使用模擬位置進行測試,您的應用APK將需要ACCESS_MOCK_LOCATION權限。您可以將權限添加到debug/AndroidManifest.xml文件,或者您可以定義測試APK和應用程序APK在部署時應使用相同的userId(AndroidManifest.xml中的sharedUserId屬性)。
2

如規定的here,在插裝測試過程中,會生成兩個.apk文件。如果你看一看,最小的那個最有可能是名爲app-debug-androidTest-unaligned.apk的那個,它實際上是包含提供的權限

使用aapt d permissions <apk_file_path>.apk檢查文件可以查看所有文件的列表。

現在,請求權限的上下文本身可能存在問題。我有一個類似的問題,試圖在SD卡上寫一些截圖(因此需要WRITE_EXTERNAL_STORAGE權限)。

answer幫助我解決了這個問題,雖然我不能完全理解爲什麼它是必要的。

簡而言之,您需要在兩個清單中聲明相同的android:sharedUserId,以便在兩個apks安裝在同一設備上時合併權限 - 這是在測試運行時發生的。 這幫助我從生產環境中分離需要測試的權限。

0

一個解決方案就像在單次運行中構建主apk和測試apk。 例如:./gradlew clean :main:assembleDebug :main:assembleDebugAndroidTest

這將創建一個新的儀器化的主應用程序,它具有測試應用程序所需的所有額外權限。