Test přes curl testuje něco jiného
Požadavek na počítadlo, který přijde bez identity prohlížeče, zapíše do dvou z dvanácti míst, kterých se započítaná návštěva normálně dotkne. Odpoví kódem 200. Vrátí platný obrázek počítadla. Nikde nic neříká, že deset z dvanácti bylo přeskočeno.
K čemu filtr je a co stojí
Počítadla tady oddělují roboty od lidí, a to podle identity, kterou o sobě uvádí klient. Seznam značek je krátký a záměrně jednoznačný a curl/ na něm je. Stejně tak prázdná identita, s odůvodněním, že požadavek úplně bez user agenta není prohlížeč.
Obojí je správně. Služba nechybuje, když holý curl bere jako robota; tím skutečně je. Problém je, že člověk, který curl ovládá, obvykle netestuje, zda funguje rozpoznávání robotů. Testuje, zda funguje počítání, a potichu si vyžádal cestu pro roboty.
Co dostane: denní součet přístupů vzroste o jedna, sloupec botů vzroste o jedna, a to je vše. Žádný řádek unikátního návštěvníka, takže nic o návštěvnících. Žádný záznam v seznamu online. Žádná stránka, žádná země, žádný prohlížeč, žádný operační systém, žádné zařízení, žádná hodina. Části systému, které by kdokoli skutečně chtěl zkontrolovat, jsou právě ty, které neproběhly.
Selhání nemá žádný příznak
U toho stojí za to se zastavit. Test, který nic neměří, se obvykle prozradí: chybou, prázdným výsledkem, nulou tam, kde má být číslo. Tady je odpověď 200. Tělo je skutečný obrázek počítadla, celých 3 361 bajtů. Číslo na obrázku dokonce vzrostlo, protože součet přístupů je jednou ze dvou věcí, které proběhly.
Zkouška tedy vypadá jako úspěch. Všechno, co z ní plyne — „cesta počítání funguje“, „nový sloupec se zapisuje“, „změna nic nerozbila“ — je závěr vyvozený z běhu, který přeskočil většinu kódu, jejž měl prověřit.
Stalo se to při psaní tohoto článku
První verze měření, na kterém tento článek stojí, volala /c/<number>. To není adresa obrázku počítadla; ta skutečná obsahuje design a příponu, /c/<number>-<design>.png. Požadavek vrátil 404.
Skript třikrát vypsal: zapisuje do 0 z 12 míst. Což je pravda, a zároveň přesně tak by na první pohled vypadal fungující filtr botů. Kód 404 byl ve výstupu, ve stejné tabulce, o řádek výš nad nulami. Minutu zůstal nepřečtený, protože nuly byly ta zajímavá část a odpovídaly očekávání.
To je tatáž chyba jako ta, o které je tento článek, jen o úroveň výš: měření, které dalo věrohodnou odpověď z důvodu, který nikdo neověřil. Přišlo se na to jen proto, že skript počítal řádky ve dvanácti tabulkách, místo aby věřil požadavku — požadavek, který selže, a požadavek, který je odfiltrován, vypadají zvenku stejně.
Co dělat místo toho
Pošlete identitu prohlížeče. Jeden přepínač, -A se skutečným řetězcem user agenta, a tentýž požadavek zapíše do deseti z dvanácti míst místo do dvou.
A spočítejte něco na druhé straně. Kód odpovědi říká, že požadavek dorazil; neříká nic o tom, co požadavek udělal. U všeho, kde jde o vedlejší účinek — počítadlo, fronta, řádek v logu, řádek někde v tabulce — se zkouška musí podívat na ten vedlejší účinek. Počty před a po napříč všemi dotčenými tabulkami tu zabraly dvacet řádků a dvakrát proměnily nejednoznačný výsledek v jednoznačný: jednou u filtru, jednou u 404.
Dvě z dvanácti míst zůstala prázdná i s identitou prohlížeče: sloupec botů, správně, a seznam odkazujících stránek, který odeslanou odkazující stránku nezaznamenal. To druhé tu vysvětleno není, protože se to zatím nedohledalo. Uvádí se to proto, že alternativou by bylo zveřejnit tabulku s jedenácti řádky a tvrdit, že jich je dvanáct.