Як автоматизувати command-line інструменти?
Test Engineering NotesЗвичні інструменти для звичних задач
Проєкти та продукти бувають різними. То й тестувати та автоматизувати їх треба по-різному. Для деяких проєктів достатньо написати базові UI тести за допомогою Selenium WebDriver.
Для інших - потрібно спускатися трохи "нижче" - на рівень API. На цьому рівні також існує доволі багато інструментів та бібліотек: від HTTP Client та requests, до RestAssured.
Але час від часу з'являються досить незвичні задачі. Задачі, для яких не існує загальноприйнятих інструментів. До того ж - пошук в Google не дає дуже багато інформації.
Тому сьогодні пропоную до Вашої уваги коротку історію моїх пошуків. Пошуків інструментів для тестування незвичних програм - command-line утиліт.

У пошуках "чарівної пігулки"
Один з варіантів продукту, що ми розробляємо та релізимо - це command-line обгортка над API. Вона дозволяє спробувати базові можливості продукту (а також дуже допомагає у проведенні швидких демо для клієнтів).
Тож для того, щоб бути впевненими, що ця утиліта працює так, як потрібно - її потрібно тестувати. А в ідеалі - автоматизувати базові скрипти.
То ж я почав пошук інструментів для таких утиліт.
Що дали перші пошуки:
- Cucumber Aruba. Виявляється у Cucumber`а був свій інструмент для тестування утиліт командної стрічки. Але не підтримувався він вже декілька років.
- bats. Доволі непоганий інструмент для простого тестування. Єдиний мінус - репозиторій вже давно покинутий.
- expect. Трохи більше, ніж bats.
- tush. Ще більш "старіший" інструмент. Останні комміти були років вісім тому...
- Приклад тестів від підписника. Написані на Bash.
- На Rust також існують свої бібліотеки. Але, нажаль, я не пишу на ньому)
- Також є трохи інформації, як тестувати такі утиліти на Node.js та на JS. Але це більше на рівні модульних тестів.
Поверхневий пошук привів мене до застарілих інструментів та декількох статей на різних мовах програмування. Я не знайшов чогось популярного та сучасного, як стильні та модні бібліотеки для автоматизації UI та API.
Просте рішення
Після невдалих спроб знайти готове рішення, я написав своє - на Scala. Воно не універсальне. Але для базових перевірок воно підходить мені повністю.

Все, що потрібно зробити, це додати вашу утиліту в src/test/resources, додати пакет scaдa.sys.process та розрулити місце, з якого ви запускаєте ці тести (pwd).
Метод !! отримує результат роботи команди, який потім можна перевіряти в цілому чи парсити на окремі значення.
У метод run ми передаємо команду, яку хочемо виконати разом із набором параметрів.

То ж не завжди потрібні громіздкі інструменти для простих задач.