В дополнение к roundup и shunit2 мой обзор инструментов тестирования модуля оболочки также включает assert.sh и shelltestrunner .
Я в основном согласен с критической оценкой автора shunit2 (некоторые из них субъективны), поэтому я исключил shunit2 после просмотра документации и примеров. Хотя, это выглядело знакомо, имея некоторый опыт работы с jUnit.
На мой взгляд, shelltestrunner - самый оригинальный инструмент, на который я смотрел, поскольку он использует простой декларативный синтаксис для определения тестового примера. Как обычно, любой уровень абстракции дает некоторое удобство за счет некоторой гибкости. Несмотря на то, что простота привлекательна, я нашел инструмент слишком ограничивающим для моего случая, в основном из-за отсутствия способа определить действия setup / tearDown (например, манипулировать входными файлами перед тестом, удалять файлы состояния после теста и т. д.).
Сначала я был немного озадачен тем, что assert.sh позволяет утверждать только состояние вывода или выхода, в то время как мне нужны были оба. Достаточно долго, чтобы написать пару тестов с использованием сводки новостей. Но вскоре я обнаружил, что режим раунда set -e
неудобен, так как в некоторых случаях ожидается ненулевое состояние выхода в качестве средства передачи результата в дополнение к стандартному выводу, что делает тестовый случай неудачным в указанном режиме. Один из образцов показывает решение:
status=$(set +e ; rup roundup-5 >/dev/null ; echo $?)
Но что если мне понадобится и ненулевой статус выхода, и выход? Я мог, конечно, set +e
до вызова и set -e
после или set +e
для всего теста. Но это противоречит принципу облавы «Все является утверждением» . Мне казалось, что я начинаю работать против инструмента.
К тому времени я понял, что "недостаток" assert.sh в том, что он позволяет только утверждать либо состояние выхода, либо вывод, на самом деле не является проблемой, поскольку я могу просто передать test
с составным выражением, подобным этому
output=$($tested_script_with_args)
status=$?
expected_output="the expectation"
assert_raises "test \"$output\" = \"$expected_output\" -a $status -eq 2"
Поскольку мои потребности были действительно базовыми (запустить набор тестов, показать, что все прошло нормально или что не получилось), мне понравилась простота assert.sh, и я выбрал именно это.