Лучший способ тестирования инструментов командной строки?

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

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

Это UNIX

Ответы

Ответ 1

Aruba - это расширение Cucumber для тестирования приложений командной строки, написанных на любом языке программирования.

Чтобы использовать его, вам понадобится ruby для запуска тестов, но цель aruba - предоставить библиотеку предопределенных определений шагов, чтобы вам не нужно было писать какой-либо код ruby для создания работоспособного набора тестов. (Хотя в какой-то момент вы, вероятно, захотите написать немного рубина, чтобы сделать несколько пользовательских шагов.)

Вы можете увидеть сложный пример инструмента командной строки, протестированного на aruba, здесь: jingweno/gh

Ответ 2

Я рекомендую структурировать код инструмента командной строки, чтобы утилита командной строки была клиентом библиотеки функций и/или классов.

Вместо того, чтобы просто использовать std:: cout для вывода на печать, имейте, чтобы функция библиотек взяла ссылку на ostream, которая по умолчанию соответствует std:: cout. Когда вы тестируете, укажите std:: stringstream для сбора результата.

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

(Я прошу прощения за конкретный пример на С++... Я уверен, что есть способы делать подобные вещи и на других языках).

Ответ 3

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

Ответ 4

Вы должны иметь возможность вызывать их из оболочки script (пакетный файл, в операционных системах MS), перенаправлять вывод в файл, затем программно сканировать файл, чтобы убедиться, что он имеет правильный вывод. Я не знаю рамки тестирования, которая автоматизирует это для вас, но она должна быть достаточно простой, чтобы настроить ее самостоятельно.

Ответ 5

Я немного поработал с этим (loooong time hehe), используя Expect, чтобы проверить, что произошло, что я, umm, ожидается

Ответ 6

Летучие мыши (Bash Автоматизированная система тестирования) от Сэма Стивенсона. Он крошечный, написанный исключительно в оболочке и имеющий хороший набор функций.

Раньше предполагаемая Аруба выглядела интересной, но в некоторых случаях это могло бы быть спокойным излишеством с точки зрения зависимостей (рубин, огурец)

Ответ 7

Вы можете сделать это из командного файла или другого сервера сценариев Windows.

Но я обещаю использовать планировщик задач, например (http://www.splinterware.com/products/wincron.htm) или другое бесплатное/профессиональное программное обеспечение.

Там вы можете легко скопировать/вставить параметры командной строки, которые вы должны изменить, когда вы хотите проверить свое программное обеспечение примерно на 100 раз?!

Ответ 8

Вы можете использовать perl с библиотекой Test:: more, которая предоставляет отличную инфраструктуру для тестирования CLI. Хотя в основном это предназначено для модульного тестирования, вы можете расширить его, чтобы протестировать рабочие процессы пользователей.

Некоторые из методов:

 # Various ways to say "ok"
  ok($got eq $expected, $test_name);
  is  ($got, $expected, $test_name);
  isnt($got, $expected, $test_name);

  # Rather than print STDERR "# here what went wrong\n"
  diag("here what went wrong");

  like  ($got, qr/expected/, $test_name);
  unlike($got, qr/expected/, $test_name);

  cmp_ok($got, '==', $expected, $test_name);

Ответ 9

Я разработал инструмент "Точно" https://github.com/emilkarlen/exactly

Это выполняет вещь, чтобы проверить во временном каталоге песочницы. README содержит ряд примеров.

Тест гипотетической программы "классифицировать файлы путем перемещения в соответствующий каталог" может выглядеть следующим образом:

[setup]

dir input
dir output/good
dir output/bad

file input/a.txt = <<EOF
GOOD contents
EOF

file input/b.txt = <<EOF
bad contents
EOF

[act]

classify-files-by-moving-to-appropriate-dir GOOD input/ output/

[assert]

dir-contents input empty

exists output/good/a.txt : type file
dir-contents output/good num-files == 1

exists output/bad/b.txt : type file
dir-contents output/bad num-files == 1