Bash y desarrollo impulsado por pruebas

Cuando escribo más que un script trivial en bash, a menudo me pregunto cómo hacer que el código sea verificable.

Por lo general, es difícil escribir pruebas para el código bash, debido al hecho de que es bajo en funciones que toman un valor y devuelven un valor, y alto en funciones que verifican y establecen algunos aspectos en el entorno, modifican el sistema de archivos, invocar un programa, etc. - funciones que dependen del entorno o tienen efectos secundarios. Así, la configuración y el código de prueba se vuelven mucho más complicados que el código que prueban.

Por ejemplo, considere una función simple para probar:

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

El código de prueba para esta función podría consistir en:

add_to_file.before:

foo
bar
baz

add_to_file.after:

bar
baz
foo
qux

Y código de prueba:

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
}

Aquí se prueban 5 líneas de código con 6 líneas de código de prueba y 7 líneas de datos.

Ahora consideremos un caso un poco más complicado:

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

Ni siquiera puedo decir cómo empezar a escribir una prueba para eso ...

Entonces, ¿hay una buena manera de hacer TDD en scripts de bash, o debo rendirme y poner mis esfuerzos en otra parte?

Respuestas a la pregunta(8)

Su respuesta a la pregunta