Android Studio - очистить данные приложения для контрольно-измерительного теста

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

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

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

    :MyMainApp:assembleDebug UP-TO-DATE
    :MyMainApp:assembleDebugTest UP-TO-DATE
    :MyMainApp:clearMainAppData
    :MyMainApp:connectedCheck
    
  • При запуске из среды 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)
    }
}

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

Я посмотрел API AndroidJUnitRunner, и есть крючки через интерфейс 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

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

Спасибо!

Ответ 1

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

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

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

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

Ваша тестовая конфигурация

Шаг 2: просто добавьте созданную gradle задачу

Просто позвоните в свою задачу  gradle здесь

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

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

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