Wie erkennen Sie, ob eine android-app ausgeführt wird, UI-test mit Espresso
Schreibe ich einige Espresso-tests für Android. Ich bin mit der folgenden problem:
Ist, um für einen bestimmten Testfall zu laufen, richtig, ich brauche zu deaktivieren einige Funktionen in der app. Also, in meiner app, ich brauche, um zu erkennen, ob ich laufen werde Espresso-test, so dass ich es deaktivieren. Aber ich weiß nicht verwenden möchten BuildConfig.DEBUG
zu, weil ich nicht wollen, dass diese Funktionen deaktiviert werden, in einem debug-build. Auch möchte ich vermeiden, erstellen eine neue buildConfig zu vermeiden, zu viele build-Varianten erstellt werden (wir haben bereits eine Menge von Aromen definiert).
War ich auf der Suche nach einem Weg, um zu definieren, buildConfigField für den test, aber ich konnte nicht finden jede Bezugnahme auf Google.
- Ein hacky Lösung ist
Class.forName()
um zu sehen, ob Ihr Test-code ist in der VM: wtanaka.com/node/8041 - Hast du dieses Problem lösen?
- Ja. Ich werde hier meine Lösung posten
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kombiniert mit CommonsWare Antwort. Hier ist meine Lösung:
Definierte ich ein
AtomicBoolean
variable und eine Funktion, um zu überprüfen, ob es läuft test:Dies vermeidet dabei die try-catch-überprüfen Sie jedes mal, wenn Sie brauchen, um zu überprüfen, den Wert und es läuft nur der Prüfung das erste mal, wenn Sie diese Funktion aufrufen.
AtomicBoolean
ist nicht thread-save. Sie verwenden müssen die setter von einer einzigen endgültigenAtomicBoolean
statt Kontrolle fürnull
und eine neue erstellen. Derzeit ist dies ebenso sparen wie mit einem normalenboolean
.Kombination Commonsware Kommentar + Comtaler die Lösung hier ist ein Weg, es zu tun, die für jede test-Klasse mit dem Espresso-framework.
Class.forName("androidx.test.espresso.Espresso")
Aufbauend auf den Antworten der folgenden Kotlin-code entspricht:
Können Sie dann überprüfen Sie den Wert der Eigenschaft:
Wie wäre es mit einer fahne in der
BuildConfig
Klasse?Fügen Sie diese irgendwo in Ihrem test-Klassen.
ich lieber nicht verwenden, um Reflexion, die langsam auf android. Die meisten von uns haben dagger2 eingerichtet für dependency injection. Ich habe eine test-Komponente einrichten und testen. Hier ist ein kurzer Weg, Sie bekommen das application-Modus (Test-oder normal):
erstellen ein enum:
einer normalen AppModule:
erstellen Sie einen test-Läufer wie mich:
vergessen Sie nicht, es zu erklären in gradle wie diese:
Erstellen Sie jetzt eine Unterklasse der AppModule mit override-Methode, die sieht genau so aus und markieren Sie es als Modul über der Klassendefinition :
nun in Ihrem MyTestApplication Klasse, die man deklariert benutzerdefinierte test-runner haben die folgenden deklariert:
Nun, es zu benutzen einfach injizieren es in der Produktion code, wo immer so:
also, wenn Ihre Ausführung espresso-tests werden Tests enum, aber wenn in production code wird es normal sein, enum.
ps nicht notwendig, aber wenn Sie brauchen, um zu sehen, wie meine Produktion Dolch baut das Diagramm seine, wie diese erklärt und in Anwendung Unterklasse:
Werde ich zwei Dateien erstellen wie unten
Und in Injection.java ich verwende unterschiedliche Umsetzung, oder einfach nur eine statische variable int es.
Seit androidTest ist die Quelle gesetzt, nicht ein Teil von build-Typ, ich denke, was Sie tun möchten ist schwer.
Können Sie SharedPreferences für diese.
Setzt den debug-Modus:
Überprüfen Sie, ob der debug-Modus:
Wenn Sie JitPack mit kotlin. Sie müssen ändern Espresso ist package name .
Zur überprüfung
{}
- Symbol im editor