Jeder, der an Android-Autotests teilgenommen hat oder hat, weiß, was für ein Schmerz das ist.
Sie werden müde von der Menge an Aufgaben und Problemen, so dass Urlaub nicht hilft. Die Leute kündigten sogar wegen Autotests.
Schmerz, Leiden und Qual führen unweigerlich zur Entstehung von etwas Neuem und Schönem. Wir haben versucht, alle Rechen zusammenzustellen, auf die wir treten mussten, unsere Bemühungen mit den Jungs von Avito und HH kombiniert und etwas geschaffen, das Ihre Beziehung zu Autotests unvergleichlich besser und fruchtbarer macht.
Treffen Sie:
Kaspresso - das Autotest-Framework, auf das Sie gewartet haben!

Ich werde sofort feststellen, dass es im
Netzwerk zwei Videos von ziemlich hoher Qualität gibt, die
Kaspresso und
AdbServer gewidmet sind (Hilfsprogramm für Kaspresso, aber gleichzeitig ein starkes und unabhängiges Projekt):
1.
Dmitry Movchan, Eugene Matsyuk - Wie man Autotests schreibt und nicht verrückt wird2.
Egor Kournikov - Das einzige, was Sie für UI-Tests benötigenSie beschreiben detailliert die Geschichte der Erstellung von Bibliotheken: Wie wir von der Lösung eines Problems zur Lösung eines anderen übergegangen sind und was am Ende passiert ist. Ich kann es nur empfehlen.
Daher werde ich in diesem Artikel nur auf die wichtigsten Punkte und Chips eingehen, damit Sie schnell verstehen, worum es in diesem Framework geht und welche Aufgaben es löst. Mut und Details finden Sie im Video und in der Dokumentation.
Warum brauchen wir überhaupt einen eigenen Rahmen?
Jeder Entwickler, der Autotests schreibt, stellt unweigerlich Fragen:
- Wie fange ich an, Autotests zu schreiben?
- Welche Tools zur Auswahl?
- Was tun, wenn kein Werkzeug erforderlich ist?
- Was sind die Best Practices?
Hinzu kommt, dass jedes Team versucht, diese Probleme auf seine eigene Weise zu lösen. Infolgedessen gibt es keine einzige Antwort auf sie, es gibt keinen Ort, an dem man sehen kann, wie man es richtig macht. Das Schreiben und Unterstützen von Autotests ist daher für Unternehmen teuer, was die Machbarkeit der Automatisierung als solche in Frage stellt.
In der Zwischenzeit verfolgt die Testautomatisierung gute Ziele. Damit haben Sie immer einen grünen und sofort einsatzbereiten Assistenten. Dies bedeutet, dass Sie die Version schnell bereitstellen können.
Das einzige Problem besteht darin, Antworten auf die oben genannten Fragen zu finden. Aber sie sind für alle Teams fast gleich. Warum also nicht ihre Lösung automatisieren?
Was wollen wir vom Framework?
Lassen Sie uns unsere Erwartungen an das Framework ein wenig offenbaren.
Gute Lesbarkeit
Standardmäßig steht uns in Android nur die Espresso-Bibliothek zur Verfügung. Es gibt natürlich Appium + Cucumber, mit dem Sie theoretisch Tests auf zwei Plattformen gleichzeitig schreiben können. Aber die Community bewegt sich zuversichtlich in Richtung des allerersten Instruments. Ich werde nicht alle Vor- und Nachteile der oben genannten Bibliotheken beschreiben: Das Netzwerk ist voll von Informationen darüber. Hier ist zum Beispiel einer der relativ neuen Links:
Appium vs Espresso. Was ist zu wählen und wie zu verwenden?Also, Espresso. Kein schlechtes Werkzeug, aber seine API ist ein bisschen auf den Kopf gestellt. Schauen Sie sich einen einfachen Code an:
@Test fun espressoTest() { onView(allOf(allOf(withId(R.id.espresso), isDescendantOfA(withId(R.id.coffee_variates))), isDescendantOfA(withId(R.id.content)))) .check(matches(withEffectiveVisibility(View.VISIBLE))) }
Du musst nachdenken, um es herauszufinden, oder?
Die Götter aus Thailand und Australien präsentierten uns die
Kakao- Bibliothek, mit der Sie auf einen Blick verstehen können, was in Ihrem Test passiert. Hier ist der gleiche Code, aber mit Kakao:
@Test fun kakaoTest() { mainScreen { myView.isVisible() } }
Viel besser. Stellen Sie sich jetzt vor, Sie hätten einen ganzen Testfall automatisiert. Wie würde der Code aussehen?
@RunWith(AndroidJUnit4::class) class OpenHomeScreenTest: TestCase() { @Test fun test() { MainScreen() { homeButton.click() } HomeScreen() { title { isVisible() hasAnyText() } } } }
Das Hauptproblem besteht darin, dass es bei diesem Test schwierig ist, ihn mit dem von Ihnen automatisierten Testfall zu korrelieren. Sie können natürlich Protokolle oder ähnliches hinzufügen. Oder geben Sie dsl ein, wodurch sich das Aussehen Ihrer Tests sofort ändert:
@RunWith(AndroidJUnit4::class) class OpenHomeScreenTest: TestCase() { @Test fun test() { step(“1. Open Home screen”) { MainScreen() { homeButton.click() } } step(“2. Check Home title”) { HomeScreen() { title { isVisible() hasAnyText() } } } } }
Stimmen Sie zu, es sieht ganz anders aus.
Stabilität
Jede Bibliothek für UI-Tests schlägt fehl. Dieselbe Aktion kann 50 Mal erfolgreich und in der 51. Pause ohne ersichtlichen Grund ausgeführt werden. Und beim 52. Lauf ist wieder alles in Ordnung. Und ein solches "Flackern" kann Ihre Nerven anständig verwöhnen.
Wir dachten, warum nicht versuchen, alle Aktionen von Kakao-Espresso abzufangen und dort bereits zusätzliches Verhalten hinzuzufügen, um solche zufälligen Fehler zu behandeln.
Auf diese Weise wurde
Version 2.1 der Kakao-Bibliothek geboren, mit der Sie sich in alle Espresso-Anrufe integrieren können.
Darüber hinaus haben wir eigene Interceptors erstellt, mit denen Sie das Verhalten am Dial-Peer ändern oder beispielsweise einfach protokollieren können. Darüber hinaus sind diese Abfangjäger anpassbar, sodass Sie sie an Ihre Bedürfnisse anpassen können. Lesen Sie mehr im
Dock .
Insbesondere im Rahmen des Kampfes gegen schuppige Tests - wenn einige Ihrer Aktionen eine Ausnahme auslösten, wird Kaspresso Folgendes versuchen:
- Scrollen. Möglicherweise ist Ihre Ansicht auf dem Bildschirm einfach nicht sichtbar.
- Entfernen Sie den Systemdialog, der von Gott weiß wo kommen könnte.
- Wiederholen Sie einen unterbrochenen Anruf zwei Sekunden lang.
Mit diesen Schritten lösen wir das Problem vollständig mit flockigen Tests!
Protokollierung
Eines der Hauptprobleme bei Autotests ist das Fehlen einer verständlichen Protokollierung, die insbesondere bei einem Absturz des Tests nicht ausreicht. Setzen Sie sich und fragen Sie sich, was und wie hier gefallen ist.
Dank des oben erwähnten Abfangens konnten wir ein ziemlich umfangreiches Protokollierungssystem aufbauen.
Schauen wir uns ein Beispiel an:


