Rozumím. Ale chyba může vzniknout i při psaní testu. Vzhledem k tomu, jak často zoufale nečitelné mohou testy být - velmi snadno.
To je ovšem dané špatným způsobem psaní testů. Jednotkové testy mají testovat, zda pro „zajímavé“ vstupy dává kód očekávané výstupy. Není důvod, proč by takový test měl být nečitelný. V testu samozřejmě může být chyba, ale pak se na ní obvykle přijde při spouštění testů, protože test neprojde. Vzhledem k tomu, že je test napsaný úplně jiným způsobem, než testovaný kód, je velmi nepravděpodobné, že by v něm byla stejná algoritmická chyba (zejména když v testu žádný algoritmus nemá být). Samozřejmě je možné, že tam bude systematická chyba – test bude očekávat chybný výstup, protože programátor špatně pochopil zadání. Jenže pokud programátor špatně pochopil zadání, bude chyba v kódu vždy, i když bude mít sebelepší typový systém nebo jakýkoli jiný systém kontroly. Tam je jediná šance, že ten test bude psát někdo jiný, kdo zadání pochopí jinak – ale ani to není stoprocentní cesta k úspěchu, protože problém bývá velmi často v tom zadání, takže je dost pravděpodobné, že ho dva programátoři pochopí stejně špatně. A konečně zřejmě nejčastější důvod, proč test neodhalí chybu, je ten, že nepokrývá všechny zajímavé případy – takže chyba bude jednoduše v něčem, co se netestuje. I tenhle typ chyby se bude objevovat u sebelepšího typového systému, protože když programátora nenapadne, že to je zajímavý případ a měl by na to udělat test, nenapadne ho ani ošetřit to v typovém systému.
Jednou se mi stalo, že jsem našel chybu v kódu, který měl stoprocentní pokrytí testy. Byl to den, kdy jsem na coverage zanevřel.
Vy se neustále míjíte s podstatou problémů. Stoprocentní pokrytí kódu testy znamená, že se při testech projdou všechny „řádky“ (ve skutečnosti instrukce) programu. To samozřejmě v žádném případě neznamená, že jsou otestované všechny případy. Pokrytí kódu testy se používá opačně – když nemáte stoprocentní pokrytí kódu testy, máte takřka jistotu, že nepokrytý kód není otestován žádným způsobem. (Zbývá malá možnost, že nepokrytý kód je nedostupný, pak by ale stejně v kódu neměl být.) Takže pokud jste chybu v kódu, který měl stoprocentní pokrytí testy, našel jenom jednou, zažil jste toho zatím opravdu málo. Že jste na code coverage zanevřel po nalezení jediné chyby svědčí pouze a jen o nedostatku pokory, a to vás pak nezachrání sebelepší nástroje. Proto jsem vám už minule psal, že nemáte hledat stříbrnou kulku, která nějak mechanicky zajistí, že budete psát bezchybné programy (to je nemožné), a radši byste se měl snažit pochopit, k čemu slouží nástroje, které máte k dispozici, a správně je používat. Pak můžete dobrý kód psát i v Javě, v JavaScriptu nebo PHP.