10

Come è possibile ottenere Android Studio (AndroidJunitRunner) per cancellare i dati dell'applicazione che precedono un test della strumentazione senza eseguire manualmente il comando adb?Android Studio - cancellare i dati dell'applicazione per Instrumentation Test

ho scoperto che android.support.test.runner.AndroidJUnitRunner tipo di trucchi - non è mai in realtà invoca connectedCheck o connectedAndroidTest.

  1. Quando viene eseguito da linea di comando $ gradle connectedCheck

    :MyMainApp:assembleDebug UP-TO-DATE 
    :MyMainApp:assembleDebugTest UP-TO-DATE 
    :MyMainApp:clearMainAppData 
    :MyMainApp:connectedCheck 
    
  2. Quando lanciato all'interno IDE cliccando la configurazione di prova strumentazione (verde logo robot Android con frecce rosse/verdi)

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

    Come puoi vedere, l'ultimo obiettivo di gradle è assembleDebugTest

Ho aggiunto un gancio su connectedCheck in build.gradle per cancellare i dati dell'app principale prima di iniziare il test della strumentazione.

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

mi rendo conto che in alternativa avrei potuto implementare un pulsante 'Cancella dati' in app principale e avere l'applicazione strumenti clicca tramite l'interfaccia utente, ma trovo che la soluzione indesiderabile.

Ho esaminato l'API AndroidJUnitRunner e ci sono ganci tramite l'interfaccia Runlistener ma i ganci si trovano nel contesto dell'applicazione di test, ovvero in esecuzione sul dispositivo, e Android impedisce a un'app di modificare un'altra app. http://junit.sourceforge.net/javadoc/org/junit/runner/notification/RunListener.html

Miglior risposta va a voi, se potete aiutarmi a avviare una delle seguenti automaticamente dall'interno di Android Studio:

  • eseguire una riga di comando adb shell pm clear my.main.app.package,
  • o, preferibilmente, invocare il mio compito Gradle clearMainAppData

Sono anche tutte le orecchie se c'è un alter nate way. Sicuramente con l'automazione dei test dei dispositivi dovrebbe esserci un modo chiaro per cancellare i dati dell'applicazione?

Grazie!

+0

Non ci sono risposte, quindi suppongo che la maggior parte delle persone faccia affidamento solo sull'installazione dell'app come processo di inizializzazione. –

+0

@ razzle-shazi ha fatto funzionare la soluzione nsimons per te? –

risposta

19

So che è passato un po 'di tempo e spero che questo problema sia risolto.

Mi sono imbattuto in quello stesso problema oggi e si è bloccato qui senza alcuna soluzione.

Ma sono riuscito a farlo funzionare richiamando il mio compito dalla configurazione di test.

Fase 1: Vai alla configurazione di prova

Your test configuration

Fase 2: è sufficiente aggiungere il compito Gradle creato

Simply call your gradle task from here

Tra l'altro, il compito nel mio caso è sufficiente assomiglia a questo:

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

Spero che questo possa aiutare qualcuno :)

+0

Se qualcuno ha un problema: "più di un dispositivo ed emulatore" e solo un dispositivo effettivamente in esecuzione, prova a riavviare l'adb. Ho solo bisogno di: "adb kill-server" e poi "dispositivi adb". – ZelvaJan

+0

Funziona ma l'attività viene avviata solo una volta. Sai un modo per iniziare prima di ogni test? – WindRider

+0

Se guardi il primo screenshot, vedrai la casella in fondo che dice "Prima del lancio". Assicurati di avere quell'attività gradle definita lì (seguendo il passaggio 2). Ora ogni volta che avvii quella configurazione, l'attività gradle (qui clearData) verrà eseguita per prima, e quindi la tua configurazione. Nota che questa soluzione funziona solo quando hai un solo dispositivo connesso – NSimon

Problemi correlati