Bash Automated Testing System (Bats)

bats_titel Bats_Titelbild

Bei Bats (https://github.com/bats-core/bats-core) handelt es sich um ein TAP-compliant (Test anything Protocol) Testing Framework für die Bash. Es bietet einen einfachen Weg, um eigene UNIX-Programme zu verifizieren und sicherzugehen, dass sie sich so verhalten wie erwartet. Für Debian-basierte Distributionen gibt es das Paket Bats, auf anderen Distributionen muss bats manuell installiert werden. Entwickelt wurde Bats von Sam Stephenson. Die aktuelle Version ist Bats 1.2.0.

Beispiel/Use-Case:

Es soll ein Webserver in einem Docker-Container (httpd:2.4) mittels docker-compose angelegt und gestartet werden. Vorher soll von Bats getestet werden, ob der Webserver läuft und ob der Port erreichbar ist. Zudem wird überprüft, ob die Startwebseite „Hallo ORDIX" ausgibt. Dieser Container kann jetzt gestoppt, gestartet und entfernt werden. Die docker-compose.yml-Datei hat folgenden Inhalt:

version: '3'

services:
  apache:
    image: httpd:2.4
    container_name: apache
    volumes:
      - ./index.html:/usr/local/apache2/htdocs/index.html
    ports:
      - 80:80    

Implementierung:

Bevor der Test gestartet werden kann, müssen die einzelnen Tests erstellt werden. Dazu wird ein Makefile zum Starten der verschiedenen Testcases und Containeroperationen benutzt. Dieses lädt die einzelnen Testfälle, sodass sie danach ausgeführt werden können.

NAME = httpd
VERSION = 2.4

config:
        docker-compose config

test-up:
        env NAME=$(NAME) VERSION=$(VERSION) bats test/test-up.bats
test-ps:
        env NAME=$(NAME) VERSION=$(VERSION) bats test/test-ps.bats
test-ports:
        env NAME=$(NAME) VERSION=$(VERSION) bats test/test-ports.bats
test-curl:
        env NAME=$(NAME) VERSION=$(VERSION) bats test/test-curl.bats
test-all:
        env NAME=$(NAME) VERSION=$(VERSION) bats test/test-all.bats 

Bats Dateien

  In der Datei test_helper.bash sind verschiedene Funktionen definiert, in denen die jeweiligen Tests gestartet, konfiguriert, usw. werden.

run_up() {
  docker-compose up -d
}

run_ps() {
  docker-compose ps | grep '^apache' | awk '{print $1}'
}

run_ports() {
  docker-compose ps | grep '^apache'
}

run_curl() {
  curl -k localhost:80 2>/dev/null
} 

In der Datei test-all.bats werden die Ausgaben und Returncodes der Befehle aus test_helper.bash ausgewertet und geprüft.

#!/usr/bin/env bats
load test_helper

@test "Test already-up container apache" {
  run run_up
  [ "$status" -eq 0 ]
  [ "${lines[0]}" = "apache is up-to-date" ]
}

@test "Test ports of container apache:  0.0.0.0:80->80/tcp" {
  run run_ports
  [ "$status" -eq 0 ]
  [ "$output" = "apache   httpd-foreground   Up      0.0.0.0:80->80/tcp" ]
}

@test "Test running container apache" {
  run run_ps
  [ "$status" -eq 0 ]
  [ "$output" = "apache   httpd-foreground   Exit 0" ]
}

@test "Run curl (/mnt/index.html): Hallo ORDIX" {
  run run_curl
  [ "$status" -eq 0 ]
  [ "$output" = "Hallo ORDIX" ]
} 

Die Ergebnisse der Tests sehen wie folgt aus:

# bats test-all.bats
✓ Test already-up container apache
✓ Test running container apache
✓ Test ports of container apache: 0.0.0.0:80->80/tcp
✓ Run curl (/mnt/index.html): Hallo ORDIX

Fazit 

Softwaretests sind ein wichtiges Mittel, um fehlerfreie Software zu erstellen. Mit Bats gibt es ein kleines und einfaches Tool zum strukturierten und automatischen Testen von Bash-Programmen.

By accepting you will be accessing a service provided by a third-party external to https://blog.ordix.de/