При написании более чем тривиального script в 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=( "[email protected]" )
for host in "${hosts[@]}" ; do
rsync -ae ssh $file $host:$file
done
}
Я даже не могу сказать, как начать писать тест для этого...
Итак, есть ли хороший способ сделать TDD в сценариях bash, или я должен отказаться и приложить свои усилия в другом месте?