Přeskočit na obsah

Tato stránka byla automaticky přeložena z angličtiny, jediného jazyka, ve kterém se tento web píše. Číst originál.

Zaznamenání výsledku jednoho testu nikdy nesmaže důkazy zaznamenané pro jiný test

Ledger se slučuje po testech, nepřepisuje se po bězích. Záznam nahradí položku pro

deklarovaný stavdeklarovaný stav: zaručeno Deklarováno jako deterministické a blokující, implementováno a s uvedeným behaviorálním testem, který to má dokázat. Zda to zaznamenaný běh podporuje, říká verdikt důkazů zobrazený vedle.

zaznamenané důkazyzaznamenané důkazy: zastaralé Deklarováno jako zaručené, ale nepodložené zaznamenaným během: test je pojmenován, ale žádný úspěšný běh nad současnými vstupy zaznamenán není. jak se zaznamenávají důkazy

Účetní kniha se slučuje po testech, nepřepisuje se po bězích, takže `bash test/run.sh 84_distribution_model` následované záznamem aktualizuje přesně tuto jednu položku. Zápis celé knihy by z běhu jednoho případu udělal repozitář, který prokázal jedinou věc, což je horší než repozitář, který neprokázal nic, protože to vypadá záměrně.

Co to znamená

Ledger se slučuje po testech, nepřepisuje se po bězích. Záznam nahradí položku každého testu, který zpráva jmenuje, a každou jinou položku ponechá přesně tak, jak byla, takže bash test/run.sh 84_distribution_model následované záznamem aktualizuje jeden řádek a nic jiného na tom, co repozitář dokázal, nezmění.

Právě proto má smysl zaznamenat jediný případ. Zápis celé evidenční knihy na každý běh by potichu smazal důkazy o každém testu, který běh nezahrnul, a změnil by běh jednoho případu v repozitář, který prokázal jedinou věc — což je horší než ten, který neprokázal nic, protože to vypadá záměrně a nic v souboru neříká opak.

Princip

Ledger::merge v apps/majordomus-cli/src/evidence/ledger.rs prochází provedení, která dostane, a pro každé nahradí záznam se stejnou identitou testu nebo přidá nový. Neexistuje cesta, která by zkracovala. Zapisovač v record.rs produkuje provedení jen pro výsledky, které zpráva skutečně jmenovala; test, který se v žádné zprávě neobjeví, se nezapíše a spojení řekne not_run nebo bude dál hlásit starší provedení, podle toho, co platí.

Tři vlastnosti souboru plynou z téhož rozhodnutí. Záznamy jsou řazeny podle identity testu a zapsány s odsazením dvou mezer a koncovým novým řádkem, takže dva běhy téže množiny dají stejné bajty a diff ukazuje, co se změnilo, a ne co se přesunulo. Uchovává se jen poslední provedení každého testu, protože otázka, na kterou evidenční kniha odpovídá — je toto tvrzení nyní prokázáno — čte jen nejnovější a trvalým záznamem toho, co se dělo v čase, je git nad tímto souborem. A chybějící evidenční kniha a prázdná jsou touž odpovědí, not_run pro každé tvrzení, ani jedna není chyba: čerstvý klon má první a repozitář uprostřed adopce druhou.

Kniha, jejíž deklarovanou verzi tento spustitelný soubor nečte, se odmítne s oběma čísly, místo aby se přeinterpretovala, ze stejného důvodu, proč je merge částečný: špatně přečtená kniha je horší než chybějící, protože chybějící hlásí not_run a špatně přečtená by mohla hlásit úspěch.

Jak to vidět

MJ_TEST_REPORT=all.tsv bash test/run.sh
majordomus evidence record --suite all.tsv --origin local
majordomus evidence show --format json | jq '.ledger.executions'

MJ_TEST_REPORT=one.tsv bash test/run.sh 84_distribution_model
majordomus evidence record --suite one.tsv --origin local
majordomus evidence show --format json | jq '.ledger.executions'   # unchanged
git diff --stat .ai/repo/evidence/ledger.json                       # one entry moved

test/cases/124_evidence.sh řídí stejnou posloupnost ve fixture repozitáři a ověřuje počet provedení po částečném běhu, že test, který běh jmenoval, nese novou dobu trvání a původ, a že test, který nejmenoval, stále nese staré.

Co nepokrývá

Dva výsledky téhož testu v jednom záznamu se nesmiřují; vyhrává poslední zapsaný, protože zapisovač výsledky nesoudí a nemá mezi nimi co upřednostnit.

Nic se neořezává. Záznam pro test, který byl mezitím z repozitáře smazán, zůstává v ledgeru, dokud jej pozdější nahrávka nenahradí nebo dokud jej někdo neodstraní v commitu; hlásí se poctivě — majordomus evidence proves říká, že zdroj není přítomen — ale nezametá se, protože soubor, který lze v tomto repozitáři zmenšit jen ručně, je soubor, jehož zmenšení lze posoudit v revizi.

Slučování zachovává, co bylo zaznamenáno, ne co je pravda. Starý záznam k testu, který stále existuje, dál dokazuje to, co dokázal u commitu, který jmenuje, a spojení rozhoduje, zda to stále platí.

Záznam, který není commitnut, je lokální názor. Merge se děje v pracovním stromě; dokud ledger není v commitu, žádný jiný checkout ani čtenář publikovaného webu ho neviděl.

Proč existuje

Spuštění celé sady trvá tak dlouho, že ho nikdo nedělá kvůli kontrole jedné změny, a subsystém, který by přijímal jen běhy celé sady, by byl subsystém, který nikdo nekrmí. Částečný běh je proto běžný případ a invariant, který ho činí bezpečným, musí platit, aniž by na to kdo myslel — proto je ověřen dvakrát: jako unit test nad samotným merge a behaviorálně, přes spustitelný soubor, ve fixture repozitáři.

Detail vykreslený z docs/claims/evidence-partial-run-preserves-the-rest.md.

Od tvrzení k důkazu

  1. 1 · veřejné tvrzení

    Zaznamenání výsledku jednoho testu nikdy nesmaže důkazy zaznamenané pro jiný test

    Vzniklo na Důkazy.

  2. 2 · kanonické tvrzení

    evidence-partial-run-preserves-the-restdeklarovaný stav: zaručeno v docs/CLAIMS.yaml

    Definováno v přečtěte si to na tomto webu · docs/EVIDENCE.md

  3. 3 · implementace

    apps/majordomus-cli/src/evidence/ledger.rs

  4. 4 · test a scénáře

    Test: test/cases/124_evidence.sh

  5. 5 · zaznamenané běhy

    zaznamenané důkazy: zastaralé jak se zaznamenávají důkazy

Ověřte si to sami

Test běží v jednorázovém dočasném repozitáři a ověřuje chování, ne řetězec ve zdrojovém kódu.

z klonu repozitáře
bash test/run.sh 124_evidence

Související tvrzení stejná implementace

Prohledává názvy a popisy všech stránek, které tento web publikuje.