Bash- und testgetriebene Entwicklung

Wenn ich mehr als ein einfaches Skript in Bash schreibe, frage ich mich oft, wie ich den Code testbar machen kann.

Es ist normalerweise schwierig, Tests für Bash-Code zu schreiben, da es nur wenige Funktionen gibt, die einen Wert annehmen und einen Wert zurückgeben, und viele Funktionen, die bestimmte Aspekte in der Umgebung prüfen und festlegen, das Dateisystem modifizieren. Aufrufen eines Programms usw. - Funktionen, die von der Umgebung abhängen oder Nebenwirkungen haben. Dadurch wird der Setup- und Testcode viel komplizierter als der Code, den sie testen.

Betrachten Sie zum Beispiel eine einfache zu testende Funktion:

function add_to_file() {
  local f=$1
  cat >> $f
  sort -u $f -o $f
}

Testcode für diese Funktion könnte bestehen aus:

add_to_file.before:

foo
bar
baz

add_to_file.after:

bar
baz
foo
qux

Und Testcode:

function test_add_to_file() {
   cp add_to_file.{before,tmp}
   add_to_file add_to_file.tmp
   cmp add_to_file.{tmp,after} && echo pass || echo fail
   rm add_to_file.tmp
}

Hier werden 5 Codezeilen durch 6 Testcodezeilen und 7 Datenzeilen getestet.

Betrachten Sie nun einen etwas komplizierteren Fall:

function distribute() {
   local file=$1 ; shift
   local hosts=( "$@" )
   for host in "${hosts[@]}" ; do
     rsync -ae ssh $file $host:$file
   done
}

Ich kann nicht einmal sagen, wie ich anfangen soll, einen Test dafür zu schreiben ...

Gibt es also eine gute Möglichkeit, TDD in Bash-Skripten durchzuführen, oder sollte ich aufgeben und meine Bemühungen woanders einsetzen?

Antworten auf die Frage(8)

Ihre Antwort auf die Frage