Co to znamená
majordomus evidence record --crate-output <file> čte, co vytiskl cargo test, a zaznamenává jedno provedení na každou binárku integračních testů pod tests/. Zaznamenává to, co běh této binárky uvedl, a nic víc:
- binárka, jejíž řádek s výsledkem započítává neúspěšný test, je
fail, ať řádek začíná jakýmkoli slovem; - binárka, která neprošla nic, protože všechny testy byly ignorovány nebo žádné nebyly, je
skip; - binární soubor, který filtr jmen zúžil na podmnožinu, je
skip, kolik z té podmnožiny ani prošlo, protože to není důkaz onoho binárního souboru; - binárka, jejíž výsledkový řádek nenese počet nebo před další binárkou nevypsala výsledkový řádek vůbec, je
error: harness nedokázal říct, co běželo; - jen binárka, která spustila celou svou sadu a žádný test nevyřadila jako selhání, je
pass.
Přeskočení se čte jako not_run s podrobností, že test odmítl běžet, a chyba se čte jako failing s podrobností, že ho harness nedokázal spustit, takže ani jedno nemůže vznést tvrzení proven.
Co ve výstupu bylo a žádné tvrzení to zatím nedokáže pojmenovat, se neignoruje. Vlastní binárka unit testů crate, jeho doctesty, binárka mimo tests/ a řádek s výsledkem, který nepojmenoval žádný řádek Running, jsou každý uvedeny v seznamu dropped záznamu, s reportem, z něhož pocházejí, a s důvodem, a žádný z nich se nepřipisuje binárce vedle něj.
Princip
evidence::read_crate_output v apps/majordomus-cli/src/evidence/record.rs nejprve odstraní z každého řádku terminálové escape sekvence, takže barevný a prostý běh jsou stejný text. Řádek Running tests/<name>.rs otevírá binárku; řádek Running unittests <path>, řádek Doc-tests <crate> nebo řádek Running pojmenovávající jinou cestu otevírá položku, která bude vypsána, ne zaznamenána. Další řádek test result: uzavře vše, co je otevřeno.
Řádek s výsledkem se čte podle svých počtů: prošlo, selhalo, ignorováno a odfiltrováno, každý nepovinný. Rozhoduje první pravidlo, které platí: počet selhání nebo slovo FAILED je selhání; slovo ok bez počtu prošlých je chyba; ok bez prošlých nebo s čímkoli odfiltrovaným je přeskočení; ok jinak je úspěch; jakékoli jiné slovo je chyba. Binárka, která je ještě otevřená, když dorazí další binárka, doctesty nebo konec výstupu, nedostala výsledkový řádek a je chybou.
Vynechané položky jsou hodnoty EvidenceDropped (producer, what, reason) s producentem crate. evidence record je vrací jako dropped ve svém výstupu JSON a v textovém výstupu vypíše po jednom řádku dropped. Záznam samotné zprávy sady nevypíše nic a jeho výstup se nemění.
Jak to vidět
cargo test --manifest-path apps/majordomus-cli/Cargo.toml 2>&1 | tee crate.log
majordomus evidence record --crate-output crate.log
majordomus evidence record --crate-output crate.log --format json | jq '.dropped'
bash test/run.sh 506_a_crate_binary_that_ran_nothing_is_not_a_pass
Případ zapíše barevný výstup cargo test s binárkou unit testů, integračními binárkami, které prošly, neběžely vůbec, běžely jen filtrovanou podmnožinu, selhaly a nevypsaly žádný výsledek, a s doctesty. Ověřuje zaznamenaný výsledek každé binárky, seznam vynechaných v obou výstupních formátech a verdikt, ke kterému každý výsledek vede.
Co nepokrývá
Čte jeden výsledek na binární soubor. Které testy uvnitř binárního souboru prošly nebo selhaly, se nezaznamenává, takže tvrzení stále pojmenovává celý binární soubor; výsledky po jednotlivých testech jsou pozdější práce.
Binární soubor, jehož každý test je na stroji, který jej spustil, vyřazen při kompilaci, se čte jako přeskočení. To je pravda o onom stroji, ne vada: běh tam o něm nic nedokázal.
Unit testy a doctesty, které běžely, jsou vypsány, ne zaznamenány. Žádné tvrzení nemůže jmenovat žádný z nich, dokud je runner nezaznamená jeden po druhém.
Proč existuje
Zapisovač četl výsledkový řádek začínající ok jako úspěch. Binárka, jejíž testy byly všechny ignorované, nebo běh zúžený na jeden test, vypsaly ok a zapsaly se jako důkaz binárky, takže tvrzení se mohlo číst proven na základě běhu, který nic neměřil. Čtení počtů to uzavírá a výpis toho, co zaznamenat nešlo, brání tomu, aby běh vypadal menší, než byl. ADR 0087 (proposed), rozhodnutí 6, formuluje pravidlo: zpráva uvádí jen to, co běželo.