Standardmäßig protokolliert Kaspresso alle Ihre Aktionen, wählt jeden Schritt des Tests aus, zeigt die Ausführungszeit an usw.
Volle Adb in Espresso-Tests
In Espresso-Tests ist adb zunächst nicht verfügbar. Ja, es gibt eine
ADB-Shell , aber es gibt viel weniger Funktionen als in Full
ADB . Aber es gibt so viele Dinge, die sich bei Tests als nützlich erweisen können.
Wir haben eine separate
AdbServer- Bibliothek erstellt, die die vollständige
ADB für Ihre Tests
zurückgibt ! Das obige Video zeigt, wie wir gekämpft haben und was wir dafür durchgemacht haben (
eins und
zwei ).
Arbeiten Sie mit Android OS
Die Besonderheiten der Tests bei Kaspersky Lab sind so, dass wir viel mit dem Betriebssystem Android arbeiten müssen: einige Einstellungen vornehmen, Dateien auf das System hochladen usw. All dies veranlasste uns, unsere gesamte Arbeit mit dem System zu standardisieren und eine Reihe klarer Schnittstellen zu erstellen. Zugriff über ein einziges
Gerät der Einstiegspunktklasse.
Was sind diese Schnittstellen und was machen sie? Lassen Sie mich zur Veranschaulichung einige Folien aus Yegors Präsentation geben:




