Как написать код для тестирования в bash? - PullRequest
0 голосов
/ 05 февраля 2019

В универсуме ООП содержится информация о том, как разрабатывать и реорганизовывать код, чтобы сделать его модульным для тестирования.Но мне интересно, как применить / перевести эти принципы / практики (сделать издевательство проще и т. Д.) В сценарии оболочки, что, очевидно, является другим программированием.

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

КакРеорганизовать код оболочки (или спроектировать его в начале), чтобы иметь возможность создавать «хорошие» автоматизированные модульные тесты с такой средой, как летучие мыши и плагин-насмешник?

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Модульное тестирование предназначено для выявления ошибок в изолированном коде.Однако в типичном коде оболочки преобладают взаимодействия с другими исполняемыми файлами или операционной системой.Тип проблем, связанных с взаимодействиями в шелл-коде, имеет следующий характер: я называю правильные исполняемые файлы в правильном порядке с аргументами в правильном порядке с правильно отформатированными значениями аргументов, и это выходные данные в той форме, в которой я их ожидаюбыть и т. д. Чтобы протестировать все это, вы не должны применять модульное тестирование, а вместо этого использовать интеграционное тестирование.

Однако, существует шелл-код, который подходит для модульного тестирования.Это, например, код, выполняющий вычисления внутри оболочки, или манипуляции со строками.Я бы даже рассмотрел шелл-код с вызовами некоторых фундаментальных инструментов, таких как basename, как подходящий для модульного тестирования (интерпретируя такие инструменты как часть «стандартной библиотеки», если хотите).

Как сделать этичасти кода в оболочке, которые подходят для модульного тестирования, на самом деле тестируются с модульным тестированием?Один из самых полезных подходов в моем опыте - отделить взаимодействия от вычислений.То есть попробуйте поместить вычислительные части в отдельные функции оболочки, которые нужно протестировать, или выделите части с доминированием взаимодействия в отдельных функциях оболочки.Это избавляет вас от насмешек.

0 голосов
/ 05 февраля 2019

Хороший вопрос!

ИМХО сценарии оболочки часто просто вызывают другие программы, чтобы выполнить работу, например cp, mv, tar, rsync, ... даже для выражений, которые использует bashдвоичный файл test, если вы используете [и] (например, if [ -f $file ]; then; fi).

Имея это в виду, подумайте о том, что действительно происходит только в скрипте bash: Callэта программа с тремя аргументами.Таким образом, вы могли бы написать модульные тесты, которые проверяют, вызывает ли скрипт bash нужную программу и используют ли правильные аргументы, и проверяют возвращаемые значения / коды выхода из программы.

Вы определенно не хотите помещатьвещи в модульных тестах для вашего сценария оболочки, которые эффективно выполняются другой программой (например, проверьте, действительно ли rsync скопировали файлы с компьютера A на компьютер B).

Просто мои два цента

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