Как включить разрешение на чтение и запись контактов при запуске подключенного теста Android?

Задача:

Пусть подключенные тесты Android хорошо работают на Android M.

Вопрос:

Как включить разрешение на чтение и запись контактов при запуске подключенного теста Android?

Проблема:

Я знаю, что команда pm может включить разрешение apk.

adb shell pm grant <PACKAGE_NAME> <PERMISSION_NAME> 

Я хочу запустить тесты, которые могут выполняться как с реальным apis, так и с mock apis. Если я не могу вызвать команду pm в градиенте DSL, тестовый код не сможет коснуться реального api по соображениям безопасности.

Я пытаюсь добавить этот шаг в первую очередь из задачи connectedAndroidTest (connectedInstrumentTest) . Он не работает для целевой APK еще не установлена. Командные строки вызываются с кодом ошибки.

 android.testVariants.all { variant -> variant.connectedInstrumentTest.doFirst { def adb = android.getAdbExe().toString() exec { commandLine 'echo', "hello, world testVariants" } exec { commandLine adb, 'shell', 'pm', 'grant', variant.testedVariant.applicationId, 'android.permission.READ_ACCOUNTS' } } } 

Я пытаюсь добавить этот шаг в качестве последнего шага задачи установки. Он не вызывается, когда я запускаю connectedAndroidTest .

 android.applicationVariants.all { variant -> if (variant.getBuildType().name == "debug") { variant.install.doLast { def adb = android.getAdbExe().toString() exec { commandLine 'echo', "hello, world applicationVariants" } exec { commandLine adb, 'shell', 'pm', 'grant', variant.applicationId, 'android.permission.READ_ACCOUNTS' } } } } 

Мой план – включить разрешения перед запуском тестов. Я не знаю, какая задача правильная. Похоже, что connectedVariantAndroidTest не зависит от installVariant , хотя оба они называют adb install .

Я пытаюсь запустить pm grant из тестовых случаев. Это не так, как ожидалось.

Я буду принимать другие решения, чтобы хорошо провести тесты на Android.

Я думаю, что вам нужно создать свою собственную задачу в зависимости от installDebug а затем завязать installDebug зависимости от вашей задачи.

Люди делают это, чтобы отключить анимацию и работу, вы принудительно устанавливаете приложение и предоставляете свое конкретное разрешение до того, как тесты Android будут выполнены следующим образом:

 def adb = android.getAdbExe().toString() task nameofyourtask(type: Exec, dependsOn: 'installDebug') { // or install{productFlavour}{buildType} group = 'nameofyourtaskgroup' description = 'Describe your task here.' def mypermission = 'android.permission.READ_ACCOUNTS' commandLine "$adb shell pm grant ${variant.applicationId} $mypermission".split(' ') } tasks.whenTaskAdded { task -> if (task.name.startsWith('connectedDebugAndroidTest')) { // or connected{productFlavour}{buildType}AndroidTest task.dependsOn nameofyourtask } } 

Вы можете добавить этот код в новый файл yourtask.gradle и добавить следующую строку в нижней части файла build.gradle :

 apply from: "yourtask.gradle" 

И объявите свое разрешение в надлежащем манифесте

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

Обновить:

Исправлена ​​команда commandLine, как вы делали в своей версии для нескольких вариантов , спасибо.

 android.applicationVariants.all { variant -> if (variant.getBuildType().name == "debug") { task "configDevice${variant.name.capitalize()}" (type: Exec){ dependsOn variant.install group = 'nameofyourtaskgroup' description = 'Describe your task here.' def adb = android.getAdbExe().toString() def mypermission = 'android.permission.READ_ACCOUNTS' commandLine "$adb shell pm grant ${variant.applicationId} $mypermission".split(' ') } variant.testVariant.connectedInstrumentTest.dependsOn "configDevice${variant.name.capitalize()}" } }