Tests Automatisieren (Übersetzung)

By | 7. März 2017

(Dieser Artikel ist die leicht gekürzte, deutsche Version von Automating Tests aus dem Schwesterblog webanalyticsfordevelopers.com. Das Thema automatisiertes Testen liegt mir einfach am Herzen.)

Seit langem schreibe und rede ich über automatisierte Tests und Datenqualität. Ein Tool zum Testen habe ich geteilt: Site Infrastructure Tests github. Beim Adobe Summit in London habe ich darüber referiert.

Ich habe oft gesagt, dass die Tests im Workflow der Entwickler liegen sollten, habe aber nie beschrieben, wie das aussehen soll. Sehr uncool!

Daher zeige ich heute, wie man auf einem Raspberry Pi Jenkins installieren und seine Tests automatisieren kann.

Mit etwas Glück benutzt auch die Entwicklungsabteilung bereits Jenkins, dann gibt das auch gleich schöne Synergien… und falls nicht, dann hat man wenigstens ein Tool, das eher früher als später Alarm schlägt, wenn was schiefläuft.

Zutaten

Wir brauchen:

  1. 1 Raspberry Pi (egal welchen, aber mit Netzwerk),
  2. 1 Stromversorgung und 1 Micro USB Kabel
  3. Bildschirm, Maus und Tastatur, oder wahlweise die Fähigkeit, mit SSH umgehen zu können
  4. 1 MicroSD Karte
  5. NOOBS

Die NOOBS Seiten erklären gut, wie man Raspbian auf dem Pi installiert, deswegen werde ich das hier nicht nochmal tun.

Wichtig ist, die Zeitzone richtig zu setzen. Sonst gibt’s später Ärger bei der Installation von Jenkins.

Zunächst machen wir mal ein Update und bringen apt noch HTTPS bei:

[code language=“bash“]
sudo apt -y install apt-transport-https
sudo apt update
sudo apt -y dist-upgrade
sudo apt-get -y autoremove
sudo reboot
[/code]

Schritt 1 — Installieren

Wir brauchen ein paar Dinge — Java, phantomJS, Maven — genau wie auf Windows oder Mac. Dazu installieren wir noch Jenkins.

Raspbian ist eine Version von debian, welches eine Linux Distribution ist. Wie das bei Linux/Unix so ist, machen wir alles im Terminal.

Zunächst installieren wir Maven:

[code language=“bash“]
sudo apt -y install maven
[/code]

Neben Maven werden da noch einige Dinge mitinstalliert, das sind die sogenannten „dependencies“, also Pakete, die Maven braucht.

Eigentlich brauchen wir Maven gar nicht, denn Jenkins installiert es später eh selbst, aber ich installiere es trotzdem, damit ich auch mal einen Test einfach so manuell laufen lassen kann.

Wir schalten auf Oracles Java um, anstelle des openJDK.

[code language=“bash“]
sudo update-alternatives –config java
[/code]

Das sollte etwa so aussehen:

[screenshot]

Using the Oracle JDK

Leider steht phantomJS nicht auf raspbian zur Verfügung, aber man findet ein kompiliertes binary auf diesem github.

[code language=“bash“]
wget https://github.com/fg2it/phantomjs-on-raspberry/releases/download/v2.1.1-wheezy-jessie-armv6/phantomjs_2.1.1_armhf.deb
sudo dpkg -i phantomjs_2.1.1_armhf.deb
sudo apt-get install -f
[/code]

Wer sicher sein möchte, kompiliert phantomJS selbst. Von Fremden kompilierte binaries sind ein Sicherheitsrisiko! Wer jemanden kennt, der sowas kann, sollte kompilieren statt herunterladen!

Schneller Test

Kurze Pause für einen schnellen Test:

[code language=“bash“]
mkdir dev
cd dev
git clone https://github.com/janexner/site-infrastructure-tests.git
cd site-infrastructure-tests
mvn test
[/code]

Maven sollte Krams herunterladen und dann einen Test fahren. Das Ergebnis sollte etwa so aussehen:

[screenshot]

A first test – no Jenkins so far

Super!

Weiter mit Schritt 1

Wir können jetzt Jenkins installieren.

Im offiziellen Raspbian repository liegt nur eine steinalte Version, also holen wir uns Jenkins von jenkins.io. Das geht so:

[code language=“bash“]
sudo /bin/su -c „echo ‚deb https://pkg.jenkins.io/debian binary/‘ > /etc/apt/sources.list.d/jenkins.list“
wget -q -O – http://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add –
[/code]

Klappt? Ok, dann installieren wir Jenkins:

[code language=“bash“]
sudo apt update
sudo apt -y install jenkins
[/code]

