Programujeme letenky

Vývojáři GOL IBE v C.E.E. Group Travelport
Programátorský web
Background image - Futurama office park

Začínáme testovat v bats

Ondřej Beránek, 28. 2. 2024

Proč?

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ů.

Jak na to:

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.

Malý přehled příkazů - něco do začátku

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

Příklad testu

#!/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í, vyhodnocení

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.

Zdroje: