Testovací denní chléb
Test-first praktikuju (zatím?) jen výjimečně, ale na psaní testů jsem si už hodně zvykl. Došlo to tak daleko, že se mi jednou zdál sen, ve kterém jsem si něco koupil v krámě a ačkoliv to šlo celkem hladce, chtěl jsem poté napsat test, protože člověk nikdy neví a co když v tom postupu budu dělat změny, že. Ehm. Lakavá představa, že?
Tak tento odstavec už čtou jen opravdoví zájemci, takže můžu přejít k věci. Skoro před rokem se tu objevil článek o testovacích nástrojích. Není ale specificky pro RoR a navíc mám další zajímavosti, takže bych rád zmínil pár tipů na zjednodušení práce při psaní testů.
Základem je již několikrát zmiňovaný rcov, který vám najde řádky kódu, které nebyly testy vůbec spuštěny. Jeho rozchození se s instalací Heckle srovnávat nedá, stačí:
sudo gem install rcovGenerování statistiky pokrytí pak spustíte takovýmto příkazem zadaném v kořenovém adresáři aplikace:
rcov test/**/*rbTo vám vytvoří adresář coverage obsahují HTML soubory zobrazující pokrytí jednotlivých zdrojových souborů. Dobrým začátkem je (jak překvapivé) coverage/index.html obsahujicí přehled celého projektu.
Jak vypadá výstup pro jeden soubor se můžete podívat zde Je dobré si uvědomit, co vlastně znamená, že se některý z řádků zobrazí zeleně. Znamená to, že byl testem spuštěn, což je sice příjemné, ale nezaručuje to, že test opravdu správně testuje funkcionalitu programu. Mějme takovouto metodu:
def deposit(amount)
if amount < 0
raise 'eh?'
else
@balance += amount / 2
transfer_money_to_my_account(amount / 2)
end
end
a takovéto testy:
def test_deposit_negative_amount_raises_error
assert_raise(RuntimeError) {@account.deposit(-1)}
end
def test_deposit_amount_is_successful
assert_nothing_raised { @account.deposit(2) }
assert @account.balance > 0
end
Pokrytí kódu testy bude v tomto případě 100 %, ale je vidět, že ke štěstí zákeřného programátora nejsou testy úplné. Jinými slovy, pokud vám něco rcov označí červeně, je to zaručeně špatně. Pokud je to zelené, fajn, minimálně to odchytí překlepy a vyhozené výjimky, ale o kvalitě testů to neříká až tak mnoho. Nakonec se bavíme o POKRYTÍ, že?
Nemám rád dlouhé příspěvky (porucha soustředění), tak jimi ani nebudu tento svět zaplňovat. Pokračování příště.