Bash и разработка через тестирование

Когда я пишу не просто тривиальный скрипт на bash, я часто задаюсь вопросом, как сделать код тестируемым.

Как правило, сложно писать тесты для кода bash из-за того, что в нем мало функций, которые принимают значение и возвращают значение, и много функций, которые проверяют и задают какой-то аспект в среде, модифицируют файловую систему, вызвать программу и т. д. - функции, которые зависят от среды или имеют побочные эффекты. Таким образом, код установки и тестирования становится намного сложнее, чем код, который они тестируют.

Например, рассмотрим простую функцию для проверки:

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

Тестовый код для этой функции может состоять из:

add_to_file.before:

foo
bar
baz

add_to_file.after:

bar
baz
foo
qux

И тестовый код:

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
}

Здесь 5 строк кода тестируются с помощью 6 строк тестового кода и 7 строк данных.

Теперь рассмотрим немного более сложный случай:

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

Я даже не могу сказать, как начать писать тест для этого ...

Итак, есть ли хороший способ сделать TDD в скриптах bash, или я должен сдаться и приложить свои усилия в другом месте?

Ответы на вопрос(8)

Ваш ответ на вопрос