Модульное тестирование скриптов bash - PullRequest
95 голосов
/ 27 августа 2009

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

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

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

Ответы [ 14 ]

43 голосов
/ 27 августа 2009

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

Подобные вопросы задавались ранее:

25 голосов
/ 01 сентября 2009

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

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

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

23 голосов
/ 02 ноября 2012

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

TAP, протокол Test Anything, представляет собой простой текстовый интерфейс между модулями тестирования в тестовом жгуте. TAP начал свою жизнь как часть тестового набора для Perl, но теперь имеет реализации на C, C ++, Python, PHP, Perl, Java, JavaScript и других.

7 голосов
/ 28 сентября 2013

Epoxy - это среда тестирования Bash, разработанная в основном для тестирования другого программного обеспечения, но я также использую ее для тестирования модулей Bash, включая сам и картон .

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

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

6 голосов
/ 27 августа 2009

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

Что не так с тестовыми упаковщиками, такими как:

 #!/bin/bash
 set -e
 errors=0
 results=$($script_under_test $args<<ENDTSTDATA
 # inputs
 # go
 # here
 #
 ENDTSTDATA
 )
 [ "$?" -ne 0 ] || {
     echo "Test returned error code $?" 2>&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
 }
5 голосов
/ 14 марта 2018

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

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

3 голосов
/ 06 мая 2017

Попробуйте assert.sh

source "./assert.sh"

local expected actual
expected="Hello"
actual="World!"
assert_eq "$expected" "$actual" "not equivalent!"
# => x Hello == World :: not equivalent!

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

3 голосов
/ 05 августа 2016

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

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

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

3 голосов
/ 26 июля 2016

Попробуйте 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

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

3 голосов
/ 18 января 2014

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

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

...