AndroidManifest в директории androidTest игнорируется
Я пытаюсь протестировать, используя следующую структуру каталогов (которая была установлена Android Studio):
![test directory structure]()
Я могу выполнить некоторые тесты просто отлично, и даже AllTests.java
работает отлично, но файл AndroidManifest.xml
даже не существует. Дело в том, что для одного из моих новых тестов мне нужно разрешение android.permission.INTERNET
. Итак, я добавил следующее в файл AndroidManifest.xml
, расположенный в каталоге androidTest
:
<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?)
Я пробовал установить package
как com.example.core.test
в мой AndroidManifest.xml
файл (так как это показано в списке "Настройки" > "Службы" ), но без радости.
Я думаю, что даже не распознал файл AndroidManifest.xml
, так как номер версии не отображается в настройках тестового приложения.
Как я могу ввести правильные разрешения для моего тестового проекта?
Ответы
Ответ 1
Мне нужно было сделать что-то подобное. Я создал папку с именем "debug" рядом с androidTest, которая соответствует варианту отладки приложения и помещает AndroidManifest.xml с разрешением в этой папке. Затем разрешение работает под тестом, поскольку тестовое приложение использует вариант отладки. Это не идеально, потому что он размывает линию между тестом и отладкой, что не совсем одно и то же.
Я думаю, что происходит то, что разрешения в androidTest/AndroidManifest.xml идут в тестовое приложение, а не на целевое приложение, хотя это на 100% не понятно мне, если на самом деле есть два разных APK или что.
Ответ 2
В старых версиях Android Studio и Android Gradle плагин был отключен файл androidTest/AndroidManifest.xml. Это было зарегистрировано на сайте tools.android.com в то время.
С выпуском плагина Android Studio 1.0+ и Android Gradle 1.0+ в декабре 2014 года файл AndroidManifest.xml теперь должен быть объединен с обычными файлами main/AndroidManifest.xml(в дополнение к файлам манифеста debug и release, если они существуют). Более подробные сведения о слиянии манифеста приведены здесь.
Если вы все еще сталкиваетесь с проблемами или просто отлаживаете связанные с ним проблемы тестирования, попробуйте это
(Немного адаптируйте для Windows):
- Падение на терминал
- перейти в каталог проекта
cd MyApplication
- Создайте свой проект, предполагая, что "debug" - это тип сборки, с которым вы хотите протестировать, но вы также можете тестировать его с помощью "release" или сборки script.
./gradlew assembleDebugTest
- Затем проверьте свой тестовый манифест APK:
ls app/build/intermediates/manifests/test/debug/AndroidManifest.xml
- Просмотр вашего заявления APK:
ls app/build/intermediates/manifests/full/debug/AndroidManifest.xml
- Можно найти журнал вывода слияния, подробно описывающий процесс слияния манифеста:
ls app/build/outputs/apk/manifest-merger-debug-report.txt
Несколько дополнительных заметок:
- Элемент инструментария автоматически добавляется в ваш тест APK AndroidManifest.xml, поэтому вам нужно добавлять дополнительные действия, разрешения и т.д., которые необходимы вашему APK теста.
- При тестировании с макетными точками вашему приложению APK потребуется разрешение ACCESS_MOCK_LOCATION. Вы можете добавить разрешение на свой файл debug/AndroidManifest.xml, или вы можете определить, что тестовый APK и APK приложения должны использовать тот же userId при развертывании (атрибут sharedUserId в вашем AndroidManifest.xml).
Ответ 3
Как указано здесь, во время инструментальных тестов создаются два файла .apk. Если вы посмотрите, тем меньше он, пожалуй, один с именем app-debug-androidTest-unaligned.apk
, и на самом деле делает предоставленные разрешения.
Проверка файла с помощью aapt d permissions <apk_file_path>.apk
может быть полезна для просмотра списка всех из них.
Теперь может возникнуть проблема с самим контекстом, где запрашивается разрешение. У меня была аналогичная проблема, пытаясь записать несколько скриншотов на SD-карту (при этом нужно разрешение WRITE_EXTERNAL_STORAGE
).
Этот ответ помог мне решить проблему, хотя я не могу полностью понять, зачем это необходимо.
В нескольких словах вам нужно объявить те же android:sharedUserId
в обоих манифестях, чтобы объединить разрешения, когда оба apks установлены на одном устройстве - это происходит при запуске тестов.
Это помогло мне отделить разрешения, необходимые только для тестирования с того, что было на производстве.
Ответ 4
Это известная проблема.
В настоящее время (AGP <= 3.4.X) не поддерживается слияние тестов AndroidManifest
.
Об этом сообщается здесь: https://issuetracker.google.com/issues/127986458, и здесь есть проблема, созданная одним из сопровождающих Roboelectric.
Обходной путь, описанный здесь, похож на предложенный пользователем user3286293 и в настоящее время является единственным способом объединения манифеста для тестирования.
Надеюсь увидеть исправление для AGP 3.5 или 3.6
Ответ 5
Одно решение будет похоже на сборку main apk и test apk за один проход.
Пример: ./gradlew clean :main:assembleDebug :main:assembleDebugAndroidTest
.
Это создаст новое основное приложение, имеющее все необходимые разрешения для тестового приложения.
Ответ 6
Вы должны определить это в файле build.gradle:
android {
sourceSets {
androidTest.manifest.srcFile "src/androidTest/AndroidManifest.xml"
}
}