Die Dokumentation finden Sie
hier .
Unter der Haube werden hauptsächlich AdbServer und UiAutomator verwendet.
Aber! Wenn Sie plötzlich nicht mehr mit der Implementierung einer Schnittstelle zufrieden sind, können Sie Ihre Implementierung über den Konfigurator festlegen.
Screenshot für DocLoc (Dokumentation und Lokalisierung)
Bei allen Projekten, bei denen eine Lokalisierung erfolgt, müssen häufig Screenshots in verschiedenen Sprachen erstellt werden, um sie dem Übersetzer als Illustrationen zur Verfügung zu stellen. Schließlich ist es sehr schwierig, eine korrekte Übersetzung zu erstellen, ohne zu sehen, wo und wie eine bestimmte Zeile verwendet wird. Deshalb möchte ich schnell und sofort Screenshots in allen Sprachen machen können. Einschließlich Screenshots von Systemdialogen. Möglicherweise benötigen Sie auch Screenshots auf älteren Bildschirmen und ohne globales Refactoring.
All dies ermöglicht es Ihnen, Kaspresso sofort zuzubereiten. Lesen Sie mehr in der
Dokumentation .
Architektur und Best Practices
Eine der Hauptaufgaben von Kaspresso war es, eine solche DSL zu erstellen, die Sie zur richtigen Testarchitektur und zum richtigen Schreiben bringt.
Zu diesem Thema wurden viele Exemplare beschädigt, da Sie solche Regeln leider nirgendwo finden. Sie können höchstens Artikel auf
Page Object finden .
Daher haben wir keine Mühe gescheut und diese Probleme in der
Dokumentation sowie im
Video einmal und im
zweiten Video hervorgehoben .
Darüber hinaus schrieb Sasha Blinov einen ausgezeichneten
Artikel über das Kotlin DSL und elegante Tests . Die im Artikel beschriebenen dsl werden von Kaspresso bereitgestellt.
Zurück bei Mobius haben wir eine Option vorgeschlagen, wie die Auswirkungen von Autotests beschleunigt und schnell in PullRequest integriert werden können, um unvermeidliche Infrastrukturprobleme zu umgehen. Wir sprechen
hier ausführlicher darüber.
So verbinden und konfigurieren Sie Kaspresso, wenn Sie bereits viele Tests haben
Der Hauptzauber ist, dass Sie nichts neu schreiben müssen, wenn Sie bereits viele Tests in Kakao geschrieben haben und Kaspresso implementieren möchten! Erben Sie einfach Ihre Testklassen von der speziellen TestCase-Klasse. Und alle!
Es war:
@RunWith(AndroidJUnit4::class) class OpenHomeScreenTest { private val mainScreen = MainScreen() private val homeScreen = HomeScreen() @get:Rule val activityTestRule = ActivityTestRule(MainActivity::class.java, true, false) @Test fun test() { ... } }
Es wurde:
@RunWith(AndroidJUnit4::class) class OpenHomeScreenTest : TestCase() { private val mainScreen = MainScreen() private val homeScreen = HomeScreen() @get:Rule val activityTestRule = ActivityTestRule(MainActivity::class.java, true, false) @Test fun test() { ... } }
Wenn Ihnen die Vererbung nicht gefällt, verwenden Sie eine ähnliche
TestRule- Klasse.
Wie bereits erwähnt, ist Kaspresso ein sehr flexibles und anpassbares Framework. Alle Einstellungen sind über die gleichnamige
Kaspresso- Klasse verfügbar.
Die Standardeinstellung ist Standard. Wenn Sie etwas anpassen möchten, sieht es ungefähr so aus:
@RunWith(AndroidJUnit4::class) class OpenHomeScreenTest : TestCase( Kaspresso.Builder.default().apply { viewBehaviorInterceptors.add(MyInterceptor()) flakySafetyParams.timeoutMs = 1_000 } ) { private val mainScreen = MainScreen() private val homeScreen = HomeScreen() @get:Rule val activityTestRule = ActivityTestRule(MainActivity::class.java, true, false) @Test fun test() { ... } }
Das heißt,
Kaspresso.Builder ist über den
TestCase- Konstruktor verfügbar, in dem Sie alle erforderlichen Einstellungen vornehmen. Details zum Konfigurator finden Sie in der
Dokumentation .
Sofortige Pläne
In naher Zukunft planen wir Folgendes hinzuzufügen:
Zeigen Sie Testschritte in Allure an (Hallo an die Jungs von HeadHunter)
Durch einen speziellen Abfangjäger bereiten wir Daten für den
Marathon vor . Auf diese Weise können wir Allure-Berichte folgender Art anzeigen:

