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

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

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

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

Ответы [ 14 ]

1 голос
/ 12 июня 2019

Не могу поверить, что никто не говорил о ОШТ ! Он совместим с и TAP и JUnit, это чистая оболочка (то есть никакие другие языки не задействованы), он также работает автономно, и он простой и прямой.

Тестирование выглядит следующим образом (фрагменты взяты со страницы проекта):

#!/bin/bash
. osht.sh

# Optionally, indicate number of tests to safeguard against abnormal exits
PLAN 13

# Comparing stuff
IS $(whoami) != root
var="foobar"
IS "$var" =~ foo
ISNT "$var" == foo

# test(1)-based tests
OK -f /etc/passwd
NOK -w /etc/passwd

# Running stuff
# Check exit code
RUNS true
NRUNS false

# Check stdio/stdout/stderr
RUNS echo -e 'foo\nbar\nbaz'
GREP bar
OGREP bar
NEGREP . # verify empty

# diff output
DIFF <<EOF
foo
bar
baz
EOF

# TODO and SKIP
TODO RUNS false
SKIP test $(uname -s) == Darwin

Простой прогон:

$ bash test.sh
1..13
ok 1 - IS $(whoami) != root
ok 2 - IS "$var" =~ foo
ok 3 - ISNT "$var" == foo
ok 4 - OK -f /etc/passwd
ok 5 - NOK -w /etc/passwd
ok 6 - RUNS true
ok 7 - NRUNS false
ok 8 - RUNS echo -e 'foo\nbar\nbaz'
ok 9 - GREP bar
ok 10 - OGREP bar
ok 11 - NEGREP . # verify empty
ok 12 - DIFF <<EOF
not ok 13 - TODO RUNS false # TODO Test Know to fail

Последний тест показывает как "не в порядке", но код выхода равен 0, потому что это TODO. Можно установить и многословно:

$ OSHT_VERBOSE=1 bash test.sh # Or -v
1..13
# dcsobral \!= root
ok 1 - IS $(whoami) != root
# foobar =\~ foo
ok 2 - IS "$var" =~ foo
# \! foobar == foo
ok 3 - ISNT "$var" == foo
# test -f /etc/passwd
ok 4 - OK -f /etc/passwd
# test \! -w /etc/passwd
ok 5 - NOK -w /etc/passwd
# RUNNING: true
# STATUS: 0
# STDIO <<EOM
# EOM
ok 6 - RUNS true
# RUNNING: false
# STATUS: 1
# STDIO <<EOM
# EOM
ok 7 - NRUNS false
# RUNNING: echo -e foo\\nbar\\nbaz
# STATUS: 0
# STDIO <<EOM
# foo
# bar
# baz
# EOM
ok 8 - RUNS echo -e 'foo\nbar\nbaz'
# grep -q bar
ok 9 - GREP bar
# grep -q bar
ok 10 - OGREP bar
# \! grep -q .
ok 11 - NEGREP . # verify empty
ok 12 - DIFF <<EOF
# RUNNING: false
# STATUS: 1
# STDIO <<EOM
# EOM
not ok 13 - TODO RUNS false # TODO Test Know to fail

Переименуйте его, чтобы использовать расширение .t, и поместите его в подкаталог t, и вы можете использовать prove(1) (часть Perl) для его запуска:

$ prove
t/test.t .. ok
All tests successful.
Files=1, Tests=13,  0 wallclock secs ( 0.03 usr  0.01 sys +  0.11 cusr  0.16 csys =  0.31 CPU)
Result: PASS

Установите OSHT_JUNIT или передайте -j, чтобы получить вывод JUnit. JUnit также можно комбинировать с prove(1).

Я использовал эту библиотеку как для тестирования функций, получая их файлы, так и запуская утверждения с IS / OK и их негативами, а также сценарии с использованием RUN / NRUN. Для меня эта структура обеспечивает наибольшую выгоду для наименьших накладных расходов.

0 голосов
/ 28 сентября 2018

Взгляните на Outthentic , он простой, расширяемый многими языками (Perl, Python, Ruby, Bash на выбор) и кроссплатформенной (Linux, Windows) средой для тестирования любых приложений командной строки.

0 голосов
/ 04 апреля 2016

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

https://github.com/pgrange/bash_unit

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

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

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

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

...