Note: An dieser Stelle merkt man spätestens, wenn die Uhr im Rapsberry Pi nicht ordentlich gestellt ist. Dann weigert sich nämlich apt, von jenkins.io Jenkins 2.x zu laden, und man erhält die alte 1.x aus dem Raspbian repository. Einfach die Uhr und Zeitzone stellen, dann sollte es klappen.

Nachdem etwa 70MB geladen und Jenkins installiert wurde, kann man den Raspberry Pi mal neu starten. Das dauert dann ein wenig.

Schritt 2 — Jenkins einrichten

Jenkins möchte jetzt konfiguriert werden.

Mit einem Browser auf dem Pi geht man auf localhost:8080 (oder man nimmt den Browser auf dem PC, dann muss man die IP des Pi wissen, klar.)

Mit dem Kommando

[code language=“bash“]
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
[/code]

bekommt man einen Code angezeigt, den man einfach in den Browser kopiert, um Jenkins „aufzuschliessen“.

Dann wählt man „Select“ und mindestens „Dashboard View“ und „Github Plug-in“ und klickt dann „Install“.

[screenshot]

Jenkins in the process of first setup

Jenkins konfiguriert sich und zeigt dann ein leeres dashboard.

Jetzt fügen wir in Jenkins Maven hinzu.

Hinter „Manage Jenkins“ und „Global Tool Configuration“ verbirgt sich die Konfiguration der Tools.

[screenshot]

Finding the „Global Tools Configuration“ in Jenkins

Im Abschnitt Maven klickt man Add an installer. Das sollte dann so aussehen:

[screenshot]

Telling Jenkins to install Maven

Ok.

Schritt 3 — Einen Job konfigurieren

Hinter „Create a job“ versteckt sich die Einrichtung eines Jobs, der später regelmässig unseren Test laufen lassen kann. Wir nehmen ein „Maven Project“ und klicken“Ok“ unten links.

Auf der recht langen Folgeseite müssen wir 3 Dinge konfigurieren:

  • Wo soll der Test herkommen?
  • Wann oder wodurch soll ein Test ausgelöst werden?
  • Wie soll der Test ablaufen?

[screenshot]

Setup of test job in Jenkins

Zwei Dinge muss man hier vielleicht erklären,

  1. die Box unter Build Triggers > Schedule box („H H * * 7“)
  2. das Build > Goals and options Eingabefeld

Ersteres ist cron format. Unix/Linux-basierte Systeme kennen das seit den 70ern. „H H * * 7“ bedeutet „irgendwann am Sonntag“.

Das „Goals and options“ enthält exakt die Optionen, die man sonst manuell hinter das mvn Kommando schreibt.

Der Raspberry Pi kann ohne Mühe mehrere Jobs abarbeiten. Diese unterscheiden sich in erster Linie im „Goals and options“ Feld, welches für jeden Job auf eine andere JSON Datei verweist.

Ok, fertig!

Ab jetzt, und solange der Pi an ist, läuft der Job jeden Sonntag. Man kann ihn auch manuell aus dem Dashboard anstossen.

[screenshot]

Manually triggering a job in Jenkins

Schritt 4 – Die Ausgabe

Jobs können erfolgreich sein, oder auch nicht.

Die Icons werden auf der Jenkins Seite gut erklärt: what those „Job Status“ and „Build Status“ icons mean.

[screenshot]

Job status (yellow = unstable!) on Jenkins Dashboard

Und wenn mal ein Job nicht funktioniert, dann schlage ich einen Blick in den „Console Output“ vor. Den findet man am besten über die Jobnummer („#12“ oben im Screenshot).

[screenshot]

Console Output of a failed job in Jenkins

Die Ausgabe hier entspricht dem, was Maven bei einem manuellen Aufruf ausgeben würde. Man sollte also schnell finden können, wo das Problem liegt!

Und dann?

Jetzt ist es an der Zeit, die eigene Website zu testen!

Die beste Möglichkeit dazu ist, einen Fork von meinem github Projekt zu machen, und das für die Tests zu verwenden. Man erhält damit auch automatisch Versionsverwaltung für seine JSON Dateien, und das ist löblich!

Maintenance

Software altert schneller als Mensch, daher loggt man sich ab und zu (ich mache das jeden Tag) in den Raspberry Pi ein und tanzt ein paar Updates:

[code language=“bash“]
sudo apt update
sudo apt -y dist-upgrade
sudo apt-get -y autoremove
[/code]

 

Falls dabei der Kernel ein Update bekommt, sollte man den Rapsberry Pi mal booten, ansonsten kann er einfach immer durchlaufen.

Und das war’s schon. Fragen gerne an mich, und ich freue mich auch über Erfolgsstories beim Testen!

Kommentar verfassen