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, или я должен сдаться и приложить свои усилия в другом месте?