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