У нас есть система, в которой кроме кода Java работают несколько сценариев bash. Поскольку мы пытаемся протестировать все, что может сломаться, а эти сценарии bash могут сломаться, мы хотим их протестировать.
Проблема в том, что скрипты bash сложно тестировать.
Есть ли способ или лучшая практика для тестирования сценариев bash? Или нам следует отказаться от использования сценариев bash и искать альтернативные решения, которые можно протестировать?
Ответы:
На самом деле существует shunit2 , фреймворк модульного тестирования на основе xUnit для сценариев оболочки на основе Bourne. Сам не использовал, но, возможно, стоит проверить.
Подобные вопросы задавались и раньше:
источник
Я получил следующий ответ от дискуссионной группы:
Этот метод похож на внедрение зависимостей для скриптов и звучит разумно. Предпочтительно избегать сценариев bash и использовать более проверенный и менее непонятный язык.
источник
TAP- совместимое тестирование Bash : автоматизированная система тестирования Bash
летучая мышь
источник
Никита Соболев написал отличное сообщение в блоге, в котором сравнивает несколько различных фреймворков для тестирования bash: Тестирование приложений Bash.
Для нетерпеливых: Никита решил использовать Bats, но похоже, что Никита пропустил проект Bats-core, который, как мне кажется, будет использоваться в будущем, поскольку исходный проект Bats не поддерживался активно с 2013 года.
источник
Epoxy - это среда тестирования Bash, которую я разработал в основном для тестирования другого программного обеспечения, но я также использую ее для тестирования модулей bash, включая саму себя и Carton .
Основными преимуществами являются относительно низкие накладные расходы на кодирование, неограниченное вложение утверждений и гибкий выбор утверждений для проверки.
Я сделал презентацию, сравнив ее с BeakerLib - фреймворком, который используют некоторые в Red Hat.
источник
Почему вы говорите, что «сложно» тестировать сценарии bash?
Что не так с тестовыми оболочками вроде:
источник
Я создал shellspec, потому что мне нужен был простой в использовании и полезный инструмент.
Он написан чистым сценарием оболочки POSIX. Он протестировал со многими снарядами больше, чем shunit2. Он имеет более мощные функции, чем bats / bats-core.
Например, поддержка вложенного блока, легкость имитации / заглушки, легкость пропуска / ожидания, параметризованные тесты, номер строки утверждения, выполнение по номеру строки, параллельное выполнение, случайное выполнение, форматирование TAP / JUnit, интеграция покрытия и CI, профилировщик и т. Д. .
Смотрите демонстрацию на странице проекта.
источник
Мне очень нравится shell2junit , утилита для генерации JUnit-подобного вывода из тестов сценария Bash. Это полезно, потому что созданный отчет затем может быть прочитан системами непрерывной интеграции, такими как подключаемые модули JUnit для Jenkins и Bamboo.
Хотя shell2junit не предоставляет всеобъемлющую среду сценариев Bash, такую как shunit2 , она позволяет вам получать хорошие отчеты о результатах тестирования.
источник
Попробуйте баштест . Это простой способ проверить ваши скрипты. Например, у вас есть
do-some-work.sh
какие-то файлы конфигурации. Например, добавьте новую строкуPASSWORD = 'XXXXX'
в файл конфигурации/etc/my.cfg
.Вы пишете команды bash построчно, а затем проверяете вывод.
Установить:
Создание тестов - это просто написание команд bash.
Файл
test-do-some-work.bashtest
:Выполните тесты:
Вы можете найти несколько примеров здесь и здесь
источник
Может быть, это можно использовать или внести свой вклад в
https://thorsteinssonh.github.io/bash_test_tools/
Предназначен для записи результатов в протоколе TAP, который, как я полагаю, хорош для CI и хорош для тех, кому нужна среда оболочки. Я полагаю, что некоторые вещи работают в среде оболочки, поэтому некоторые могут поспорить, что ее следует тестировать в среде оболочки.
источник
Попробуйте assert.sh
Надеюсь, поможет!
источник
Не могу поверить, что никто не говорил об OSHT ! Он совместим как с TAP, так и с JUnit, это чистая оболочка (то есть без других языков), она также работает автономно, проста и прямолинейна.
Тестирование выглядит так (фрагменты взяты со страницы проекта):
Простой пробег:
Последний тест отображается как «не в порядке», но код выхода равен 0, потому что это
TODO
. Также можно установить подробный:Переименуйте его, чтобы использовать
.t
расширение, и поместите его вt
подкаталог, и вы можете использоватьprove(1)
(часть Perl) для его запуска:Установите
OSHT_JUNIT
или передайте-j
для создания вывода JUnit. JUnit также можно комбинировать сprove(1)
.Я использовал эту библиотеку как функции тестирования, получая их файлы, а затем выполняя утверждения с
IS
/OK
и их отрицаниями, так и сценарии с использованиемRUN
/NRUN
. Для меня этот фреймворк дает наибольший выигрыш при наименьших накладных расходах.источник
Я пробовал множество решений, представленных здесь, но обнаружил, что большинство из них громоздкие и трудные в использовании, поэтому я создал свою небольшую среду тестирования: https://github.com/meonlol/t-bash
Это всего лишь один файл в репозитории, который вы можете просто запустить напрямую с базовым набором утверждений стиля JUnit.
Я профессионально использовал его в нескольких внутренних проектах и смог сделать наши сценарии bash сверхстабильными и устойчивыми к регрессу.
источник
Вы можете взглянуть на bash_unit:
https://github.com/pgrange/bash_unit
источник
Взгляните на Outthentic , это простой, расширяемый многими языками (Perl, Python, Ruby, Bash по выбору) и кросс-платформенный (Linux, Windows) фреймворк для тестирования любых приложений командной строки.
источник
Мне было трудно оправдать использование bash для более крупных скриптов, когда Python имеет такие огромные преимущества:
if [ x"$foo" = x"$bar"]; then ...
", который подвержен ошибкам.getopt
модуля (и есть еще более простой модуль для анализа аргументов, но имя ускользает от меня).mysql
команду в bash, но это не самый лучший способ писать код).$*
или"$*"
или"$@"
или$1
или"$1"
, пробелы в именах файлов не являются проблемой и т. Д. И т. Д. И т. Д.Теперь я использую bash только для самых простых скриптов.
источник
if [[ $foo = $bar ]]; then ...
. Это все еще не лучше, чем то, что может предложить python, но лучше, чем то, что вы представили.trap
(для очистки / отмены в случае ошибки), а также регулярное выражение (т.е.[[ $1 =~ ^[1-3]{3}$ ]]
). Я почти уверен, что использованный вами неясный синтаксис относится к старым реализациямtest
, а не к bash. Bash отлично подходит для взаимодействия с существующими инструментами командной строки ... Часто один канал дляawk
илиgrep
намного проще, чем альтернатива Python.optparse
или его преемникargparse
. Я никогда не видел, чтобы кто-то использовал этотgetopt
модуль, и не использовал его лично. Однакоgetopt
полезность отличная. Разбор аргумента из оболочки не проблема, если у вас есть хороший шаблон. Если вы не пытаетесь реализовать подкоманды в стиле git или что-то в этом роде, это не составит большого труда.