„Teď jsem tam změnil jenom drobnost, to už přece musí fungovat.“ Tuhle větu slýchám od studentů často a místo víry by se jim hodil test. Přednáška na linuxové konferenci LinuxDays na ČVUT FIT proto ukazuje jednoduché automatizované testování, které může ve svém projektu použít každý, ať už testuje software v libovolném jazyce, nebo celé systémy. Bez učení se nějakého frameworku, jen s pár řádky v shellu a nástroji, které už v systému máte. Tentokrát na přednášku navazoval i workshop, kde si účastníci všechno prakticky vyzkoušeli.
Pomocí jednoduchých nástrojů a jejich kombinací v shellu snadno otestujete, že nová verze kódu nebo systému funguje alespoň stejně dobře jako ta předchozí, nebo že zrychlení programu nebylo na úkor funkčnosti. Pro nováčky na FIT je to zároveň ochutnávka a motivace pro předmět Unixové operační systémy (BI-UOS).
Přednášku můžete sledovat ze záznamu LinuxDays, workshop se nenahrával.
Hlavní myšlenky
- TDD je pro líné programátory. Nejdřív napíšu test, který (logicky) neprojde, pak jen tolik kódu, aby prošel, a teprve potom případně vylepšuji (red – green – refactor). Neřeší se, jestli by to šlo napsat elegantněji nebo robustněji: když to prochází testy, je to dobře.
- Psaní testů je vlastně návrh. Když si předem rozmyslím, v jakých situacích a jak má program fungovat, vyřeším spoustu problémů dřív, než vzniknou. Testy pak slouží jako minimum dokumentace rozhraní a dávají jistotu při každé další změně.
- Nic není zadarmo. Testy jsou další kód, který je potřeba udržovat, vyžadují disciplínu a často i testovací prostředí. A největší nebezpečí je falešný pocit bezpečí: kód je jen tak dobrý, jak dobré jsou testy.
- Testujte výsledek, ne postup. Když se testy dopisují až k hotové
implementaci, testují tu implementaci, a ne to, co se po programu chce.
Řetězí se pak do sebe a lžou. Test má ověřit, že na konci existuje adresář
a v něm soubor, ne jestli se cestou volal
mkdir,cdatouch. - Testy musí být nezávislé. Každý běh potřebuje čistý start: dočasný
adresář z
mktemp, úklid po sobě, nebo rovnou kontejner (podman), který navíc chrání vlastní systém i data před chybou ve vyvíjeném skriptu. - Pozor na zrádnosti shellu.
$?po koloně příkazů je návratový kód posledního z nich (pomůžePIPESTATUSnebopipefail),$( … )ořízne konce řádků a do proměnné se nevejde nulový bajt (pomůže třebabase64). - Začněte v malém. Pokud váš jazyk má vlastní testovací nástroje, používejte je. Vlastní testovátko na pár řádků se ale hodí ve chvíli, kdy nepoužíváte nic a nechcete se učit cizí syntaxi ani přizpůsobovat se filozofii nějakého nástroje. Prostě jen nechcete testovat ručně.
Obsah přednášky
Odkazy vedou na příslušný slide prezentace a čas ve videu, kde část začíná.
- Minimum teorie
00:02:14- Co je TDD
00:02:35 - Proč TDD
00:06:00 - Proč ne TDD
00:07:13 - Nebezpečí
00:09:24 - Způsoby práce (zevnitř ven a zvenku dovnitř)
00:10:18
- Co je TDD
- Co testovat
00:11:28- Návratový kód (
PIPESTATUS,pipefail)00:12:49 - Výstup (subshell, binární data)
00:17:04 - Proměnné
00:20:18 - Parametry
00:22:49 - Souborový systém (
stat,cat -A,od,strings,find)00:23:01 - Procesy a síť (
timeout)00:26:17
- Návratový kód (
- Jak testovat
00:27:01- Předávání parametrů
00:27:18 - Předávání vstupu (here-document, here-string)
00:29:03 - Vestavěné testy (
[,[[,(()00:30:26 - Externí testy a regulární výrazy (
grep)00:34:14 - Porovnání obsahu (
sha*sum,cmp,comm,diff)00:35:33
- Předávání parametrů
- Typické problémy
00:39:16- Navzájem závislé testy
00:41:12 - Nepořádek a úklid po testech (
mktemp)00:46:13 - Bezpečné prostředí vývoje a testů
00:47:55 - Kontejnerizace (
podman, image s běžným uživatelem)00:48:28
- Navzájem závislé testy
- Testovací framework
00:50:14 - Jak simulovat (mock: alias, funkce, skript, služba)
- Dotazy
00:50:51
testy v shellu vs. testovací nástroje vlastního jazyka, ShellSpec
Ani letos jsem nestihl všechno. Na testovací framework zbyla jen pozvánka na workshop, kde jsme si ho rovnou napsali, a kapitola o simulování okolí pomocí mocků zůstala jen ve slidech.
Workshop
Repozitář se skripty a daty k workshopu
Na workshopu jsme testovali různé verze softwaru v typických situacích a každý si napsal svůj vlastní primitivní testovací framework na pár řádků, který si posléze může na míru upravit pro vlastní projekt:
- Základní testy —
$?,test,cmp - White/black list —
grep,comm,diff - Test parametrů — vlastní framework
- Test souborů v kontejneru —
podman
Repozitář obsahuje jednotlivé kroky workshopu po kouscích (skripty, testy i data), takže si všechno můžete vyzkoušet i doma.