Подтвердить что ты не робот

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, так как номер версии не отображается в настройках тестового приложения.

Как я могу ввести правильные разрешения для моего тестового проекта?

4b9b3361

Ответ 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"
    }
}