Richten Sie den automatischen Start von UI-Tests für Android-Anwendungen über TeamCity ein

Früher oder später steht jeder Tester, der die Praxis des Selbsttests entwickelt, vor dem Problem der autonomen Durchführung seiner Tests. Wenn der Spezialist erfahren ist, versucht er außerdem, so früh wie möglich damit umzugehen. Nach dem ersten erfolgreichen Autotest vor Ort habe ich mich entschlossen, den Start sofort in TeamCity zu konfigurieren.

Ich stelle fest, dass es in unserem Unternehmen praktisch kein Fachwissen zum Remote-Start von Android-Instrumentaltests gibt, daher musste ich hart googeln, fand dort aber auch keine detaillierten Anleitungen. Deshalb habe ich mich entschlossen, diese Anweisung zu knacken.

Am Eingang haben wir:

  • Test (e) werden lokal erfolgreich ausgeführt
  • Ausführen des TeamCity-Servers
  • Server auf Debian mit KVM und X.

Der Haftungsausschluss sofort über den Server, auf dem der Start durchgeführt werden soll: Das Einrichten des Betriebssystems, der Hardwarevirtualisierung und der grafischen Shell ist nicht Gegenstand dieses Artikels und wird weggelassen.

Installieren und konfigurieren Sie den TeamCity-Agenten


Beginnen wir mit Java. Die Hauptsache hier ist, die richtige Version zu wählen. Ich hatte 3 Abhängigkeiten: die Tests selbst, Android Tools und Teamcity Agent. Ich habe bei Version 8 angehalten, um eine JVM für alle zu verwenden. Wenn Sie weniger Glück haben und Konflikte auftreten, müssen Sie die Verwendung mehrerer Java-Versionen auf demselben Computer konfigurieren. Noch ein Hinweis: Wenn Sie Debian haben, müssen Sie zuerst das Webupd8team-Repository hinzufügen (Google ist sehr schnell).

sudo apt-get install oracle-java8-installer sudo apt-get install oracle-java8-set-default 

Erstellen Sie als Nächstes einen Benutzer, unter dem der Agent gestartet wird, und entsprechend alles andere. Vergessen Sie nicht, ein Passwort festzulegen.

 sudo useradd -d /home/tc_agent -s /bin/bash -m tc_agent sudo passwd tc_agent 

