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.

Každý spustitelný řádek, funkce a oblast, které změna v crate Rustu přidá nebo se jich dotkne, musí být pokryty testem; změna, která nechá nový kód nepokrytý, se odmítne a nedotčený starý dluh se ponechá

Pokrytí celého crate leží pod 100 % a starý dluh je skutečný, takže jediné

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: nespuštěno 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

scripts/ci/coverage-differential protne jediný kanonický export llvm-cov (bez testovacího kódu) s řádky, kterých se podle gitu změna dotkla vůči merge-base větve s trunkem, včetně pracovního stromu, a skončí s kódem 10 na první změněné spustitelné položce, kterou žádný test nepokrývá. Pravidlem je project.new-code-is-covered; případ 132 podstrčí záměrně nepokrytý změněný řádek, dokáže, že kontrola selže, pak jej pokryje a dokáže, že projde, a dokáže, že nerozřešitelná báze je UNKNOWN, ne tichý průchod.

Co to znamená

Pokrytí celého crate je pod 100 % a zděděný dluh je skutečný, takže jediná hranice pro celý crate nemůže zakázat nový dluh: změna může přidat nepokrytý kód, zatímco souhrnné číslo se sotva pohne. Diferenciální invariant úkolu #214 vede hranici tam, kde ji lze udržet bez přepisování historie — u kódu, kterého se změna dotýká. Nový soubor dluží úplné pokrytí, nová funkce ho dluží, změněný spustitelný řádek dluží pokrytí, změněná větev dluží pokrytí; nedotčený starý kód může zůstat, jak je. Invariantem je new_debt == 0 a legacy_debt_after <= legacy_debt_before.

Princip

scripts/rust-coverage --changed <base> čte jediný kanonický export cargo llvm-cov — testovací kód je vyloučen z obou stran každého zlomku, stejné pravidlo řádků/funkcí/regionů jako používá kontrola crate — a protíná ho s řádky, o kterých git diff <base> říká, že je změna přidala nebo se jich dotkla, včetně pracovního stromu, takže necommitnutá úprava se posuzuje jako commitnutá. Změněný řádek, který odpovídá spustitelnému kódu s nulovým počtem, je nález; změněný řádek, který neodpovídá ničemu spustitelnému (komentář, prázdný řádek, use, deklarace typu, testovací kód), není. scripts/ci/coverage-differential je tenká kontrola: určí základ jako merge-base větve s trunkem (nebo explicitní), předá verdikt a rozlišuje PASS, FAIL (kód 10), UNKNOWN (kód 13, základ nelze určit) a BLOCKED (kód 12, toolchain pokrytí chybí nebo jeho běhu nelze věřit). Pravidlem je project.new-code-is-covered; plán CI spouští kontrolu v úloze coverage pro každou změnu pod crate.

Jak to vidět

scripts/ci/coverage-differential                          # this branch against origin/master's merge-base
scripts/rust-coverage --changed HEAD~1                    # against the previous commit
MJ_COVERAGE_EXPORT=cov.json scripts/ci/coverage-differential   # reuse an export, no reinstrument

test/cases/132_coverage_differential.sh je spustitelný důkaz: proti syntetické vnitřně konzistentní fixture potvrzuje, že záměrně nepokrytý změněný řádek FAIL (exit 10), týž řádek pokrytý PASS, změna mimo crate není vázána ničím a nerozlišitelný základ je UNKNOWN (exit 13), ne tichý průchod.

Co nepokrývá

Drží dimenze, které cargo-llvm-cov měří pro tento crate — řádek, funkci a region. Netestuje mutacemi: u predikátu, na jehož smyslu záleží (kontrola oprávnění, rozhodnutí o důvěře, přechod stavu), dokládá, že změněný řádek běžel, ne že by test selhal, kdyby byl řádek špatný; tyto subsystémy nesou vlastní adversariální sady a pokrytí je pro ně nutné, nikoli postačující. Nikdy nevyžaduje, aby se platil nedotčený starý dluh — dívá se jen na řádky, jichž se změna dotkla — a git hook spuštěný s --no-verify nebo základ, který mělký klon nedokáže rozřešit, je UNKNOWN, ne průchod, který nelze zdůvodnit.

Proč existuje

Hranice pro celý crate dovolí změně přidat nepokrytý kód a zůstat zelená, protože jedna nová nepokrytá funkce sotva pohne pěticiferným jmenovatelem; dluh narůstá po jednom commitu a nikdy není změna, která by hranici překročila. Úkol #214 činí otázku lokální — je tato změna pokryta — což je jediná podoba otázky, na kterou umí přispěvatel odpovědět a kterou umí kontrola držet bez přepisování historie crate.

Detail vykreslený z docs/claims/new-code-is-covered.md.

Od tvrzení k důkazu

  1. 1 · veřejné tvrzení

    Každý spustitelný řádek, funkce a oblast, které změna v crate Rustu přidá nebo se jich dotkne, musí být pokryty testem; změna, která nechá nový kód nepokrytý, se odmítne a nedotčený starý dluh se ponechá

    Vytvořeno na Coverage.

  2. 2 · kanonické tvrzení

    new-code-is-covereddeklarovaný stav: zaručeno v docs/CLAIMS.yaml

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

  3. 3 · implementace

    scripts/rust-coverage

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

    Test: test/cases/132_coverage_differential.sh

  5. 5 · zaznamenané běhy

    zaznamenané důkazy: nespuštěno 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 132_coverage_differential

Související tvrzení stejná implementace

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