Android Studio - limpar dados de aplicativos para o Instrumentation Test

Como faço para que o Android Studio (AndroidJunitRunner) limpe os dados do aplicativo antes de um teste de instrumentação sem executar manualmenteadb comando?

Eu descobri issoandroid.support.test.runner.AndroidJUnitRunner tipo de truques - na verdade, nunca invocaconnectedCheck ouconnectedAndroidTest.

Quando executado a partir da linha de comando$ gradle connectedCheck

:MyMainApp:assembleDebug UP-TO-DATE
:MyMainApp:assembleDebugTest UP-TO-DATE
:MyMainApp:clearMainAppData
:MyMainApp:connectedCheck

Quando executado a partir do IDE, clique na configuração do teste de instrumentação (logotipo verde do robô Android com setas vermelhas / verdes)

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

Como você pode ver, o último alvo da gradação éassembleDebugTest

Eu adicionei um gancho paraconnectedCheck nobuild.gradle para limpar os dados do aplicativo principal antes de iniciar o teste de instrumentação.

// 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)
    }
}

Percebo que, alternativamente, eu poderia implementar um botão 'limpar dados' no aplicativo principal e fazer com que o aplicativo de instrumentação clicasse na interface do usuário, mas acho essa solução indesejável.

Eu olheiAndroidJUnitRunner API e existem ganchos viaRunlistener interface, mas ganchos estão durante o contexto do aplicativo de teste, ou seja, em execução no dispositivo, e o Android proíbe que um aplicativo modifique outro.http://junit.sourceforge.net/javadoc/org/junit/runner/notification/RunListener.html

Melhor resposta vai até você, se você puder me ajudar a acionar uma das seguintes ações automaticamente no Android Studio:

executar uma linha de comandoadb shell pm clear my.main.app.package,ou preferencialmente invocar minha tarefa gradleclearMainAppData

Eu também sou todo ouvidos se houver uma maneira alternativa. Certamente, com a automação de teste de dispositivos, deve haver uma maneira clara de limpar os dados do aplicativo?

Obrigado!

questionAnswers(1)

yourAnswerToTheQuestion