Die Agentenverteilung kann über die Weboberfläche Ihrer Teamstadt erfolgen. Gehen Sie dazu zum Abschnitt Agenten und klicken Sie oben rechts auf den Link Build Agents installieren . Laden Sie den gewünschten Ordner auf dem Server herunter und entpacken Sie ihn in den gewünschten Ordner (ich empfehle den Home-Ordner unseres Benutzers - /home/tc_agent ). Fügen Sie als Nächstes die Rechte zum Ausführen aller Skripts hinzu:

 sudo chmod +x /home/tc_agent/BuildAgent/bin/* 

Wenn Ihre Version von teamcity Agent Push unterstützt, ist dies immer noch einfacher. Öffnen Sie einfach die entsprechende Registerkarte in der Weboberfläche, klicken Sie auf die Schaltfläche Install Agent ... und folgen Sie den Anweisungen.

Wir konfigurieren eine Konfiguration. Wenn Sie eine Remote-Installation verwendet haben, wurde diese bereits erstellt und Sie müssen nur den Agentennamen angeben. Wenn nicht, erstellen Sie:

 cd /home/tc_agent/BuildAgent/conf cp buildAgent.dist.properties buildAgent.properties nano buildAgent.properties 

serverUrl= Adresse der Webschnittstelle des Servers und name= eindeutigen Namen des Agenten. Wenn Sie mehrere Agenten haben oder der Standardport (9090) ausgelastet ist, legen Sie Ihren eigenen mit dem Parameter ownPort= .

Wir /home/tc_agent/BuildAgent/bin/agent.sh start Befehl /home/tc_agent/BuildAgent/bin/agent.sh start . Wenn alles richtig konfiguriert ist, wird unser Agent auf der Registerkarte Nicht autorisiert angezeigt. Wir autorisieren und Sie können verwenden.

Um den Agenten automatisch zu starten, erstellen Sie das Skript /etc/init.d/teamcity_agent mit den folgenden Inhalten:

 #!/bin/bash BINARY="/home/tc_agent/BuildAgent/bin/agent.sh" RUNAS="tc_agent" LOGFILE="/home/tc_agent/BuildAgent/logs/start.log" CMD="$BINARY $1 $2" runuser - "$RUNAS" -c "$CMD > $LOGFILE" cat $LOGFILE 

Fügen Sie die Rechte zum Ausführen von sudo chmod +x /etc/init.d/teamcity_agent und fügen /etc/init.d/teamcity_agent start der Datei /etc/rc.local die Zeile /etc/init.d/teamcity_agent start /etc/rc.local .

Kontrollneustart, der Agent ist gestiegen, wir fahren fort.

Installieren Sie das Android SDK und den Emulator


Laden Sie die Android SDK-Tools herunter (nur Befehlszeilentools) und entpacken Sie sie in das gewünschte Verzeichnis. Erstellen Sie ein Verzeichnis zum Speichern zukünftiger AVD-Bilder (es sollte genügend Speicherplatz vorhanden sein). Für mich haben Administratoren das Haupt-Repository mit dem Verzeichnis /var, und ich werde alles dort ablegen. Als nächstes ändern wir den Eigentümer der Dateien in unseren Benutzer und die nächsten Schritte werden am besten unter ihm ausgeführt.

 sudo chown tc_agent -R /var/opt/android-sdk sudo mkdir /var/opt/.android sudo chown tc_agent /var/opt/.android 

Umgebungsvariablen hinzufügen. Öffnen Sie die Datei /home/tc_agent/.bash_profile zum Bearbeiten und schreiben Sie:

 export ANDROID_HOME=/var/opt/android-sdk export ANDROID_AVD_HOME=/var/opt/.android/avd export PATH=$ANDROID_HOME/platform-tools:$PATH export PATH=$ANDROID_HOME/tools:$PATH 

Wir starten neu und überprüfen, ob die Variablen in der Teamcity-Weboberfläche auf der Registerkarte Agentenparameter korrekt angezeigt werden.

Wir versuchen, sdkmanager auszuführen: Der $ANDROID_HOME/tools/bin/sdkmanager --list sollte die installierten und verfügbaren Pakete $ANDROID_HOME/tools/bin/sdkmanager --list . Wenn Sie Exception in thread "main" java.lang.NoClassDefFoundError eine Fehlermeldung wie " Exception in thread "main" java.lang.NoClassDefFoundError , versuchen Sie diese Lösung .

Installieren Sie die erforderlichen Tools und die Images der virtuellen Maschinen.

 $ANDROID_HOME/tools/bin/sdkmanager emulator platform-tools tools $ANDROID_HOME/tools/bin/sdkmanager 'system-images;android-25;google_apis;x86' 

Erstellen Sie AVD und führen Sie es aus


Also haben wir das Image von 'system-images;android-25;google_apis;x86' (Android 7.1.1) 'system-images;android-25;google_apis;x86' und ein darauf basierendes virtuelles Gerät erstellt. Ich werde nicht auf alle möglichen Parameter des Dienstprogramms avdmanager eingehen, sondern es auf die minimal mögliche Menge zeigen:

 $ANDROID_HOME/tools/bin/avdmanager create avd -n avd_name -k "system-images;android-25;google_apis;x86" 

Wir übertragen den Namen und das Originalbild (es muss vorab über sdkmanager heruntergeladen werden). Wenn der Fehler zurückgegeben wird, fügen Sie das Flag -v , um den Text anzuzeigen.

Wir gehen zum Emulator. Überprüfen Sie zunächst den Ordner Emulator, Plattformen, Plattform-Tools und System-Images im SDK-Verzeichnis. Ich habe Plattformen mit meinen Händen erstellt, der Rest wurde bei der Installation von Paketen über sdkmanager erstellt. Überprüfen Sie als Nächstes die Hardwarebeschleunigung. Es sollte eine solche Antwort geben.

 $ANDROID_HOME/emulator/emulator -accel-check accel: 0 KVM (version 12) is installed and usable. accel 

Wenn beim Zugriff auf /dev/kvm ein Fehler /dev/kvm , fügen Sie die folgenden Rechte hinzu:

 addgroup kvm usermod -a -G kvm tc_agent chown root:kvm /dev/kvm 

Außerdem musste ich noch QEMU installieren: sudo apt-get install qemu-kvm
Machen Sie eine erneute Anmeldung und überprüfen Sie den Emulator erneut.

Wenn alles in Ordnung ist, versuchen Sie zu rennen. Um durch die Augen zu sehen, stellen Sie über vnc eine Verbindung zum Server her. Und führen Sie den Emulator aus:

 $ANDROID_HOME/emulator/emulator @avd_name 

Das folgende Fenster sollte angezeigt werden:


Während der Testläufe werden wir ohne Grafiken ausgeführt, daher fügen wir den Parameter -no-window .

Konfigurieren Sie den Build in TeamCity


Wir gehen zur Endphase über und richten einen autonomen Start unserer Tests ein. Ich habe einen Build von 4 Schritten.

1. Starten Sie den Emulator

 nohup /var/opt/android-sdk/emulator/emulator @avd_name -no-snapshot-save -no-boot-anim -no-window -snapshot clean_snap_1 > start_emulator.log 2>&1& 

Da der Emulator das Terminal "sperrt", müssen Sie den Prozess mit dem Dienstprogramm nohup lösen (Sie können es auch anders machen - Sie entscheiden). Speichern Sie für alle Fälle das Emulatorprotokoll in der Datei start_emulator.log . Um die Tests auszuführen, habe ich einen sauberen Snapshot erstellt (siehe hier, wie das geht ) und den Schalter -no-snapshot-save hinzugefügt, damit er nicht überschrieben wird.

2. Warten auf den Start des Geräts.

 adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done;' 

Zuerst warten wir auf den sys.boot_completed wait-for-device , dann warten wir in der Schleife, wenn die Variable sys.boot_completed 1 zurückgibt.

3. Ausführen von Tests. Hier ist alles individuell, hier ist mein Beispiel:

 ./gradlew clean connectedAndroidTest 

4. Schließen Sie den Emulator. Hier habe ich bisher eine einfache Beendigung des Prozesses gemacht.

 kill -s 2 `pgrep qemu-system` 

Es ist jedoch besser, sich beim Erstellen des Emulators die Prozess-ID zu merken. Dies ist erforderlich, wenn wir die Tests in mehreren Threads ausführen, wodurch versehentlich nicht der falsche Prozess "beendet" wird.

Das ist alles, danke fürs Lesen. Wenn es Kommentare von erfahreneren Kollegen gibt, werde ich gerne Änderungen am Handbuch vornehmen.

Source: https://habr.com/ru/post/de415769/


All Articles