Сценарии сценариев установки

У нас есть система с несколькими скриптами bash, помимо Java-кода. Поскольку мы пытаемся протестировать все, что может быть возможно разбито, и эти сценарии bash могут сломаться, мы хотим их протестировать.

Проблема в том, что тестирование скриптов bash сложно.

Есть ли способ или лучшая практика для тестирования сценариев bash? Или мы должны отказаться от использования сценариев bash и искать альтернативные решения, которые можно проверить?

На самом деле существует единая структура тестирования сценариев оболочки . Я не использовал его сам, но, возможно, стоит проверить.

Аналогичные вопросы задавали раньше:

  • Тестирование модhive для сценариев оболочки
  • Протокол Test Anything в сценариях оболочки

Я получил следующий ответ от дискуссионной группы:

можно импортировать (включая, независимо) процедуру (функцию, независимо от ее имени) из внешнего файла. Это ключ к написанию сценария тестирования: вы разбиваете свой скрипт на независимые процедуры, которые затем могут быть импортированы как в исполняемый скрипт, так и в ваш тестовый скрипт, а затем ваш сценарий запуска будет как можно более простым.

Этот метод похож на инъекцию зависимостей для скриптов и звучит разумно. Предпочтительнее избегать сценариев bash и использовать более тестируемый и менее неясный язык.

TAP- совместимое тестирование Bash : автоматизированная тестовая система Bash

летучие мыши-жильный

Почему вы говорите, что «сложно» тестировать скрипты bash?

Что не так с пробными обертками, как:

#!/bin/bash set -e errors=0 results=$($script_under_test $args<&1 let errors+=1 } echo "$results" | grep -q $expected1 || { echo "Test Failed. Expected $expected1" let errors+=1 } # and so on, et cetera, ad infinitum, ad nauseum [ "$errors" -gt 0 ] && { echo "There were $errors errors found" exit 1 } 

Epoxy – это тестовая среда Bash, разработанная в основном для тестирования другого программного обеспечения, но я использую ее для тестирования модhive bash, включая себя и Carton .

Основными преимуществами являются относительно низкие накладные расходы на кодирование, неограниченное вложение вложения и гибкий выбор утверждений для проверки.

Я сделал презентацию, сравнивая ее с BeakerLib – структурой, используемой некоторыми в Red Hat.

Попробуйте bashtest . Это простой способ проверить ваши скрипты. Например, у вас есть do-some-work.sh которые меняют некоторые файлы конфигурации. Например, добавьте новую строку PASSWORD = 'XXXXX' в файл конфигурации /etc/my.cfg .

Вы пишете команды bash по строкам, а затем проверяете вывод.

Установка:

 pip3 install bashtest 

Создать тесты – это просто написать команды bash.

Файл test-do-some-work.bashtest :

 # run the script $ ./do-some-work.sh > /dev/null # testing that the line "PASSWORD = 'XXXXX'" is in the file /etc/my.cfg $ grep -Fxq "PASSWORD = 'XXXXX'" /etc/my.cfg && echo "YES" YES 

Выполнить тесты:

 bashtest *.bashtest 

Вы можете найти несколько примеров здесь и здесь

Возможно, это может быть использовано или

https://thorsteinssonh.github.io/bash_test_tools/

Предназначен для записи результатов в TAP-протоколе, который, как я полагаю, хорош для CI, и хорош для тех, кто хочет оболочки оболочки. Я предполагаю, что некоторые вещи выполняются в средах оболочек, поэтому некоторые могут утверждать, что они должны быть протестированы в среде оболочки.

Попробуйте утверждать.sh

 source "./assert.sh" local expected actual expected="Hello" actual="World!" assert_eq "$expected" "$actual" "not equivalent!" # => x Hello == World :: not equivalent! 

Надеюсь, поможет!

Никита Соболев написал превосходное сообщение в блоге, сравнивающее несколько различных тестовых рамок bash: Тестирование приложений Bash

Для нетерпения: вывод Никиты заключался в том, чтобы использовать Bats, но похоже, что Никита пропустил проект Bats-core, который, как мне кажется, будет использоваться в будущем, поскольку оригинальный проект Bats не активно поддерживается с 2013 года.

Мне очень нравится shell2junit , утилита для генерации JUnit-подобного вывода из тестов скриптов Bash. Это полезно, потому что созданный отчет затем может быть прочитан системами непрерывной интеграции, такими как плагины JUnit для Jenkins и Bamboo.

В то время как shell2junit не предоставляет всеобъемлющую структуру сценариев Bash, такую ​​как shunit2 , она позволяет вам получать отчеты о результатах тестирования.

Вы можете взглянуть на bash_unit:

https://github.com/pgrange/bash_unit

Мне было трудно обосновать использование bash для больших скриптов, когда Python обладает такими огромными преимуществами:

  • Try / Except позволяет записывать более надежные скрипты с возможностью отмены изменений в случае ошибки.
  • Вам не нужно использовать неясный синтаксис, например « if [ x"$foo" = x"$bar"]; then ... if [ x"$foo" = x"$bar"]; then ... », который подвержен ошибкам.
  • Легкий анализ параметров и аргументов с использованием модуля getopt (и есть еще более простой модуль для анализа аргументов, но имя ускользает от меня).
  • Python позволяет работать со списками / dicts и объектами вместо базовых строк и массивов.
  • Доступ к надлежащим языковым инструментам, таким как регулярное выражение, базы данных (обязательно вы можете передать все в команду mysql в bash, но это не самый приятный способ писать код).
  • Не нужно беспокоиться об использовании правильной формы $* или "$*" или "[email protected]" или $1 или "$1" , пробелы в именах файлов не являются проблемой и т. Д. И т. Д. И т. Д.

Теперь я использую bash только для самых простых скриптов.

Interesting Posts

Порт переадресации портов UDP не работает

Настройка источника данных JNDI в jUnit

Как я могу открыть приложение панели управления приложениями WinXP на вкладке «Стандартная» по умолчанию?

Скрытие ярлыка панели задач только для конкретных приложений

Symfony2 – Как получить доступ к именам динамических переменных в веточке

Как преобразовать объект String в Boolean Object?

Почему моя VPN не будет подключаться?

Существует ли алгоритм сортировки по целому числу O (n)?

Случайное число, но не повторять

Компьютер загружается на черный экран PXE, затем сообщает «нет загрузочного устройства»,

Как я могу установить док-станцию ​​OS X, чтобы показывать мгновенно, а не ждать половину секунды в Snow Leopard?

Как включить настраиваемые местоположения для индексирования в поиск в меню «Пуск»?

Изменить расположение узла node_modules

Является ли * b * регулярным?

Можно ли одновременно выбирать и загружать несколько файлов в Internet Explorer?

Давайте будем гением компьютера.