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!