Android Studio очищает данные приложения для инструментального тестирования

Как заставить Android Studio (AndroidJunitRunner) очищать данные приложения перед тестированием инструментария без ручного запуска команды adb?

Я обнаружил этот android.support.test.runner.AndroidJUnitRunner вид читов - он никогда не вызывает connectedCheck или connectedAndroidTest.

  1. При запуске из командной строки $ gradle connectedCheck

    :MyMainApp:assembleDebug UP-TO-DATE
    :MyMainApp:assembleDebugTest UP-TO-DATE
    :MyMainApp:clearMainAppData
    :MyMainApp:connectedCheck
    
  2. При запуске из среды IDE, щелкнув конфигурацию инструментального теста (зеленый логотип робота Android с красными / зелеными стрелками)

    **Executing tasks: [:MyMainAppApp:assembleDebug, :MyMainAppApp:assembleDebugTest]**
    

    Как видите, последняя цель gradle - assembleDebugTest

Я добавил ловушку для connectedCheck в build.gradle, чтобы очистить данные основного приложения перед запуском инструментального теста.

// Run 'adb' shell command to clear application data of main app for 'debug' variant
task clearMainAppData(type: Exec) {
    // we have to iterate to find the 'debug' variant to obtain a variant reference
    android.applicationVariants.all { variant ->
        if (variant.name.equals("debug")) {
            def clearDataCommand = ['adb', 'shell', 'pm', 'clear', getPackageName(variant)]
            println "Clearing application data of ${variant.name} variant: [${clearDataCommand}]"
            commandLine clearDataCommand
        }
    }
}
// Clear Application Data (once) before running instrumentation test
tasks.whenTaskAdded { task ->
    // Both of these targets are equivalent today, although in future connectedCheck
    // will also include connectedUiAutomatorTest (not implemented yet)
    if(task.name.equals("connectedAndroidTest") || task.name.equals("connectedCheck" )){
        task.dependsOn(clearMainAppData)
    }
}

Я понимаю, что в качестве альтернативы я мог бы реализовать кнопку «Очистить данные» в главном приложении и заставить инструментальное приложение щелкать пользовательский интерфейс, но я считаю это решение нежелательным.

Я посмотрел на AndroidJUnitRunner API, и там есть хуки через Runlistener интерфейс, но хуки находятся в контексте тестового приложения, т.е. работают на устройстве, а Android запрещает одному приложению изменять другое приложение. http://junit.sourceforge.net/javadoc/org/junit/runner/notification/RunListener.html

Лучший ответ - к вам, если вы можете помочь мне автоматически запустить одно из следующих действий из Android Studio:

  • выполнить командную строку adb shell pm clear my.main.app.package,
  • или, желательно, вызвать мою задачу gradle clearMainAppData

Я тоже все уши, если есть альтернативный способ. Разве с автоматизацией тестирования устройств должен быть четкий способ очистки данных приложения?

Спасибо!


person Razzle Shazl    schedule 30.07.2015    source источник
comment
Ответов нет, поэтому я полагаю, что большинство людей просто полагаются на установку приложения в качестве процесса инициализации.   -  person Razzle Shazl    schedule 04.08.2015
comment
@ razzle-shazi вам понравилось решение nsimons?   -  person Tim Boland    schedule 27.08.2016


Ответы (2)


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

Сегодня я столкнулся с той же проблемой и разбился здесь без какого-либо решения.

Но мне удалось заставить его работать, вызвав свою задачу из тестовой конфигурации.

Шаг 1. Перейдите к своей тестовой конфигурации

«Ваша

Шаг 2. Просто добавьте созданную вами задачу gradle

Просто вызовите свою задачу Gradle отсюда

Кстати, задача в моем случае выглядит просто так:

task clearData(type: Exec) {
  def clearDataCommand = ['adb', 'shell', 'pm', 'clear', 'com.your.application']
  commandLine clearDataCommand
}

Надеюсь, это кому-то поможет :)

person NSimon    schedule 02.02.2016
comment
Если у кого-то есть проблема: более одного устройства и эмулятора и только одно реально работающее устройство, попробуйте перезапустить adb. Просто нужно: adb kill-server а потом adb devices. - person ZelvaJan; 31.05.2016
comment
Работает, но задача запускается только один раз. Вы знаете, как начинать перед каждым тестом? - person WindRider; 14.09.2016
comment
Если вы посмотрите на первый снимок экрана, вы увидите это самое нижнее поле с надписью «Перед запуском». Убедитесь, что у вас определена эта задача gradle (выполнив шаг 2). Теперь каждый раз, когда вы запускаете эту конфигурацию, сначала будет выполняться задача gradle (здесь clearData), а затем ваша конфигурация. Обратите внимание, что это решение работает только тогда, когда у вас подключено только одно устройство. - person NSimon; 16.09.2016
comment
Как сохранить результат выполнения командной строки, предположим, у меня есть commandLine 'pwd', он возвращает каталог пути, поэтому как сохранить его в переменной, чтобы к нему могла получить доступ и другая задача - person Srinivas Jayaram; 15.06.2018

С Android Test Orchestrator проще предоставить эту опцию с помощью скрипта gradle.

android {
  defaultConfig {
   ...
   testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

   // The following argument makes the Android Test Orchestrator run its
   // "pm clear" command after each test invocation. This command ensures
   // that the app's state is completely cleared between tests.
   testInstrumentationRunnerArguments clearPackageData: 'true'
 }

Ниже приведена ссылка на Android Test Orchestrator.

https://developer.android.com/training/testing/junit-runner#using-android-test-orchestrator

person Ponsuyambu    schedule 12.08.2019
comment
Это лучший способ сделать это, если вы хотите, чтобы данные очищались для каждого теста. - person Matt Wolfe; 25.10.2019
comment
Но когда я применяю Orchestrator, при следующей попытке запуска я сразу получаю «Тесты не найдены». - person Emjey; 05.01.2020
comment
Два недостающих бита: testOptions { animationsDisabled = true execution 'ANDROIDX_TEST_ORCHESTRATOR' } и dependences { androidTestUtil 'androidx.test:orchestrator:1.2.0' } - person Ivan Morgillo; 08.05.2020