10

Wie kann ich Android Studio (AndroidJunitRunner) erhalten, um Anwendungsdaten vor einem Instrumentierungstest zu löschen, ohne den Befehl adb manuell auszuführen?Android Studio - klare Anwendungsdaten für Instrumentierungstest

ich, dass android.support.test.runner.AndroidJUnitRunner Art von Cheats entdeckt - es ruft nie wirklich connectedCheck oder connectedAndroidTest.

  1. Wenn von der Kommandozeile ausgeführt $ gradle connectedCheck

    :MyMainApp:assembleDebug UP-TO-DATE 
    :MyMainApp:assembleDebugTest UP-TO-DATE 
    :MyMainApp:clearMainAppData 
    :MyMainApp:connectedCheck 
    
  2. Wenn innerhalb IDE lief durch die Instrumentierung Testkonfiguration (grün Android Roboter-Logo mit rot/grünen Pfeilen) klicken

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

    Wie Sie sehen können, ist die letzte Zielscheibe assembleDebugTest

Ich hatte einen Haken auf connectedCheck in build.gradle hinzugefügt, um die Daten der Haupt-App zu löschen, bevor Sie den Instrumentierungstest starten.

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

Mir ist klar, dass alternativ könnte ich eine ‚Daten löschen‘ Button in der Hauptanwendung implementieren und haben die Instrumentierung App über die Benutzeroberfläche klicken, aber ich finde diese Lösung unerwünscht.

Ich sah API und es gibt Haken über Runlistener Schnittstelle, aber Haken sind im Kontext der Test-App, d. H. Auf dem Gerät ausgeführt, und Android verbietet einer App eine andere App zu ändern. http://junit.sourceforge.net/javadoc/org/junit/runner/notification/RunListener.html

Beste Antwort Ihnen geht, wenn Sie mir eine der folgenden Aktionen automatisch aus Android Studio auslösen kann helfen:

  • einen Zeilenbefehl ausführen adb shell pm clear my.main.app.package,
  • oder vorzugsweise meine gradle Aufgabe aufrufen clearMainAppData

Ich bin auch ganz Ohr, wenn es eine Veränderung gibt nate Weg. Sicherlich sollte es bei der Automatisierung von Geräteprüfungen einen klaren Weg geben, um Anwendungsdaten zu löschen.

Vielen Dank!

+0

Es gibt keine Antworten, also denke ich, dass die meisten Leute einfach auf die Installation der App als Initialisierungsprozess verlassen. –

+0

@ razzle-shazi hat Nsimons Lösung für Sie arbeiten? –

Antwort

19

Ich weiß, es ist eine Weile her, und hoffentlich haben Sie dieses Problem jetzt sortiert.

Ich stieß heute auf das gleiche Problem und stürzte hier ohne jede Lösung ab.

Aber ich habe es geschafft, indem es meine Aufgabe von der Testkonfiguration anruft.

Schritt 1: Gehen Sie zu Ihrer Testkonfiguration

Your test configuration

Schritt 2: einfach die gradle Aufgabe, die Sie

Simply call your gradle task from here

Durch die Art und Weise erstellt hinzufügen, um die Aufgabe in meinem Fall einfach sieht so aus:

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

Hoffe, das wird jemandem helfen :)

+0

Wenn jemand ein Problem hat: "mehr als ein Gerät und Emulator" und nur ein tatsächlich laufendes Gerät, dann versuchen Sie, Ihr adb neu zu starten. Brauche nur: "adb kill-server" und dann "adb devices". – ZelvaJan

+0

Funktioniert, aber die Aufgabe wird nur einmal gestartet. Kennen Sie einen Weg, um vor jedem Test zu beginnen? – WindRider

+0

Wenn Sie sich den ersten Screenshot anschauen, sehen Sie, dass die unterste Box "Vor dem Start" lautet. Stellen Sie sicher, dass Sie diese Aufgabe definiert haben (indem Sie Schritt 2 folgen). Jedes Mal, wenn Sie diese Konfiguration starten, wird zuerst die Gradle-Aufgabe (hier clearData) und dann Ihre Konfiguration ausgeführt. Beachten Sie, dass diese Lösung nur funktioniert, wenn nur ein Gerät angeschlossen ist – NSimon