Я и подумать не мог, что для bash существует фреймворк для написания юнит тестов. Но недавно в одном проекте увидел и, честно говоря поплыл. Начал разбираться, что за странные конструкции в скриптах и по итогу вышел на фреймворк который называется bashunit.



С одной стороны это удивительно и какое-то безумие, ну а с другой если в скрипте есть логика, почему бы не покрыть ее автотестами.



Bashunit это минималистичная библиотека тестирования Bash. Тестируйте свои bash-скрипты самым быстрым и простым способом.



Давай посмотрим как это работает и напишем первый тест:



Устанавливаем:



curl -s https://bashunit.typeddevs.com/install.sh | bash

ln ~/lib/bashunit /usr/local/sbin/bashunit



Все это добро залетит в папку: ~/lib/bashunit. Ну и симлинк сделаем для удобства. Если посмотреть исходник bashunit, то увидим что, оно тоже написано на bash. Bash тестирует bash, красиво.



Кто не знал, символ ~ означает домашнюю директорию текущего пользователя. А то сейчас начнешь искать, куда же эта тварь установилась.



Теперь создаем папку где будем складывать тесты: mkdir ~/tests. В этой папке создаем файл first_test.sh и закидываем в него такой код:



#!/bin/bash



var="hello"



function test_var_equals_hello() {

assert_equals "hello" $var

}



Запускаем:



cd ~/

bashunit ./tests



Получаем результат теста: All tests passed



bashunit - 0.8.0

Running first_test.sh

✓ Passed: Var equals hello



Tests: 1 passed, 1 total

Assertions: 1 passed, 1 total

All tests passed

Time taken: 133 ms



Assert_equals принимает 2 параметра, первый = ожидаемый результат, второй = фактический результат.



Получается такое: Переменная var у меня равна «hello», ожидаемый результат в тесте тоже «hello». Происходит сравнение и успешное завершение. Но если поменять значение var на что-то другое, то получим ошибку.



bashunit - 0.8.0

Running first_test.sh

✗ Failed: Var equals hello

Expected 'hello'

but got 'fuck'



Tests: 1 failed, 1 total

Assertions: 1 failed, 1 total

Some tests failed

Time taken: 128 ms



Помимо assert_equals, есть куча других методов проверки: assert_contains, assert_empty, assert_matches, assert_exit_code, assert_array_contains, assert_successful_code, assert_general_error, assert_command_not_found, assert_file_exists, assert_is_file и т.п.



Весь список можешь посмотреть в официальной документации с наглядными примерами.



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



Если ты девопс и делаешь какое-нибудь тестовое задание связанное с написанием скриптов. Добавь автотесты и твои шансы получить оффер намного повысятся. Техдиры такое любят. Сразу видно, что человек следует бест-практикам и работает на результат, а не за деньги 📺



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



💩 Официальный сайт фреймворка

🐱 Страница проекта на github

🐱 Старенькая альтернатива shunit2



Увидимся!



tags: #linux #bash #qa



💩 @bashdays