Details in
PR # 4PS PR ist bereits in Version 1.0.1, jetzt bereiten wir die entsprechende PR in
Marathon vor .
Pss. Es besteht die Idee, jedem Schritt ein bestimmtes Stück des Protokolls beizufügen und dem Schritt "gefallen" einen Screenshot hinzuzufügen.
Testen von Upgrade-Skripten
Oft ist es notwendig, die Richtigkeit von Anwendungsupgrades zu überprüfen. Ja, einige der Prüfungen können auf Komponententests übertragen werden. Wir möchten aber für die gesamte Anwendung ruhig sein.
Leider ist dies auf einem reinen Espresso nicht möglich, da der Test fehlschlägt, wenn wir die getestete apk neu installieren. Sie können irgendwie versuchen, mit dem Läufer zu tricksen, aber ich kann mir nur schwer vorstellen, wie solche Verbesserungen aussehen und wie stabil sie sein werden.
Daher bereiten wir bei Kaspresso eine Lösung für dieses Problem vor, die auf UiAutomator basiert. Oben sticht jedoch das gleiche bekannte DSL hervor, das Kakao sehr ähnlich ist und die gleiche Unterstützung für das Intersepting bietet.
Nützliche Links
KaspressoAdbServerChat , in dem wir immer gerne alle Ihre Fragen beantworten
Danksagung
Besonderer Dank geht an alle, die an der Entwicklung des Projekts beteiligt waren.
Es war sehr schwierig, aber verdammt cool!


Anstelle einer Schlussfolgerung
Wir glauben, dass Kaspresso und AdbServer Ihr Leben verbessern werden.
Wir freuen uns über Ihr Feedback, Ihre Empfehlungen, Yishuyam und PulRequest!
Und vergessen Sie bitte nicht, ein Sternchen zu setzen!
PS Und ganz am Ende eine kleine Umfrage =)