Ondřej Beránek, 28. 2. 2024
Pro zjednodušení vývoje používáme několik interních nástrojů pro zjednodušení, jak šly roky přibývalo funkcí a to vše vyrcholilo "verzí 2" a vznikl modulární nástroj založený na sdílených funkcích. Jak se začaly funkce recyklovat příšlo co muselo, klesala jistota že vylepšení v dobré víře "něco" rozbije. Tím jsme se dostali na pole regresních testů.
Stáhneme samotný BATS a rozšíření umožňující nám používat asserty
git clone https://github.com/bats-core/bats-support.git tests/bats-support git clone https://github.com/bats-core/bats-assert.git tests/bats-assert
a hotovo, můžeme něco otestovat.
Pro lepší představu jsem udělal test, který demonstruje pár fajn vlastností.
setup()
a teardown()
je pár funkcí, které se zavolají před spuštěním každého testu (setup) a po ukončení každého testu (teardown) s tím je potřeba počítat.
run
- testovaný příkaz, jeho výstup je potlačen, ale BATS si ho pamatuje a použije ho v dalším testování. Pokud v testu doje k chybe je vložen do proměnné ${output}
a vypsán.
assert_success
a assert_failure
jde o nejpoužívanější asserty, které kontrolují s jakým exitcode skončila poslední operace vyhodnocená pomocí run.
assert_output
porovná zda byl na výstupu očekávaný text, doplněný parametrem --partial jde hledat jen část textu
#!/usr/bin/env bats load "tests/bats-support/load" load "tests/bats-assert/load" setup() { set testvalue="foo" } teardown() { unset testvalue } @test "test the test is testing" { run echo "Hello, World!" assert_success assert_output "Hello, World!" run echo "Hello...!" assert_output --partial "Hello" }
Spuštění není složité, parametr --verbose-run
zařídil že pokud dojde k chybě dozvíme se stdout a obsah proměnné ${result}
která obsahuje exitcode
nekdo@nekde$ bin/bats --verbose-run test/pokus.bats pokus.bats ✓ test the test is testing 1 test, 0 failures nekdo@nekde$
Pro úplnost: příklad vypíše do stdout (který nevidíme) Hello World!
, zkontroluje zda echo neselhalo, dále se podívá zda se do výstupu dostal celý testovací text. Druhá část testu pak už jen kontroluje zda je v stdout aspoň text Hello
.