1. Uvod
Fucini Coverage Studio pretvara datoteke pokrivenosti koje vaš build već proizvodi u prvorazrednu pokrivenost u uređivaču — u VS Codeu i u Visual Studiju. Čita dvadeset i pet formata, normalizira ih u jedan kanonski Fucini model, deterministički spaja više izvođenja i prikazuje ih u samom uređivaču — rubovi, CodeLens, lebdeći opis i prikaz Covered Files — pa nema zasebnog preglednika zbog kojeg biste napuštali uređivač. Dva izdanja dijele jedan čitač: isti izvještaj daje iste brojke, do znamenke, u oba. Ovaj je vodič napisan iz VS Codea; gdje se Visual Studio razlikuje, okvir In Visual Studio kaže kako.
Izrađen je imajući na umu radne procese funkcionalne sigurnosti: pokrivenost MC/DC, pokrivenost regija i C++ instanciranja, sigurnosno ponderirani kompozitni rezultat te konfigurabilnu presudu COMPLIANT / NON-COMPLIANT usklađenu s razmišljanjem IEC 61508, ISO 26262 i DO-178C.
Screenshot pending — add assets/img/marketplace-demo.gif (see SCREENSHOTS.md).2. Instalacija i zahtjevi
- VS Code ≥ 1.88 — najmanja verzija koju ovo proširenje podržava — ili Visual Studio 2022 ili 2026, Community, Professional ili Enterprise (vidi okvir ispod).
- Datoteka pokrivenosti koju vaš projekt već proizvodi (vidi §4).
Instalirajte s Marketplacea ili putem .vsix datoteke koristeći Extensions → ⋯ → Install from VSIX…. Proširenje se aktivira pri pokretanju i dodaje ikonu Coverage u activity bar.
U Visual Studiju. Isti proizvod izlazi kao drugo proširenje, Fucini Coverage Studio za Visual Studio, za Visual Studio 2022 i 2026 — Community, Professional i Enterprise. Ne koristi vlastitu pokrivenost koda Visual Studija: u Visual Studiju 2022 to je Enterprise značajka, pa je na Communityju i Professionalu ovo jedina pokrivenost koju će IDE prikazati. Instalirajte .vsix tako da ga otvorite — VSIX Installer pita koji Visual Studio — ili kroz Extensions → Manage Extensions; proširenje se učitava kad se otvori rješenje ili mapa. Prozor Coverage treba Microsoft Edge WebView2 Runtime, koji Windows 11 i Visual Studio 2026 već donose; oznake u uređivaču rade i bez njega.
3. Brzi početak
Želite vidjeti kako funkcionira prije nego što povežete vlastiti projekt? Preuzmite demo projekt (~6 KB — mali C projekt s već pripremljenim lcov.info):
- Raspakirajte ga bilo gdje, zatim otvorite
coverage-studio-demo.code-workspaceu VS Codeu (File → Open Workspace from File…). - Instalirajte Fucini Coverage Studio ako to još niste učinili (vidi §2 iznad).
- Vlastiti
.vscode/settings.jsonradnog prostora već pokazuje na priloženicoverage/lcov.info, pa se trake i prikaz Covered Files pojavljuju čim se proširenje aktivira — korakLoad Coveragenije potreban. - Želite sami ponovno generirati datoteku traga (npr. s drugim kompajlerom)? Pokrenite
scripts/gen-coverage.sh(ili.ps1na Windowsu) — dostupne ciljeve kompajlera potražite u vlastitomREADME.mdradnog prostora.
U Visual Studiju. Otvorite rješenje ili mapu (File → Open → Folder, tako se otvara CMake projekt) — gornji demo otvara se kao mapa, a njegov .vscode/settings.json čita se i ondje. Izvještaj na mjestu koje postavke imenuju učitava se sam, a okno Fucini Coverage prozora Output kaže koje datoteke; inače Tools → Coverage Studio → Load Coverage File…, jednom — pamti se. Otvorite izvornu datoteku i odaberite Show Coverage in Editor: crveno je redak koji nikad nije izvršen, jantarno odluka donesena samo na jednu stranu, a Ctrl+Shift+U, N vodi na sljedeći nepokriveni redak. View → Other Windows → Coverage je stablo s brojkama svake datoteke i jednim rezultatom nad svima, koji statusna traka prikazuje za izvođenje i za datoteku u kojoj ste. Tools → Coverage Studio → Getting Started otvara ove korake kao stranicu s gumbom za svaki; prvi se put otvara sama.
- Generirajte datoteku traga pokrivenosti uobičajenim testnim tijekom rada.
- Command Palette (
Ctrl+Shift+P) →Fucini Coverage: Load Coverage. S uključenimwatch.enabled(zadano), odgovarajuća se datoteka učitava automatski. - Otvorite pokrivenu izvornu datoteku: statusna traka prikazuje njezin postotak, prikaz Coverage se popunjava, prelazak mišem preko retka prikazuje njegov broj pogodaka, a izvođenje se pojavljuje u nativnoj ploči Test Coverage. Trake na nepokrivenim retcima, toplinska karta broja pogodaka i brojevi
×Nu retku jednu su postavku daleko (editorGutter.mode,hitCounts.inline).
Screenshot pending — add assets/img/gutters.png (see SCREENSHOTS.md).4. Izrada datoteka traga
Bilo koji od sljedećih formata automatski se prepoznaje pri učitavanju:
Potpuni recepti za kopiranje i lijepljenje po kompajleru — uključujući Swift, Rust, Go, Python, .NET, PHP i druge — na stranici Recepti za pokrivenost: Swift · Clang · GCC · Rust · Go · Python · Java/Kotlin · JS/TS · .NET · PHP · Ruby.
C / C++ — LLVM (llvm-cov)
clang --coverage -fprofile-instr-generate -fcoverage-mapping test.c -o test
LLVM_PROFILE_FILE=test.profraw ./test
llvm-profdata merge -sparse test.profraw -o test.profdata
llvm-cov export ./test -instr-profile=test.profdata --format=json > coverage.json
llvm-cov JSON je najbogatiji ulaz — uz retke, grane i funkcije nosi i regije, MC/DC i instanciranja C++ predložaka.
C / C++ — GCC (gcov → lcov)
gcc --coverage calc.c calc_test.c -o test && ./test
lcov --capture --directory . --output-file lcov.info
# or gcovr --cobertura coverage.xml
# or skip the conversion entirely: gcovr --json coverage.json
JavaScript / TypeScript — Istanbul / nyc
nyc --reporter=json mocha # emits coverage/coverage-final.json
Java — JaCoCo
mvn test # emits target/site/jacoco/jacoco.xml
Ruby — SimpleCov
# .resultset.json (built-in) or coverage.json via the simplecov-json gem
Go
go test ./... -coverprofile=coverage.out # read directly, no conversion
Python — coverage.py
coverage run --branch -m pytest && coverage json # emits coverage.json
PHP — PHPUnit (Clover)
XDEBUG_MODE=coverage phpunit --coverage-clover clover.xml
.NET / C# — Coverlet (OpenCover)
dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=opencover
| Format | Tipična datoteka | Dodatne metrike |
|---|---|---|
| LCOV | lcov.info | retci, grane, funkcije |
| llvm-cov JSON | coverage.json | + regije, MC/DC, instanciranja |
| Cobertura XML | coverage.xml | retci, grane |
| JaCoCo XML | jacoco.xml | retci, grane, funkcije |
| Istanbul / nyc | coverage-final.json | naredbe, grane, funkcije |
| SimpleCov | .resultset.json | retci |
| Clover XML | clover.xml | retci, grane, funkcije |
| OpenCover XML | coverage.opencover.xml | retci, grane, funkcije |
| coverage.py JSON | coverage.json | retci, grane |
| gcov / gcovr JSON | coverage.json | retci, grane, funkcije |
| Go coverage profile | coverage.out | retci |
| SonarQube generic | coverage.xml | retci, grane |
| GNATcoverage XML (Ada) | *.xml | retci, grane, MC/DC |
| BullseyeCoverage XML | coverage.xml | retci, uvjet/odluka |
| Visual Studio | *.coveragexml | retci, grane |
| Coveralls JSON | coveralls.json | retci, grane |
| Xcode xccov JSON | coverage.json | funkcije i ukupni podaci po datoteci — bez podataka po retku |
| gcov plain text | *.gcov | retci, grane, pozivi funkcija |
| VectorCAST | coverage.xml | retci, grane, MC/DC parovi, funkcije, pozivi funkcija |
| Testwell CTC++ | *.txt | retci, uvjet/odluka |
| Lauterbach TRACE32 | *.xml | naredbe, odluke, uvjeti, MC/DC, funkcije, pozivi, objektni kod |
| EMMA XML (Java) | coverage.xml | retci |
| UCIS / Aldec UCDB | *.xml | naredbe, grane odluka |
| NCover XML | Coverage.xml | retci, funkcije |
| dotCover DetailedXML | dotCover.xml | retci, funkcije |
| PIT (mutation) | mutations.xml | ocjena mutacija — bez pokrivenosti |
| Stryker (mutation) | mutation-report.json | ocjena mutacija — bez pokrivenosti |
Nativni C++ projekt, mjeren iz Visual Studija
U Visual Studiju. Vlastita pokrivenost C++ projekta u Visual Studiju bila je samo za Enterprise, a besplatni dodatak OpenCppCoverage koji je popunjavao tu prazninu povučen je. Tools → Coverage Studio → Run Native Project with Coverage uzima početni projekt — .vcxproj — pita MSBuild gdje se gradi i na kojem skupu alata, i mjeri ga na jedan od dva načina. Na skupu alata ClangCL, s LLVM-ovim llvm-profdata i llvm-cov na računalu (donosi ih komponenta Visual Studija C++ Clang tools for Windows), ponovno gradi projekt u coverage\native\ s -fprofile-instr-generate -fcoverage-mapping, kroz props datoteku koju MSBuild treba uvesti prvu — ništa se u projektu ne mijenja — pokreće program s postavljenim LLVM_PROFILE_FILE, spaja profil i izvozi coverage\native\lcov.info, točno do regije. Na svakom drugom skupu alata, s instaliranim OpenCppCoverage, gradi projekt kakav jest — Debug izgradnja ima PDB-ove — i pokreće ga pod OpenCppCoverageom, koji zapisuje coverage\native\opencppcoverage.xml. Svaka naredba ide u okno Fucini Coverage, a izvještaj se učitava i pamti kao onaj testnog izvođenja. Projektu koji se ne može mjeriti kaže se zašto i što instalirati. MSBuild 17.8 (Visual Studio 2022 17.8) ili noviji, zbog pitanja koje postavlja.
Screenshot pending — add assets/img/vs-native-run.gif (see SCREENSHOTS.md).5. Učitavanje i otkrivanje
Prema zadanim postavkama proširenje pretražuje od korijena radnog prostora. Precizirajte to dvjema postavkama:
{
"fuciniCoverage.coverageFile.defaultLocation": "${workspaceFolder}/build",
"fuciniCoverage.coverageFile.paths": [
"coverage.json",
"reports/*.info",
"${env:CI_ARTIFACTS}/lcov.info",
"https://ci.example.com/artifacts/latest/coverage.xml"
]
}
- Svaki unos
pathsrelativan je u odnosu nadefaultLocation(ili korijen radnog prostora ako nije postavljeno). - Unos koji sadrži
*pretražuje se rekurzivno; goli naziv datoteke odgovara samo izravno u osnovnoj mapi. - Kada je
pathsprazan, proširenje tražicoverage.json, zatimlcov.info, učitavajući što god prvo pronađe. - Pick Coverage File koristi datoteke koje odaberete umjesto ovih putanja — svaki odabir dodaje se skupu i sve se spajaju — dok ih ne uklonite ili ne izmijenite ove postavke.
- Varijable — svaka postavka putanje proširuje
${workspaceFolder},${workspaceFolderBasename},${userHome},${env:NAME},${command:id}i${config:section.key}. Varijabla koju proširenje ne poznaje ostavlja se kako je napisana, pa se tipfeler u dnevniku otkrivanja pojavljuje kao putanja koju je tražilo umjesto da nestane.${command:id}najprije izvršava tu naredbu — samo u pouzdanom radnom prostoru i najviše pet sekundi — pa${command:cmake.buildDirectory}prati odabrani CMake kit. - URL unosi —
http(s)://unos dohvaća se pri svakom učitavanju u pohranu proširenja i odande učitava; prikaz Coverage imenuje URL. Svaki je dohvat uvjetan (ETag / Last-Modified), pa nepromijenjeni artefakt ne preuzima ništa, a kad dohvat ne uspije, umjesto toga se učitava zadnja preuzeta kopija, s razlogom u izlazu.remote.headersdodaje zaglavljaName: values proširenim varijablama,remote.refreshMinutesponovno dohvaća po mjeraču vremena, a fragment#lcov.infoimenuje format kad sam URL ne završava imenom datoteke. - Glob uzorci za zanemarivanje —
fuciniCoverage.ignoreizbacuje cijele datoteke (uvezene, generirane, tuđe) iz izvođenja dok se učitava, pa svaki prikaz, vrata i izvoz broje bez njih; rezultat učitavanja kaže koliko ih je izostavljeno, a izlaz ih imenuje. Uzorci se podudaraju s putanjom relativnom prema radnom prostoru i s apsolutnom putanjom, a uzorak bez/podudara se s imenom mape ili datoteke na bilo kojoj dubini, kao.gitignore. - Radni prostori s više korijena — svaka se mapa otkriva pod vlastitim uvjetima:
defaultLocation,paths,pathRemap,ignore,watch.*iremote.*čitaju se po mapi, pa vrijedi vlastiti.vscode/settings.jsonmape ili njezin unos u.code-workspace, a${workspaceFolder}u unosu znači vlastitu mapu tog unosa. Datoteke traga svih mapa spajaju se u jedno izvođenje, prikaz Coverage grupira datoteke po mapi, a mapa dodana radnom prostoru ili uklonjena iz njega sama ponovno učitava pokrivenost. - Ponovno učitavanje nakon zadatka —
watch.reloadAfterTasksimenuje zadatke (labeliz tasks.json ilisource: namekako ih prikazuje popis Run Task) čiji završetak ponovno učitava pokrivenost, biowatch.enableduključen ili ne — za buildove koje nadzornik ne može pratiti. Apsolutni unospathsizvan radnog prostora također se ispituje, pa se datoteka koja se ondje pojavi učitava. - Napredak koji možete prekinuti — učitavanje deset ili više datoteka traga, ili 8 MB ili više njih, izvodi se pod obaviješću o napretku s gumbom Cancel koja imenuje datoteku koja se čita i fazu; manje samo vrti statusnu traku. Prekid ostavlja prethodno izvođenje učitanim i to kaže.
Od 1.2026.6 i apsolutni unos može sadržavati zamjenski znak: ${workspaceFolder}/build/coverage-merged/*.lcov.info učitava svaku takvu datoteku u toj mapi, a ** znači bilo koju dubinu. Mape prije prvog zamjenskog znaka su ondje gdje gleda, i nadziru se, pa se izvještaj koji build ondje zapiše učitava sam. Izdanje za Visual Studio čita takav unos na isti način, a od 1.2026.5 i relativni zamjenski znak se ondje pretražuje na bilo kojoj dubini, kao što se ovdje oduvijek pretraživao.
Kada nijedan paths nije konfiguriran, učitava se prvi od dobro poznatih naziva izvještaja pronađen ispod osnovne mape. Najprije četiri koja su se oduvijek tražila — coverage.json, lcov.info, coverage.out, clover.xml — zatim, od verzije 0.2026.83, jacoco.xml, coverage.xml, cobertura.xml, coverage.cobertura.xml, coverage.opencover.xml i coverage-final.json, a potom mjesta na koja zapisuju zadane konfiguracije: coverage/ (nyc, Jest, vitest, PHPUnit, SimpleCov), target/site/jacoco/jacoco.xml (Maven), build/reports/jacoco/test/jacocoTestReport.xml (Gradle) i TestResults/*/coverage.cobertura.xml (dotnet test). Tako Java ili .NET projekt prikazuje svoju pokrivenost već pri prvom otvaranju, kao što je lcov projekt oduvijek činio.
Od 1.2026.3 .NET rješenju treba još manje: mapa TestResults/<run>/ svakog testnog projekta među je poznatim mjestima, ne samo ona mape radnog prostora, a <user>_<machine>_<date>.cobertura.xml Microsoftova sakupljača pronalazi se uz Coverletov coverage.cobertura.xml — pa rješenje čiji su testovi pokrenuti u Test Exploreru Visual Studija pokazuje svoju pokrivenost pri prvom otvaranju, svaka se mapa izvođenja učitava, a spajanje zadržava riječ najnovijeg izvođenja o svakoj datoteci. A fuciniCoverage.ignore.generated, uključen prema zadanom, izostavlja dizajnerske i generirane datoteke — *.Designer.cs, *.g.cs, *.generated.cs, *.razor.g.cs, AssemblyInfo, globalne usinge, Migrations/ i obj/ — iz svakog zbroja, stranice i izvoza prije nego što se primijeni ignore, pa generirana tablica koju nitko ne testira ne obara rješenje ispod njegova praga.
U Visual Studiju: pokrivenost nakon svakog pokretanja testova. Pokrećite testove kao i uvijek. Tools → Coverage Studio → Collect Coverage in Test Explorer… stavlja jedan .runsettings s Microsoftovim Cobertura sakupljačem uz rješenje. Visual Studio ga preuzima kad je Tools → Options → Test → Auto detect runsettings files uključeno; inače ga jednom odaberite pod Test → Configure Run Settings. Od tada svako pokretanje piše izvještaj pod testnim projektom, a praćenje rješenja učitava ga čim se pojavi, spojen sa svime što postavke imenuju — jednako iz Test Explorera, terminala ili skripte. Ništa se ne kvači na Test Explorer, pa Visual Studio 2026 i Microsoft.Testing.Platform rade kakvi jesu. Run Tests with Coverage naredba je VS Codea: prepoznaje dotnet test, vitest, jest, pytest, go, cargo, maven, gradle, phpunit i ctest, pokreće testove s uključenom pokrivenošću u prozoru Output i učitava što su napisali; testni projekt bez coverlet.collector pokreće se sa sakupljačem koji dolazi s testnim SDK-om, a testRun.skipWhenTestsFail zadržava posljednju dobru pokrivenost na zaslonu kad pokretanje završi crveno.
CI artefakt iza tokena, ponovno provjeravan svakih četvrt sata — token ostaje u okruženju, nikad u settings.json:
{
"fuciniCoverage.coverageFile.paths": [
"https://ci.example.com/api/builds/latest/artifacts/coverage#lcov.info"
],
"fuciniCoverage.remote.headers": ["Authorization: Bearer ${env:CI_TOKEN}"],
"fuciniCoverage.remote.refreshMinutes": 15
}
Screenshot pending — add assets/img/remote-tracefile.png (see SCREENSHOTS.md).Ponovno učitavanje namjerno je tiho — dijalog nakon svake izgradnje pitanje je s jednim odgovorom. Ono što nije tiho jest ikona Coverage: dok prikaz nije pred vama, ona nosi broj tragova koji su ponovno pročitani, a opis alata imenuje ih. Otvorite prikaz i broja nema.
Screenshot pending — add assets/img/coverage-badge.gif (see SCREENSHOTS.md).Datoteke koje se nikad ne smiju brojati, što god datoteka traga o njima rekla:
{
"fuciniCoverage.ignore": ["vendor/**", "**/*.generated.ts", "build/**"]
}
Ponovno učitavanje kad testni zadatak završi, za build koji nadzornik datoteka ne može pratiti — izvođenje koje zamjenjuje simbolički povezano izlazno stablo, izvještaj na mrežnom dijeljenju, korak pokrivenosti koji naknadno obrađuje svoju datoteku:
{
"fuciniCoverage.watch.reloadAfterTasks": ["npm: test", "coverage-report"]
}
6. Spajanje izvođenja
Svaki postojeći unos u paths učitava se i spaja u jedno izvođenje. Spajanje je determinističko — rezultat ne ovisi o redoslijedu učitavanja — a datoteka koju je izmjerilo više tracefileova uzima brojeve iz onog s najnovijim vremenom izmjene na disku: vlastito ponovno izvođenje modula zamjenjuje ono što je šire, starije izvođenje reklo o njoj, umjesto da se tome dodaje. Prikaz Pokrivenosti pokazuje što je to učinilo: svaki redak datoteke imenuje tracefile iz kojeg potječu njegovi brojevi, oznaka je obrubljena gdje su ti brojevi nadjačali stariji izvještaj, svaki redak tracefilea iznad stabla broji koliko je njegovih datoteka nadjačano ili je nadjačalo druge, a klik na redak tracefilea ističe njegove datoteke u stablu dok se ponovno ne klikne (coverageView.mergedMarks isključuje obrub i isticanje).
Spojeno izvođenje može sadržavati više od šest klasičnih pokazatelja, svaki iz izvještaja koji ga mjeri: pozive funkcija, objektni kod i mutacijski rezultat uz retke, funkcije, regije, grane, MC/DC i instanciranja. Prikaz Coverage pokazuje stupac za svaki pokazatelj koji izvođenje sadrži — a nijedan za onaj koji ne sadrži — poredane po težini koju svaki pokazatelj ima u vašem rezultatu, najteži prvi, pri bilo kojoj širini — ono što ne stane pomiče se u stranu umjesto da nestane. Povucite prikaz u donju ploču i postaje tablica. Kartice statusne trake, HTML izvještaj te CSV i Markdown izvozi slijede isto pravilo: ono što izvještaj sadrži prikazuje se, a ono što ne sadrži izostavlja se umjesto da se ispiše kao nula.
Screenshot pending — add assets/img/coverage-view-editor.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/coverage-view-columns.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/workspace-overview.gif (see SCREENSHOTS.md).
Screenshot pending — add assets/img/vs-workspace-overview.gif (see SCREENSHOTS.md).Iz kojeg izvještaja dolazi datoteka
Kad nekoliko učitanih izvještaja mjeri istu datoteku, najnoviji je uzima u cijelosti — ispravno kad vlastito ponovno izvođenje modula zamjenjuje ono što je reklo starije, šire izvođenje. Pogrešno kad izvještaji mjere isti kod namjerno: tada uređivač sa svakim buildom skače s jednog na drugi, a svaki priča samo dio priče. coverageFile.sources kaže što učiniti umjesto toga, za svaku datoteku posebno. Potreban je u tri situacije:
- Jedan je izvještaj bolji.
coverage.jsoniz llvm-cov sadrži MC/DC, agcov.infoiz GCC-a za isti build samo retke i grane: odaberitecoverage.json, a drugi zadržite za onih nekoliko datoteka koje gradi samo GCC. - Nekoliko skupova testova jednog builda. Jedinični testovi, integracijski testovi i hardware-in-the-loop pišu svaki svoj izvještaj; svaki sam za sebe propušta retke koje su izvršili ostali. Kombiniraj, union: redak je pokriven ondje gdje ga je izvršio bilo koji izvještaj, a brojači se zbrajaju.
- Jedna baza koda, dva prevoditelja. Isti izvorni kod koji grade clang i GCC prolazi različitim putovima kroz kod specifičan za alatni lanac — ovdje intrinsic, ondje prenosiva zamjenska varijanta — i svaki izvještaj kaže da se druga polovica nikad nije izvršila. Kombiniraj, agree: redak je pokriven samo ondje gdje ga je izvršio svaki izvještaj koji ga mjeri, a retci oko kojih se izvještaji ne slažu označeni su tirkizno. To je pitanje koje postavlja provjera između prevoditelja: što je zapravo izvršio svaki build koji isporučujem?
Pravila rijetko pišete ručno. Desnom tipkom kliknite datoteku u prikazu Pokrivenosti i odaberite Choose Coverage Source... (ili pokrenite Choose Coverage Source for This File... na otvorenoj datoteci): popis sadrži svaki izvještaj koji mjeri datoteku, svaki s vlastitim retcima, granama i MC/DC-om, a zatim Combine them — agree i Combine them — union; odaberite jedno i navedite vrijedi li za datoteku, njezinu mapu ili uzorak. Clear Coverage Source for This File... ponovno uklanja pravilo. U postavkama je svako pravilo glob uzorak nad datotekama, glob uzorak nad izvještajem (uzorak bez / odgovara nazivu datoteke izvještaja, {a,b} imenuje nekoliko njih) i, za kombiniranje, "combine": "agree" ili "union". Odlučuje prvo pravilo čije datoteke odgovaraju i čiji izvještaj mjeri datoteku; datoteka koju mjeri samo jedan izvještaj nikad mu se ne oduzima. Grane, MC/DC i regije kombinirane datoteke dolaze iz izvještaja koji ih ima najviše. coverageFile.mergeStrategy: "order" o datotekama na koje se ne odnosi nijedno pravilo odlučuje prema redoslijedu u coverageFile.paths umjesto prema vremenima.
{
"fuciniCoverage.coverageFile.paths": ["clang.json", "gcc/bits.gcov.json.gz"],
"fuciniCoverage.coverageFile.sources": [
{ "files": "src/**", "report": "{clang.json,bits.gcov.json.gz}", "combine": "agree" }
]
}
Što vidite: redak datoteke u prikazu Pokrivenosti imenuje izvještaj iz kojeg dolaze njezini brojevi ili, kad je kombinirano, svaki izvještaj i način sa ≠ n za sporne retke. Rub uređivača i Annotated Source označavaju te retke tirkizno i kažu koji ih je izvještaj koliko puta izvršio. Lebdeća kartica statusne trake imenuje izvor otvorene datoteke, a za cijelo izvođenje pravila koja su na snazi i kako se odlučilo o ostalim datotekama. samples/c-cross-check iz demo projekta slučaj je s dva prevoditelja, spreman za otvaranje. Visual Studio radi sve to isto: Choose Coverage Source... na retku prikaza Pokrivenosti te Choose i Clear Coverage Source for This File... pod Tools > Coverage Studio.
Odabir i kombiniranje izvora dio su plaćenih planova. U izdanju Community najnoviji izvještaj pobjeđuje u svakoj datoteci, kao i bez pravila, a za pravilo u postavkama piše da se ne koristi, umjesto da se tiho zanemari.

bits.c iz prikaza Pokrivenosti — izvještaj clanga, izvještaj GCC-a ili oba kombinirana.


bits.c, clang i GCC kombinirani načinom agree — redak kaže ≠ 4, a četiri retka koja je izvršio samo jedan build tirkizna su.
bits.c doseže 100% svojih redaka — a retci u kojima se buildovi ne slažu ostaju tirkizni.


7. Premapiranje putanja
CI često bilježi apsolutne putanje build stroja koje ne postoje na vašoj radnoj stanici. Prepišite ih uređenim pravilima:
{
"fuciniCoverage.pathRemap": [
{ "from": "/builds/ci/project", "to": "${workspaceFolder}" },
{ "from": "\\\\", "to": "/" }
]
}
Pravila se primjenjuju redoslijedom; prvo podudaranje pobjeđuje po prefiksu. Koristite ovo za usklađivanje razlika Windows/Unix odvajača ili mapiranje putanje kontejnera na vaš checkout.
Rijetko ćete pravilo morati pisati sami. Najčešće „učitalo se, ali ništa ne svijetli“ jest datoteka traga čije putanje dolaze iz kontejnera ili CI checkouta (/build/src/a.c, /home/runner/work/repo/repo/src/a.c, C:\agent\_work\1\s\src\a.c), dok radni prostor ima src/a.c. Kad učitavanje ostavi datoteke nepodudarene, proširenje potraži imena datoteka u radnom prostoru, izvede pravilo prefiksa koje objašnjava najviše njih, zabilježi ga kao [FUCINI_REMAP_002], a rezultat učitavanja nudi Apply Suggested Remap — jedan klik dodaje pravilo u fuciniCoverage.pathRemap i ponovno učitava. Suggest Path Remap Rule izvodi istu analizu na zahtjev iz palete. Bez klika ništa se ne zapisuje.
to može koristiti ${workspaceRoot}, koji označava mapu radnog prostora u kojoj datoteka traga živi; u radnom prostoru s više korijena najprije pokušava tu mapu, a zatim svaku drugu mapu u kojoj se datoteka pokaže. Sama se pravila čitaju po mapi, pa svaki korijen radnog prostora s više korijena može nositi svoja.
8. Pokrivenost u uređivaču
- Oznake i ravnalo — prema zadanome vlastiti rub uređivača prikazuje samo nalaze: MC/DC trake, trokute od zadnjeg izvođenja, točke uređenih redaka.
editorGutter.modedodaje trake samo na nepokrivenim retcima ili toplinsku kartu broja pogodaka (u nastavku); prikaz cijele datoteke u bojama je Annotated Source. - CodeLens funkcije — % pokrivenosti iznad svake funkcije; kliknite za skok na njezin prvi nepokriveni redak. Prebacujte s
codeLens.enabled. - Lebdenje nad granama i MC/DC — lebdite nad retkom odluke za broj uzetih/neuzetih grana po grani i tablicu vektora po uvjetu. Omogućite obojenu rubnu traku s
mcdcGutter.enabled. - Upozorenja o mrtvom kodu — funkcije s mjerljivim retcima i nultom pokrivenošću označene su u ploči Problems (
deadCode.enabled). - Next / Previous Uncovered — skok između praznina.
- Statusna traka — stavka
$(dashboard) NN%za cijelo izvođenje i stavka po datoteci, obje obojene prema kompozitnom rezultatu; lebdite za potpunu tablicu metrika. - Značke u Exploreru — značke pokrivenosti po datoteci i po mapi, s raščlambom po metrici pri prelasku mišem. Prema zadanome isključene: uključite ih s
explorerBadges.enabled. - Od zadnjeg izvođenja — crveni trokut na svakom retku izvršenom u prethodnom izvođenju, a ne u ovom, zeleni za obrnuto, s preglednim ravnalom i brojem pogodaka pri prelasku mišem.
- Uređeni međuspremnici — svaka oznaka, opis i CodeLens pomiču se s tekstom dok uređujete i povlače se s prepisanog retka, gdje siva točka kaže zašto.
- Brojevi pogodaka u retku —
hitCounts.inlineispisuje×12iza svakog retka na kojem počinje naredba, uključujući×0: broj koji je oduvijek bio u opisu pri prelasku mišem, bez prelaska mišem. Toggle Inline Hit Counts ga uključuje i isključuje; izbornik statusne trake nudi ga kao Prikaži ili Sakrij, što god vrijedi. - Stavke u ploči Problems po retku —
problems.perLinestavlja dijagnostiku razine Information, s vijugavom crtom u uređivaču, na svaki neprekinuti blok redaka koji se nikad nisu izvršili u otvorenom dokumentu (mrtva funkcija od četrdeset redaka jedan je unos, a ne četrdeset) i, kaouncoveredAndPartial, na svaki redak čija grana nikad nije uzeta. Unosi prate svoje retke dok uređujete i nestaju kad se dokument zatvori; unos po datoteci izaproblems.enablednepromijenjen je. - Bojenje redaka —
lineHighlightstavlja prozirnu boju iza samih redaka, za ono što margina označava (uncovered, iliheatmapi za izvedene retke). Vlastita postavka, da margina može ostati čista dok su praznine obojene, ili obrnuto. - Preglednik —
overviewRulerodlučuje o crti u kliznoj traci neovisno o margini:follow(s trakama, kao dosad),uncovered(uvijek, pa margina može biti isključena dok klizna traka i dalje prikazuje karte praznina) ilioff. - Koja je datoteka traga pokrila redak — kad je objedinjeno više izvještaja, opis s brojem izvođenja završava s Pokriveno s: i svakim izvještajem koji je pokrio taj redak, uključujući naziv skupa iz lcov-ova
TN:; klik na redak datoteke traga u prikazu Coverage osvjetljava retke koje je ona doprinijela u svakom otvorenom uređivaču.
Screenshot pending — add assets/img/codelens-hover.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/codelens-crap.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/jump-between-gaps.gif (see SCREENSHOTS.md).
Screenshot pending — add assets/img/explorer-badges.png (see SCREENSHOTS.md).Načini rada ruba uređivača
editorGutter.mode odlučuje što vlastiti rub uređivača prikazuje o pokrivenosti, povrh nalaza koje uvijek prikazuje. off (zadano) samo su oni. uncovered stavlja traku na svaki redak koji se nikad nije izvršio i jantarnu na svaki redak s granom koja nikad nije uzeta, a ništa na pokrivene retke, pa zeleni zid ne skriva tri crvena. coverage dodaje zelenu traku na svaki pokriveni redak, pa se cijela datoteka čita crveno, jantarno i zeleno u bojama ljestvice boja. heatmap umjesto toga dodaje topli ton na svaki izvršeni redak, to topliji što se češće izvršio — pokazuje koliko se često redak izvršio, a ne je li pokriven, pa je datoteka sa 100% ondje od žute do smeđe, nikad zelena. Choose Editor Gutter Mode... bira jedan iz palete ili izbornika statusne trake; gumb načina na desnoj strani statusne trake, ili Alt+G, jednim pritiskom prelazi na sljedeći (statusBar.showModeToggle skriva gumb). Oba zapisuju postavku. Primjer uključuje trake na nepokrivenim retcima i brojeve u retku zajedno:
{
"fuciniCoverage.editorGutter.mode": "uncovered",
"fuciniCoverage.hitCounts.inline": true
}
Screenshot pending — add assets/img/gutters.png (see SCREENSHOTS.md).
coverage — zeleno gdje se redak izvršio u cijelosti, jantarno gdje grana nikad nije uzeta, crveno gdje se ništa nije izvršilo. Stavka datoteke u statusnoj traci imenuje izvještaj iz kojeg dolaze njezini brojevi; gumb načina pokraj nje kaže Coverage.
Alt+G četiri puta — heatmap, off, uncovered i natrag na coverage.
Quote.cs.Toplinska karta relativna je u odnosu na datoteku. Nijansa retka uspoređuje njegov broj izvršavanja s najtoplijim retkom iste datoteke, na logaritamskoj ljestvici, u pet stupnjeva — tako su tijelo petlje koje se izvršilo tisuću puta i funkcija koja se izvršila dvaput oboje vidljivi, umjesto da jedno zasjeni drugo, a datoteka u kojoj se sve izvršilo točno jednom jednoliko je topla, a ne jednoliko blijeda. Na tamnoj temi raspon ide od prigušene maslinaste do žive narančaste, na svijetloj temi od blijedožute do smeđe: u oba slučaja više boje znači više izvršavanja, a crvena ostaje rezervirana za retke koji se nikada nisu izvršili. lineHighlight: "heatmap" stavlja iste nijanse iza koda kao pozadinu, a hitCounts.inline ispisuje točan broj iza retka.
{
"fuciniCoverage.editorGutter.mode": "heatmap",
"fuciniCoverage.lineHighlight": "heatmap",
"fuciniCoverage.hitCounts.inline": true
}
Screenshot pending — add assets/img/heatmap-dark.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/heatmap-light.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/heatmap.gif (see SCREENSHOTS.md).Boje su vaše. colorScale.lowColor, midColor i highColor daju crvenu, jantarnu i zelenu u rubu, u pozadinama redaka i u svakom postotku; heatmap.colors i heatmap.colorsDark sadrže pet nijansi toplinske karte za svijetlu i tamnu temu, od retka koji se izvršio najrjeđe do onog koji se izvršio najčešće. Stranica postavki prikazuje rezultat prije nego što se išta spremi: pod Colour scale pregled ostaje vidljiv dok se retci pomiču pokraj njega — gradijent s dvije prijelomne točke, nekoliko postotaka u njihovim bojama te mali svijetli i mali tamni uređivač obojeni u načinu coverage i toplinskom kartom — i ponovno se iscrtava čim se odabere boja.
{
"fuciniCoverage.heatmap.colors": ["#e3f2fd", "#90caf9", "#42a5f5", "#1e88e5", "#0d47a1"]
}


Dio retka koji se nikada nije izvršio
Redak je pokriven ili nije, a istina je često negdje između: return x > hi ? hi : x; se izvršio, ali njegov krak hi nikada. Kada je lineHighlight uključen, nikad izvršeni dio izvršenog retka obojen je u uređivaču, za svaki format koji sadrži raspone stupaca (llvm-cov, Istanbul, Go, dotnet-coverage) — isti oni odsječci koje označava izvorni kod s bilješkama. Samo u recima koji su se izvršili: redak koji se nikada nije izvršio već je označen u cijelosti. C++ predložak računa se kao izvršen ondje gdje ga je izvršila bilo koja instancijacija; što je učinila svaka pojedina instancijacija, o tome izvještava metrika instancijacija.
Screenshot pending — add assets/img/partial-line.png (see SCREENSHOTS.md).Koji su testovi izvršili ovaj redak
Neki izvještaji ne govore samo da se redak izvršio, nego i koji su ga testovi izvršili: coverage.py zapisan s coverage json --show-contexts i dynamic_context = test_function u datoteci .coveragerc, OpenCover prikupljen s -coverbytest te lcov tracefile zapisan s po jednim odjeljkom po testu (TN:), čiji se odjeljci zbrajaju u jedan zapis s testovima uz svaki redak. Zadržite pokazivač na početku retka, gdje se nalazi brojač izvršavanja, i testovi će biti navedeni — skraćeni na klasu i metodu, prvih pet imenom, a ostali kao broj; CodeLens funkcije kaže koliko ju je testova izvršilo. Show Tests That Ran This Line — Command Palette, kontekstni izbornik uređivača, u Visual Studiju Tools → Coverage Studio ili Ctrl+Shift+U, T — navodi ih, najzaposlenije prve, i otvara odabrani ondje gdje je napisan u radnom prostoru. Izvođenje dotnet test ne može reći koji je test što izvršio; postavite testRun.perTest i Run Tests with Coverage popisuje testne klase i izvodi ih jednu po jednu, svaki izvještaj označen svojom klasom, pa opis pri prelasku mišem, CodeLens i naredba mogu odgovoriti i za .NET. Podatak se čuva po datoteci, pa preživljava spajanje s izvještajem koji o testovima ne zna ništa.
{
"fuciniCoverage.testRun.perTest": true
}
# .coveragerc
[run]
dynamic_context = test_function
coverage run -m pytest && coverage json --show-contexts
Screenshot pending — add assets/img/tests-per-line.gif (see SCREENSHOTS.md).
Screenshot pending — add assets/img/tests-for-line.gif (see SCREENSHOTS.md).
Quote.cs — test koji ga je izveo i Go to Test koji ga otvara.Prošao ili nije, na oznakama
Pokriveni redak izgleda isto bez obzira na to je li njegov test prošao. Gdje izvještaj kaže koji su testovi izvršili redak, a datoteka rezultata izvoditelja kaže kako su završili, redak koji je izvršio test koji nije prošao dobiva crvenu traku na početku i prugu na preglednom ravnalu; opis pri prelasku mišem imenuje testove koji nisu prošli, a Show Tests That Ran This Line uz svaki od njih piše nije prošao. Kad je test crven, treba gledati kod kroz koji je prošao. Rezultati se čitaju pri svakom učitavanju iz mape svakog izvještaja — svaki .trx i imena kojima se služe alati koji pišu JUnit format (TEST-*.xml, junit*.xml, test-results*.xml) — te iz testResults.paths, kao putanje ili globovi relativni prema mapi. Run Tests with Coverage traži od dotnet test datoteku test-results.trx uz izvještaj, pa uz uključen testRun.perTest ništa ne treba podešavati. testResults.enabled isključuje čitanje.
{
"fuciniCoverage.testResults.paths": ["build/test-results/**/*.xml", "reports/junit.xml"]
}
Screenshot pending — add assets/img/pass-fail.gif (see SCREENSHOTS.md).
Screenshot pending — add assets/img/vs-pass-fail.gif (see SCREENSHOTS.md).Testovi kojih se promjena tiče
Potpuno izvođenje sporo odgovara na ono na što Run Tests Affected by My Changes… odgovara odmah: koji su od svih testova prošli kroz kod koji sam upravo uredio? Od gita se traži diff radnog stabla prema testImpact.baseRef — zadano HEAD, što je ono što još nije commitano; origin/main za sve što grana mijenja — i navode se testovi koji su izvršili promijenjeni redak, prvi onaj koji je izvršio najveći dio promjene. Odabir testa otvara ga. Gdje izvještaji potječu iz izvođenja po testu (testRun.perTest), prva stavka izvodi samo te testove, svaku klasu u vlastiti izvještaj, pa izvještaji svih ostalih klasa ostaju, a zbrojevi i dalje vrijede za cijeli skup. Naveden je i test koji je izvršio samo retke ispod umetanja ili uklanjanja: inače bi njegov izvještaj imenovao pogrešne retke.
Screenshot pending — add assets/img/test-impact.gif (see SCREENSHOTS.md).
Screenshot pending — add assets/img/vs-test-impact.gif (see SCREENSHOTS.md).Najmanje testova koji i dalje izvršavaju svaki redak
Show Minimal Test Set… odgovara na dva pitanja iz istih redaka po testu: kojih bi nekoliko testova i dalje izvršilo svaki redak koji skup izvršava — za brzo izvođenje prije commita — i koji testovi ne izvršavaju nijedan redak koji već ne izvršava neki drugi. Prvo dolaze odabrani testovi, svaki s retcima koje dodaje i retcima koje izvršava samo on; zatim ostali, svaki označen kao test koji ne dodaje ništa. Odabir je pohlepan — test koji izvršava najviše, zatim onaj koji tomu najviše dodaje — pa je blizu najmanjeg skupa i svaki put isti. Suvišan po retcima nije suvišan po onome što test provjerava: test koji ne dodaje nijedan redak ipak može biti jedini koji provjerava vrijednost na tim retcima. Popis kaže gdje gledati kad se skup prorjeđuje, nikad što obrisati.
Screenshot pending — add assets/img/minimal-test-set.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/vs-minimal-test-set.png (see SCREENSHOTS.md).Izvedi ovaj test, s pokrivenošću
Postavite kursor u test i pokrenite Run This Test with Coverage — Command Palette, kontekstni izbornik uređivača, u Visual Studiju Tools → Coverage Studio ili Ctrl+Shift+U, R — i samo se taj test izvodi s uključenom pokrivenošću: testna metoda u kojoj je kursor, ili testna klasa odnosno blok describe kad je između metoda, ili datoteka kad je iznad svake klase. Što je pod kursorom čita se iz teksta, pa radi za C#, VB i F# ([Fact], [Test], [TestMethod] i slično), JavaScript i TypeScript (it, test, describe) te Python (def test_…), koja god jezična usluga bila instalirana. Recept mape sužava se na njega — dotnet test --filter "FullyQualifiedName~…", jest ili vitest <file> -t "…", pytestov id čvora — a ono što zapiše učitava se kao svako izvođenje; izvoditelj koji se ne može suziti to kaže i Run Tests with Coverage izvodi sve.
Screenshot pending — add assets/img/run-this-test.gif (see SCREENSHOTS.md).
[Fact] — izvođenje na popisu Tracefiles, redci iznad metoda kažu da je kod izveo jedan test.Go i Rust. U Go datoteci func TestXxx (ili Fuzz…, Example…) u kojem je kursor izvodi se sam, u vlastitom paketu i po točnom imenu — go test ./pkg/calc -run "^TestTotal$" — a izvan testa izvodi se paket datoteke. U Rust datoteci funkcija #[test] izvodi se po svojoj putanji u crateu uz --exact; kad je kursor u mod i ni u jednom testu, izvode se testovi tog modula; integracijski test pod tests/ izvodi se u vlastitoj binarnoj datoteci (--test api). Izvoditelj dobiva samo datoteke svojeg jezika: TypeScript datoteka u Go mapi dobiva rečenicu, a ne izvođenje ničega.
Pokrivenost nakon svakog spremanja
S uključenim testRun.onSave spremanje izvorne datoteke pokreće testove koji je pokrivaju, s pokrivenošću, trenutak nakon spremanja, a rub uređivača slijedi. Za .NET rješenje projekt spremljene datoteke pronalazi se kroz graf .csproj i izvode se samo testni projekti koji ga referenciraju — izravno ili kroz druge projekte — po jedan dotnet test <project> svaki; svaki drugi izvoditelj izvodi cijeli svoj recept; datoteka koju nijedan projekt ne posjeduje i nijedan izvještaj ne mjeri ne pokreće ništa. Više spremanja zaredom jedno je izvođenje, a izvođenje koje već traje ne prekida se. Ostalo je kako to radi Run Tests with Coverage: terminal, okno Output, učitani izvještaj. Zadano isključeno — to je navika koju treba odabrati, a ne zadana postavka koju treba otkriti.
{
"fuciniCoverage.testRun.onSave": true
}
Screenshot pending — add assets/img/coverage-on-save.gif (see SCREENSHOTS.md).
testRun.onSave uključen — Quote.cs spremljen, testovi se pokreću sami, redak iznad metode se mijenja.Sama aplikacija, s pokrivenošću
Testno izvođenje kaže kroz što prolaze testovi. Ono kroz što prolazi čovjek — klikajući kroz zaslone prije izdanja, ponavljajući korake kupca — također je pokrivenost, a Run App with Coverage… je prikuplja. .NET aplikacija mape — Exe, WinExe, web ili worker projekt, nikad testni projekt; odabir ako ih je više — pokreće se pod Microsoftovim dotnet-coverage u vlastitoj konzoli, kako bi se u konzolnu aplikaciju moglo tipkati, i radi dok je ne zatvorite. Ono kroz što ste prošli zatim se učitava kao svako izvođenje, a u sesiji pokrivenosti dodaje se onome što su izvršili testovi. Način na koji je aplikacija završila ne uzima se izvođenju za zlo. Alat je potreban jednom: dotnet tool install --global dotnet-coverage.
Screenshot pending — add assets/img/run-app.gif (see SCREENSHOTS.md).
Screenshot pending — add assets/img/vs-run-app.gif (see SCREENSHOTS.md).Mutanti i gdje se nalaze
Alat za mutacijsko testiranje — PIT za Javu, Stryker za JavaScript, C# i Scalu, Mull za C i C++ — mijenja vaš kod u sitnim pojedinostima i pokreće testove protiv svake promjene. Promjena koju nijedan test ne primijeti jest preživjeli mutant: kod se izvršio, a ništa nije provjerilo što je učinio. Mutacijski rezultat govori koliko ih je uhvaćeno; od verzije 0.2026.83 uređivač govori gdje su ostali. Redak s mutantom iza sebe nosi napomenu (⚑ 2 mutants survived), promijenjeni tekst je podcrtan kada izvještaj navodi o kojem je tekstu riječ (Stryker i Mull to čine), pregledno ravnalo dobiva prugu, a zadržavanje pokazivača pokazuje što je promijenjeno, koliko ga je testova izvršilo te, za uhvaćene mutante, koji ih je test uhvatio.
Screenshot pending — add assets/img/mutant-hover.png (see SCREENSHOTS.md).Preživio znači da su testovi izvršili promijenjeni kod i svi prošli. Netestiran (u izvještaju no coverage) znači da nijedan test uopće ne izvršava taj kod, pa ništa nije ni moglo primijetiti promjenu. Uhvaćeni mutanti broje se pri zadržavanju pokazivača i nikada se ne označavaju, a mutanti koji nikada nisu bili pošten test — primjerice onaj koji se ne bi preveo — ostaju izvan rezultata. Izvorni kod s bilješkama ima redak ispod svakog takvog retka i gumb Next Mutant (U), a HTML izvještaji imaju odjeljak Surviving Mutants s poveznicom na redak. Ništa ne treba uključivati, a projekt bez mutacijskog izvještaja ne vidi ništa od toga.
Screenshot pending — add assets/img/mutants.gif (see SCREENSHOTS.md).Bi li test primijetio? Mutacijsko izvođenje kod kursora
Mutacijsko izvođenje projekta traje sat; ono jedne funkcije traje minutu. Run Mutation Tests Here izvodi tu minutu: funkcija u kojoj je kursor — ili označeni retci, ili datoteka — ono je što se izvoditelju mutacija u mapi kaže da mutira, a njegov se izvještaj učitava uz pokrivenost na zaslonu, gdje su označeni preživjeli mutanti. Za C# to je Stryker.NET (dotnet tool install --global dotnet-stryker), kojem se navode raspon znakova i testni projekt koji referencira projekt datoteke; za JavaScript i TypeScript StrykerJS, kojem se navode retci; za Javu PIT s Mavenom, kojem se navodi klasa. Način na koji je izvoditelj završio ne uzima se izvođenju za zlo: rezultat ispod praga izlazni je kod, a izvještaj i dalje postoji. Za izvoditelja koji nije ništa zapisao to se i kaže, zajedno s onim što mu treba biti instalirano.
Screenshot pending — add assets/img/mutation-here.gif (see SCREENSHOTS.md).
Screenshot pending — add assets/img/vs-mutation-here.gif (see SCREENSHOTS.md).Vlastiti prikaz Test Coverage VS Codea
S uključenim testCoverage.publish (zadano) svako učitano izvođenje ide i u nativni prikaz Test Coverage uređivača — ploču pokrivenosti Test Explorera, postotke po datoteci koje stavlja u Explorer i vlastiti prekidač uređivača Show Inline Coverage — kao retci, grane i funkcije, s pojedinostima učitanima na zahtjev, iz koje god datoteke traga došli i bez ikakvog testnog adaptera. Show in Test Coverage View objavljuje aktivno izvođenje i otvara ploču što god postavka govorila; izbornik statusne trake nudi ga iza quickActions.showTestCoverage. Isključeno, unos Fucini Coverage u Test Exploreru uopće se ne pojavljuje. Kada datoteka traga imenuje svoje testove (lcov sekcije TN:), svaki se test pojavljuje pod Fucini Coverage u Test Exploreru, a prikaz može filtrirati pokrivenost datoteke po testu.
Screenshot pending — add assets/img/test-coverage-view.png (see SCREENSHOTS.md).Nepokriveni retci u ploči Problems
Zadano isključeno jer je po naravi bučno, i uvijek samo za otvorene dokumente — izvođenje s dvije tisuće datoteka ne može preplaviti ploču. Neovisno o problems.enabled, koji se drži jednog unosa po datoteci:
{
"fuciniCoverage.problems.perLine": "uncoveredAndPartial"
}
Screenshot pending — add assets/img/problems-panel.png (see SCREENSHOTS.md).9. Diferencijalna pokrivenost
Ograničite dekoracije na retke koji su promijenjeni u odnosu na osnovnu git granu — idealno za pregled točno onoga što je PR pokrio ili nije:
{
"fuciniCoverage.gitDiff.enabled": true,
"fuciniCoverage.gitDiff.baseRef": "origin/main"
}
Screenshot pending — add assets/img/diff-coverage.png (see SCREENSHOTS.md).U Visual Studiju. Iste dvije postavke, čitane iz istih datoteka: proširenje samo pokreće git diff <baseRef> za svaku datoteku izvođenja i svodi izvođenje na retke koje je vaša grana promijenila — u rubnom stupcu, u prozoru Coverage i u pragovima. Okno Output kaže što je git odgovorio kad ne odgovori ništa.
Prag za novi kod
threshold.newCode zaseban je prag, uz one za cijelo izvođenje: najmanji postotak koji se morao izvršiti, među mjerljivim retcima promijenjenima prema gitDiff.baseRef. Projekt s ukupno 62% ipak može tražiti da ono što se piše danas bude testirano. Računa se pri svakom učitavanju na cijelom izvođenju, koje ostaje na zaslonu — gitDiff.enabled nešto je drugo: promijenjeni retci umjesto izvođenja. Check Coverage Thresholds i unosi o sukladnosti u ploči Problems javljaju da nije zadovoljen, vlastitom rečenicom: New code 72.00% < 80% (18 of 25 line(s) changed against origin/main ran). Promjena bez ijednog mjerljivog retka — komentari, README — ne krši ništa.
{
"fuciniCoverage.threshold.newCode": 80,
"fuciniCoverage.gitDiff.baseRef": "origin/main"
}
Screenshot pending — add assets/img/new-code-gate.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/vs-new-code-gate.png (see SCREENSHOTS.md).Novi kod po tagu, po autoru, po datumu
Novi kod zadano su retci koje radno stablo mijenja prema gitDiff.baseRef — grani, commitu ili tagu: "v1.4.0" znači sve od tog izdanja. Dvije postavke pitaju ono što ref ne može. gitDiff.author prima dio imena autora, pa su novi kod tada retci koje git pripisuje tom autoru; gitDiff.since prima dan, pa su to retci zadnji put promijenjeni tog dana ili poslije, kojom god granom došli; oboje zajedno, retci tog autora od tog dana. Čitaju se iz git blame, datoteku po datoteku — što će veliko izvođenje osjetiti pri svakom učitavanju — i zamjenjuju diff za pokrivenost diffa i za prag iznad. Redak koji još nije commitan broji se u oba slučaja.
{
"fuciniCoverage.gitDiff.author": "Ada",
"fuciniCoverage.gitDiff.since": "2026-09-01"
}
Screenshot pending — add assets/img/new-code-author.png (see SCREENSHOTS.md).Neizravne promjene: što se pomaknulo iako to nitko nije dirao
Diff kaže koji su se retci promijenili; dva izvođenja kažu koji su se retci prestali ili počeli izvršavati. Vrijedi pogledati retke u kojima se to dvoje ne slaže: kod koji nitko nije uređivao, a više se ne izvršava, jer je test obrisan, jer se grana ranije u kodu sada vraća prije, jer se promijenio fixture. Pregled diffa ne može ih vidjeti — po definiciji su izvan njega. Show Indirect Coverage Changes… navodi ih po datoteci, prvo datoteku koja je najviše izgubila, i otvara odabranu na njezinu prvom takvom retku. Izvođenje se uspoređuje s CI osnovicom gdje je baseline.report imenuje — po njoj se prosuđuje pull request — a inače s izvođenjem prije njega; izostavljaju se retci koje radno stablo mijenja prema gitDiff.baseRef i sve ispod mjesta na kojem ta promjena pomiče retke datoteke.
Screenshot pending — add assets/img/indirect-changes.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/vs-indirect-changes.png (see SCREENSHOTS.md).10. Kompozitni rezultat
Umjesto izvještavanja o šest brojeva, proširenje ih sažima u jedinu ponderiranu harmonijsku sredinu (WHM). Za pokazatelje s postocima pᵢ i ponderima wᵢ:
WHM = ( Σ wᵢ ) / ( Σ wᵢ / pᵢ )
Harmonijskom sredinom dominira njezin najmanji član, pa slab pokazatelj ne može biti prikriven savršenim — upravo svojstvo koje želite od sigurnosnog vrata. Zadani ponderi:
| Metrika | Težina | Obrazloženje |
|---|---|---|
| MC/DC | 4 | IEC 61508 SIL 3–4 / ISO 26262 ASIL C–D / DO-178C DAL A–B. |
| Grane | 2 | IEC 61508 SIL 2+ / ISO 26262 ASIL B+. |
| Uvjeti | 3 | Između grana i MC/DC-a (DO-178C, ISO 26262). |
| Regije | 1.5 | Putovi unutar naredbe (npr. djelomično kratko spajanje). |
| Retci | 1 | IEC 61508 SIL 1+ / ISO 26262 ASIL A+. |
| Funkcije | 1 | Provjera mrtvog koda. |
| Instanciranja | 0.5 | Pokrivenost C++ predložaka; najuži opseg. |
| Pozivi funkcija | 1 | Mjesta poziva koja su izvršena (gcov, VectorCAST, Testwell CTC++, TRACE32). |
| Objektni kod | 0 | Isključeno dok mu ne dodijelite težinu: obuhvaća pokrivenost naredbi. |
| Mutacijski rezultat | 0 | Isključeno dok mu ne dodijelite težinu: to nije pokrivenost. |
Postavite bilo koji ponder na 0 kako biste taj pokazatelj isključili iz rezultata. Pokazatelji koji nisu prisutni u podacima (npr. MC/DC u običnom lcov izvođenju) jednostavno se izostavljaju.
Objektni kod i mutacijski rezultat imaju težinu 0 dok ne odlučite drukčije (whmWeights.objectCode, whmWeights.mutation). Pokrivenost objektnog koda obuhvaća pokrivenost naredbi, pa se vrednovanjem obaju isti dokaz broji dvaput; mutacijski rezultat uopće nije pokrivenost — skup testova može izvršiti svaki redak, a ne otkriti ništa. Oba pokazatelja ipak imaju vlastiti stupac i vlastiti prag.
Pokrivenost uvjeta
a && b jedna je odluka — dvije grane — i dva uvjeta s četiri ishoda. Skup testova može proći objema granama, a da nikada ne vidi b kao neistinit: pokrivenost grana je potpuna, a pokrivenost uvjeta iznosi tri od četiri. Ta se razina u normama DO-178C i ISO 26262 nalazi između pokrivenosti grana i MC/DC-a, a od verzije 0.2026.83 zasebna je metrika umjesto da bude uklopljena u grane: redak u karticama statusne trake, stupac u prikazu Coverage, u izvještajima i izvozima, težina 3 u rezultatu (whmWeights.conditions) i vrata (threshold.conditions; bez vrata u profilu standard, 100 u profilu safety).
Čita se iz sondi condition alata BullseyeCoverage, iz TRACE32 izvoza cond i iz GCC 14 izgrađenog s -fcondition-coverage. Izvještaj koji ne razlikuje uvjete od odluka nema takav redak, stupac ni težinu. Ako upotrebljavate Bullseye ili TRACE32: uvjeti su se dosad brojili kao grane, pa se vaš postotak grana mijenja s ovim izdanjem, a s novom težinom i vaš složeni rezultat; postavite whmWeights.conditions na 0 da biste dobili rezultat kakav je bio.
GCC 14, redak po redak. -fcondition-coverage čini da gcov kaže koji ishod kojeg uvjeta nedostaje — uvjet 1 nikad istinit, uvjet 0 nikad ni jedno ni drugo — a svaki se uvjet označava na svojem retku i imenuje u opisu pri prelasku mišem, iz gcovova JSON-a i iz njegova tekstnog ispisa (condition outcomes covered 3/6). Metrika je ondje gdje su i ostale: threshold.conditions postavlja joj prag i ostaje neocijenjen gdje izvođenje nema takav broj, Copy Coverage Summary ima stupac uvjeta, badge.metric prima conditions, a okvir za pretraživanje prima conditions < 80. Broj grana funkcije izostavlja ishode njezinih uvjeta, kao i broj grana datoteke i izvođenja.
Screenshot pending — add assets/img/gcc-conditions.png (see SCREENSHOTS.md).Složenost i CRAP
Neki izvještaji sadrže ciklomatsku složenost svake funkcije: OpenCover (što je ono što zapisuje Coverlet), JaCoCo, Clover i Cobertura. Kada je tako, proširenje za funkciju izračunava rezultat CRAP — Change Risk Anti-Patterns — iz te složenosti i iz pokrivenosti koju je samo izmjerilo:
CRAP = complexity² × (1 − coverage)³ + complexity
Jednostavna, potpuno testirana funkcija dobiva rezultat jednak vlastitoj složenosti i ništa više; složena, jedva testirana funkcija dobiva rezultat u stotinama. U primjeru za C# u demonstracijskom projektu Price() ima složenost 22 i oko 37% pokrivenih redaka, što daje 142.2, dok Shipping() ima složenost 12 i potpuno je pokrivena, što daje 12. Uobičajena granica je 30: funkcija koja je dosegne ili premaši navodi se pod Riskiest Methods u HTML izvještaju, počevši od najgore.
Složenost i rezultat nalaze se u CodeLens prikazu funkcije i uz funkciju u izvornom kodu s napomenama. Max CRAP najviši je rezultat bilo koje funkcije u datoteci — najgori, a ne prosjek — i stupac je u prikazu Coverage, u HTML izvještaju te u CSV i Markdown izvozima. To je informacija: nema prag ni težinu u kompozitnom rezultatu. Izvještaji koji ne sadrže složenost (lcov, gcov, Istanbul, coverage.py) nemaju CRAP, a ni prazan stupac.
Od verzije 0.2026.83 imaju ga i C i C++. llvm-cov ne izvještava o složenosti, pa se ona broji iz podataka o granama koje izvještaj već sadrži: uvjeti napisani u vlastitoj datoteci funkcije, plus jedan — McCabeova definicija i ono što alati na razini izvornog koda broje za .NET i Javu. Uvjeti koji potječu iz makronaredbe iz druge datoteke — primjerice svaki assert — ne broje se.
Screenshot pending — add assets/img/riskiest-methods.png (see SCREENSHOTS.md).Risk hotspots, i koje datoteke prikazati
Ispod stabla prikaza Coverage, Risk hotspots navodi funkcije u kojima se složen kod susreće s malo pokrivenosti, najgore prve, a svaka otvara svoju datoteku na toj funkciji. Funkcija se kvalificira CRAP rezultatom — hotspots.crapThreshold, zadano 30, brojka koju su predložili autori metrike — ili samo ciklomatskom složenošću, hotspots.complexityThreshold, zadano isključeno; samo izvještaji koji nose složenost (OpenCover, Cobertura iz Coverleta, JaCoCo, llvm-cov) uopće ih imaju. Community vidi broj i najgori rezultat; rangirani popis je Pro. Uz sortiranje, drugi padajući izbornik kaže koje datoteke stablo prikazuje — sve, datoteke s prazninama, netestirane datoteke ili datoteke promijenjene od posljednjeg izvođenja; mape slijede svoje datoteke i zadržavaju vlastite brojeve. Oboje je i u Visual Studiju, u prozoru Coverage.
Screenshot pending — add assets/img/vs-hotspots.png (see SCREENSHOTS.md).Imenski prostori, klase i metode
Za .NET izvještaj koji imenuje svoje klase — Cobertura i Coverletov coverage.cobertura.xml, OpenCover — treći padajući izbornik, Folders / Namespaces, crta isto izvođenje kao imenske prostore, klase i metode: broj imenskog prostora zbroj je njegovih klasa, broj klase zbroj njezinih metoda, točno kao što je broj mape zbroj njezinih datoteka, s istim sortiranjem i istim filtrom. Redak metode otvara datoteku na metodi; klasa deklarirana bez imenskog prostora nalazi se pod (no namespace). Izbor se zapisuje u coverageView.perspective; izvođenje koje ne nosi imena klasa nema padajući izbornik i prikazuje svoje mape. U Visual Studiju prozor Coverage ima isti padajući izbornik.
Screenshot pending — add assets/img/namespace-perspective.png (see SCREENSHOTS.md).
Pretraživanje stabla
Ispod gumba i padajućih izbornika, polje za pretraživanje. Riječ zadržava retke čije je ime ili putanja nose — svaka upisana riječ mora biti ondje; usporedba zadržava retke čija je brojka zadovoljava — < 80% na rezultatu, lines >= 90, branches = 0, functions != 100, mcdc < 50 — a invoice < 80 traži oboje. Retci metoda iz perspektive imenskih prostora i rizične točke pretražuju se zajedno s datotekama, pa se funkcija pronalazi ondje gdje je izvođenje ima. Stablo se filtrira dok tipkate, u stranici, bez ponovnog crtanja; mapa koja sadrži podudaranje otvara se za njega i ponovno zatvara kad se polje isprazni; Esc ga briše. Isto polje, ista gramatika, u Visual Studiju.
Screenshot pending — add assets/img/tree-search.gif (see SCREENSHOTS.md).lines < 80.Stablo prati uređivač
Datoteka koju gledate istaknuta je u prikazu Coverage, mape iznad nje otvorene su, a njezin je redak pomaknut u vidno polje — u stablu više ne treba tražiti datoteku koja je već otvorena. Inače stablo zadržava svoj položaj pomicanja i ništa se ne iscrtava ponovno. coverageView.followActiveEditor, zadano uključen, isključuje to za one koji stablo radije ostavljaju ondje gdje su ga postavili.
Screenshot pending — add assets/img/follow-editor.gif (see SCREENSHOTS.md).
Screenshot pending — add assets/img/vs-follow-editor.gif (see SCREENSHOTS.md).11. Kontrola sukladnosti
Presuda COMPLIANT / NON-COMPLIANT (prikazana u prikazu s napomenama izvora, HTML izvještaju i oba lebdenja statusne trake) određena je pragovima po pokazatelju i načinom rada:
Screenshot pending — add assets/img/statusbar.png (see SCREENSHOTS.md).| Način | COMPLIANT kada… |
|---|---|
strict (default) | svaka pojedinačno provjeravana metrika dosegne vlastiti prag — bez ustupaka. |
whm | jedinstveni ponderirani složeni rezultat doseže threshold.weighted. |
both | ispunjeni su i ponderirana provjera I stroga provjera po metrici. |
either | ispunjena je ponderirana provjera ILI stroga provjera po metrici (najblaže). |
Prag od 0 isključuje ta vrata, a pokazatelj koji izvještaj ne sadrži nikada se ne ocjenjuje. Što znači prag koji niste postavili određuje profil opisan u nastavku. Pokrenite Fucini Coverage: Check Coverage Thresholds za procjenu na zahtjev.
U Visual Studiju. Tools → Coverage Studio → Check Coverage Thresholds prosuđuje izvođenje prema istim ključevima threshold.* i to kaže u statusnoj traci i oknu Output; uz compliance.diagnostics, problems.enabled, problems.perLine ili deadCode.enabled nalazi stoje u prozoru Error List uz nalaze samog prevoditelja — jedan unos po datoteci ispod praga, jedan po nepokrivenom rasponu, jedan po funkciji koja se nikad nije izvršila — a svaki otvara svoju datoteku na tom retku.
Screenshot pending — add assets/img/vs-error-list.png (see SCREENSHOTS.md).Profili pragova
threshold.profile određuje što znači prag koji niste postavili. standard, zadana vrijednost od verzije 0.2026.82, ono je što se može zahtijevati od običnog projekta koji nije povezan s funkcionalnom sigurnošću. safety postavlja sva vrata na 100 — ono što traži dokaz sigurnosti (safety case) i upravo ono što se isporučivalo do verzije 0.2026.81.
| Metrika | standard | safety |
|---|---|---|
| Retci | 80 | 100 |
| Funkcije | 80 | 100 |
| Regije | 75 | 100 |
| Grane | 70 | 100 |
| Kompozitni rezultat | 75 | 100 |
| MC/DC, instanciranja, pozivi funkcija, objektni kod | bez vrata | 100 |
| Uvjeti | bez vrata | 100 |
| Mutacijski rezultat | bez vrata | bez vrata |
Prag koji ste sami postavili ima prednost pred oba profila. Primjer postavlja vrata za grane na 90, a sve ostalo na 100; ako želite samo od nekih pokazatelja zahtijevati 100, ostanite na standard i te postavite sami. Jedna napomena proizlazi iz načina na koji postavke rade: vrijednost jednaka isporučenoj zadanoj vrijednosti ne može se razlikovati od nepostojanja vrijednosti, pa se pod safety prag zapisan točno kao njegova standardna vrijednost — primjerice 80 za retke — i dalje računa kao 100.
{
"fuciniCoverage.threshold.profile": "safety",
"fuciniCoverage.threshold.branch": 90
}
Screenshot pending — add assets/img/threshold-profile.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/threshold-profiles.gif (see SCREENSHOTS.md).Ako ste se oslanjali na stare zadane vrijednosti, nakon ažuriranja na verziju 0.2026.82 ocjenjivat će vas se blaže sve dok ne odaberete safety. Instalacija koja je već prije radila o tome se obavještava jednom, uz gumb Keep 100% (safety) koji profil zapisuje u vaše korisničke postavke; za zajednički projekt stavite ga i u postavke radnog prostora, kako bi se svi ocjenjivali jednako. Configure Coverage Compliance & Thresholds... prikazuje profil iznad mreže pragova, a njegov pregled uživo ocjenjuje prema vratima koja su stvarno na snazi. Na svakoj kartici i u svakom izvještaju pokazatelj čija su vrata isključena prikazuje svoju vrijednost s neutralnom crticom umjesto kvačice ili križića.
Screenshot pending — add assets/img/statusbar-metrics.png (see SCREENSHOTS.md).11a. Pokrivenost objektnog koda
Svaka druga mjera ovdje mjeri se iz izvornog koda: alat instrumentira vaš kod, instrumentirana verzija se izvodi, a brojači govore koje su naredbe, grane ili uvjeti izvršeni. Pokrivenost objektnog koda mjeri nešto drugo — koliko se izgrađene binarne datoteke doista izvršilo, brojeno u bajtovima instrukcija, promatranjem toka instrukcija umjesto instrumentiranjem izvora. To je važno jer prevoditelj proizvodi kod za koji ne stoji nijedan redak vašeg izvora: provjere granica polja, tablice skokova za switch, spremanje registara, provjere stoga, pozive pomoćnih rutina za dijeljenje ili pomični zarez na jezgrama bez te instrukcije. To je ujedno jedina mjera ovdje koja odgovara na pitanje pokriva li ovo assembler? — ručno pisani assembler nikad se ne instrumentira, a alat na razini izvora do njega ne dopire. DO-178C izričito kaže zašto: na razini A, gdje prevoditelj ili povezivač generira kod koji nije izravno sljediv do naredbi izvornog koda, cilj 6.4.4.2b traži dodatnu verifikaciju upravo tog generiranog koda.
Ona obuhvaća pokrivenost naredbi — svaka izvršena instrukcija potekla je iz neke naredbe, pa 100% pokrivenosti objektnog koda znači i 100% pokrivenosti naredbi. Obratno ne vrijedi, i upravo je ta asimetrija smisao mjerenja. Iz toga slijedi dvoje. Nema nikakvu težinu u složenoj ocjeni, jer usrednjavanje dviju mjera istih izvršavanja isti dokaz broji dvaput; umjesto toga provjerava se pragom fuciniCoverage.threshold.objectCode — zahtjev, a ne težina, kako norma i traži. I razlika je ono što se isporučuje: izvođenje sa 100% pokrivenosti redaka i manje od 100% pokrivenosti objektnog koda točno je locirala kod koji je proizveo prevoditelj, a za koji vaš izvor ne stoji, pa kartica sukladnosti kaže 312 bajtova nikad izvršeno, uz 100% pokrivenosti redaka, umjesto da to sakrije kao «94%». Obrnuto — cijela binarna datoteka prijavljena kao izvršena dok njezin izvor nije — proturječje je, a ne niska ocjena: gotovo uvijek zastarjela datoteka tragova s jedne strane spajanja ili nazivi modula koji se nikad nisu poklopili s putanjama datoteka. To se prijavljuje kao nalaz.
Pokrivenost objektnog koda zahtijeva da se binarna datoteka izvodi ondje gdje se njezine instrukcije mogu promatrati. Postoje tri puta i uvelike se razlikuju po cijeni. Samo treći daje pokrivenost objektnog koda; prva dva navedena su jer rješavaju srodan problem, koji je često onaj koji doista vrijedi riješiti.
- Instrumentirana verzija koja se izvodi na ciljnom uređaju. GCC-ovi unakrsni prevoditelji prihvaćaju
-fprofile-arcs -ftest-coverage, pa instrumentacija koja radi na radnoj stanici radi i na cilju — samo što sustav bez operacijskog sustava nema datotečni sustav u koji bi zapisao brojače.gcda, a često niexit()u kojem bi ih zapisao. Brojači ionako žive u radnoj memoriji, pa je rješenje ispisati tu memoriju i rekonstruirati datoteke izvan cilja;embedded-gcovNASA-ina JPL-a (Apache-2.0) radi upravo to, bez datotečnog sustava, operacijskog sustava ili standardne C biblioteke. To daje pokrivenost naredbi, grana i funkcija verzije koju je izradio vaš unakrsni prevoditelj, za vaš skup instrukcija, na vašem sklopovlju — ne i pokrivenost objektnog koda, a mjerena binarna datoteka je instrumentirana, dakle veća i sporija od one koju isporučujete. Rezultat učitajte kao LCOV, gcovr JSON, gcov JSON ili, na lancu alata starijem od GCC-a 9, kao tekstualni ispis.gcov. - Simulator skupa instrukcija. Pokrenite pravu ciljnu binarnu datoteku u simulatoru i izvedite pokrivenost iz izvršenih adresa: bez sklopovlja, bez instrumentacije, bez sonde — i budući da promatra instrukcije, može dati pravu pokrivenost objektnog koda. Ograničenje je vjernost: simulator dobro modelira jezgru, a slabije periferiju, pa rezultatima na razini cijelog sustava pristupajte sa sumnjom osim ako precizno modelira vaš čip.
- Trag na čipu i program za ispravljanje pogrešaka. Put certifikacijske razine i jedini uistinu neinvazivan: jedinica za praćenje u jezgri javlja tok instrukcija programu za ispravljanje pogrešaka, koji ga pretvara u pokrivenost. Ništa se ne instrumentira, veličina koda se ne mijenja i vremenski odnosi ostaju netaknuti — a upravo to čini rezultat dokazom o binarnoj datoteci koju doista isporučujete. Provjerite čip prije nego to uvrstite u proračun: u mnogim porodicama mikrokontrolera potpuno praćenje dostupno je samo na emulacijskoj ili razvojnoj inačici s velikim spremnikom traga i brzim priključkom, dok serijski čipovi imaju smanjenu jedinicu za praćenje čije je proizvođačevo rješenje programsko praćenje koje instrumentira kod i troši procesorsko vrijeme — čime nestaje upravo ono svojstvo zbog kojeg je taj put i odabran.
Mnogi ugrađeni projekti mjere pokrivenost tako da kompajliraju iste izvore za razvojno računalo i tamo pokreću jedinične testove. To je brzo, ne treba sklopovlje i za većinu timova to je ispravna zadana postavka — ali vrijedi jasno reći što taj dokaz zapravo opisuje: drugačiji prevoditelj, drugačiji optimizator, drugačiji skup instrukcija i drugačiju binarnu datoteku od one koja se isporučuje. Za većinu softvera to je prihvatljiv i dobro shvaćen kompromis. Za rad koji se ocjenjuje prema IEC 61508, ISO 26262 ili DO-178C to je standardni prigovor „host protiv cilja”, a gore navedeni putovi standardni su odgovori na njega — prvi ga zatvara za pokrivenost izvora, treći za objektni kod.
Danas se za objektni kod čita izvoz Lauterbach TRACE32-ova COVerage.EXPORT.ListModule s metric="object"; učitajte ga kao bilo koju drugu datoteku tragova. Ta se mjera ocjenjuje i provjerava samo uz plaćenu licenciju i tijekom razdoblja procjene. Community instalacija je ne ocjenjuje — ali je obaviještena kad je datoteka tragova sadrži, jer bi verdikt o sukladnosti koji šutke izostavi najjači dokaz u datoteci bio gori od onoga koji kaže što je izostavio.
12. Isključivanje redaka koji nisu kod
S uključenim excludeComments (zadano), naredbe koje se u potpunosti nalaze na retcima samo s komentarima ili praznim retcima isključene su iz ukupnih brojeva — ovo također neutralizira poznatu osobitost llvm-cov/gcov gdje slučajni broj pogodaka završi na komentaru. Poštuju se i standardni markeri:
x = risky(); // LCOV_EXCL_LINE
// LCOV_EXCL_START
debug_only_block();
// LCOV_EXCL_STOP
Ni direktive predprocesora ne broje se kao kod, u C-u, C++-u, Objective-C-u, CUDA-i i C#-u: redak koji počinje s # — #define, #include, #if — i retci na koje ga nastavlja završna obrnuta kosa crta. gcov svako korištenje makronaredbe pripisuje retku na kojem je definirana, pa je zaglavlje čiji je jedini prijavljeni redak bio #define CHANNEL_COUNT (33U) izgledalo 100% pokriveno jer je petlja u datoteci .c dolazila do njega, a ono čiju konstantu ništa nije koristilo izgledalo je 0% pokriveno. Takvo zaglavlje sada nema što mjeriti i ne navodi se.
Postavite excluded.includeInTotals na true kako biste ipak brojali isključene retke.
Izostavljanje datoteke ili mape, iz stabla
Desnom tipkom kliknite datoteku ili mapu u prikazu Coverage i odaberite Exclude from Coverage — nalazi se i među radnjama putanje retka — ili pokrenite Exclude This File from Coverage na otvorenoj datoteci: putanja datoteke relativna prema radnom prostoru, ili /** mape, ide u fuciniCoverage.ignore u postavkama mape, jednom, a ponovno učitavanje uklanja je iz svakog zbroja i svake stranice; uzorak je ondje da bi se mogao ponovno ukloniti. U Visual Studiju izbornik retka i Tools → Coverage Studio imaju iste dvije, koje zapisuju istu postavku u istu datoteku.
Screenshot pending — add assets/img/exclude-from-tree.gif (see SCREENSHOTS.md).
fees.ts — stablo bez nje, uzorak u .vscode/settings.json.Atributi i imenski prostori, za .NET
Dvije postavke čitaju iz izvora ono što izvještaj ne može reći. ignore.attributes — zadano ExcludeFromCodeCoverage — isključuje klasu, metodu ili svojstvo ispod atributa koji imenuje, kako bi to učinio LCOV_EXCL_START/STOP, bez obzira na to koji je alat napisao izvještaj: Coverlet poštuje atribut, OpenCover, dotCover i pretvoreni lcov ne, a sada se svi slažu. Imena sa sufiksom Attribute ili bez njega, s imenskim prostorom ili bez njega; dodajte GeneratedCode, Obsolete ili vlastite. ignore.namespaces izostavlja svaku datoteku čija deklaracija imenskog prostora odgovara prefiksu, sa * kao zamjenskim znakom — Acme.Generated, Acme.*.Migrations, *Tests — a okno Output imenuje datoteke koje je uzeo. Oboje se čita u istom prolazu koji čita oznake u komentarima, u oba izdanja.
{
"fuciniCoverage.ignore.attributes": ["ExcludeFromCodeCoverage", "GeneratedCode"],
"fuciniCoverage.ignore.namespaces": ["Acme.Generated", "*.Migrations"]
}
Isključivanje iz uređivača
Označite retke i uzmite Exclude Selection from Coverage iz žaruljice, kontekstnog izbornika uređivača ili Command Palette — u Visual Studiju iz žaruljice (Ctrl+.), izbornika desnog klika u prozoru koda, Tools → Coverage Studio ili Ctrl+Shift+U, X — i isključenje se zapisuje ondje gdje je kod: [ExcludeFromCodeCoverage] iznad C#, VB ili F# klase, metode ili svojstva, kratkim imenom kad datoteka već uvozi System.Diagnostics.CodeAnalysis, a potpuno kvalificirano kad ne uvozi, da se ne mora dodavati nikakav using; LCOV_EXCL_LINE na kraju jednog retka koda; LCOV_EXCL_START i LCOV_EXCL_STOP oko više njih, na uvlaci prvog retka — vlastitim znakom komentara jezika, //, #, ', -- ili ;. Jedan korak poništavanja. Žaruljica to nudi i na retku koji unosi u ploči Problems označavaju kao nepokriven. Redak koji je već označen, ili član koji već ima atribut, ostaje kakav jest.
Screenshot pending — add assets/img/exclude-selection.gif (see SCREENSHOTS.md).
LCOV_EXCL oko grane, zatim [ExcludeFromCodeCoverage] iznad metode.Samo grane, i gcovrove oznake
Obrambeni else, default: do kojeg ne dolazi nijedna vrijednost, krak koji prevoditelj dodaje za iznimku: redak se izvršava i treba se brojati, a samo se njegova grana ne može uzeti. LCOV_EXCL_BR_LINE i LCOV_EXCL_BR_START … LCOV_EXCL_BR_STOP izuzimaju iz brojanja grane na svojim retcima, a retke u njemu ostavljaju. LCOV_EXCL_EXCEPTION_BR_LINE i njegova regija izuzimaju još manje — samo krakove do kojih dovodi iznimka, gdje izvještaj kaže koji su to, kao što to čini gcovov JSON. Svaka se oznaka čita i pod gcovrovim prefiksima: GCOVR_EXCL_LINE, GCOVR_EXCL_START, GCOVR_EXCL_BR_LINE, GCOV_EXCL_STOP i ostale znače isto što i one LCOV_EXCL_, pa se izvorni kod pisan za gcovr ovdje čita jednako, koji god alat izradio izvještaj. Ne čita se: GCOVR_EXCL_FUNCTION — ništa na tom retku ne kaže gdje funkcija završava.
if (handle == NULL) return E_FAIL; // LCOV_EXCL_BR_LINE: the allocator never fails on target
// LCOV_EXCL_BR_START generated state table
switch (state) { /* … */ }
// LCOV_EXCL_BR_STOP
Screenshot pending — add assets/img/branch-markers.png (see SCREENSHOTS.md).Reći zašto: obrazložena isključenja
Izuzimanje koda iz brojanja jest tvrdnja — „ovo se ne može testirati”, „ovo je pomagalo za razvoj” — a prema DO-178C, ISO 26262 ili IEC 61508 tvrdnja koja mijenja broj na kojem počiva certifikat mora biti zapisana i dostupna pregledu. Zato isključenje može reći zašto, ondje gdje je zapisano: tekst iza LCOV_EXCL_LINE ili LCOV_EXCL_START, ili Justification atributa [ExcludeFromCodeCoverage].
abort(); // LCOV_EXCL_LINE: defensive, unreachable by construction
// LCOV_EXCL_START debug dump, never built for the target
[ExcludeFromCodeCoverage(Justification = "a developer aid")]
public static void DebugDump(decimal amount) { /* … */ }
Razlozi se čitaju pri svakom učitavanju, a dnevnik ih broji. Export Coverage Report… zapisuje popis — isključenja i njihova obrazloženja, kao Markdown ili CSV: datoteka, retci, način na koji je zapisano te obrazloženje ili none given. Datoteka u kojoj nije ostalo ništa mjerljivo i dalje je na tom popisu. Uz uključen exclusions.requireReason isključenje koje ne navodi razlog jest nalaz: upozorenje u ploči Problems na njegovu retku i neuspjeh naredbe Check Coverage Thresholds. Exclude Selection from Coverage tada prvo traži razlog i zapisuje ga uz oznaku ili kao Justification atributa; ako se upit odbaci ili ostavi prazan, ništa se ne isključuje.
Screenshot pending — add assets/img/justified-exclusions.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/vs-justified-exclusions.png (see SCREENSHOTS.md).12a. Opisuje li ova pokrivenost još uvijek ovu datoteku?
Pokrivenost pročitana iz datoteke traga opisuje izvorni kod onakav kakav je bio kad su se testovi izvodili, a većina formata ne kaže o kojoj se verziji radilo. Zato je svaka datoteka u ploči Pokrivenost u jednom od tri stanja:
- ✓ Provjereno — datoteka traga bilježi što je pisalo u svakom mjerenom retku i to se i dalje podudara s datotekom.
- Bez oznake — nije opovrgnuto. Ništa ne proturječi pokrivenosti i ništa je ne potvrđuje. To je uobičajeno stanje.
- ⚠ Opovrgnuto — sama datoteka opovrgava svoju pokrivenost. Redak je zasivljen, a opis govori što je pronađeno.
Samo dva formata mogu zaslužiti kvačicu jer samo dva bilježe išta o izvornom kodu koji su mjerila: lcov zapisan uz --checksum (u geninfo zadano isključeno; dokumentirana mu je svrha upravo spriječiti spajanje pokrivenosti dviju verzija datoteke) i GNATcoverage XML, koji ugrađuje tekst svakog mjerenog retka. Uključiti tu lcov opciju se isplati.
Upozorenju ne treba ni jedno ni drugo i radi sa svakim formatom: pokrivenost zabilježena iza kraja datoteke, imenovana funkcija koja više nije ondje gdje je izvještaj smješta, ili izvršeni retci koji su u datoteci prazni. Vremenske oznake same nikad nisu dovoljne — git checkout mijenja svaku bez promjene ijednog bajta — pa je promijenjena vremenska oznaka najviše razlog da se pogleda ponovno. Provjera se izvodi pri učitavanju pokrivenosti i ponovno kad god se datoteka spremi ili promijeni na disku, tako da oznaka prati datoteku: uređivanje koje proturječi izvođenju postavlja je, checkout koji vraća izmjerenu verziju uklanja je. Opis kaže točno što je to dokazalo. Postavite staleWarning.enabled na false da sve to isključite.
12b. Neizmjereno naspram nepokrivenog
Datoteka koju izvođenje nikad ne spominje je neizmjerena: nijedan je test nije učitao, pa nijedan alat nije zapisao redak o njoj. To nije isto što i nepokrivena — izmjerena, s nula pogodaka — a proširenje nikad nije ocjenjivalo odsutnu datoteku kao 0%. Ono što nije činilo, do 0.2026.69, bilo je uopće prikazati odsutne: modul bez ijednog testa nikad se nije pojavio u stablu, ukupnim brojevima ni provjeri pragova, a čitatelj je vidio „92%“ za projekt kojemu polovica datoteka nikad nije bila izvršena.
Sada, uz učitano izvođenje, stavka statusne trake po datoteci kaže nije izmjereno za izvornu datoteku vrste koju samo izvođenje mjeri, a koju izvođenje ne sadrži — „vrste koju izvođenje mjeri“ znači da ima jednu od ekstenzija datoteka koje je izvođenje mjerilo, pa su zaglavlja i izvori C projekta kandidati, a njegove Python skripte nisu. Sve iznad toga uključuje se po želji kroz fuciniCoverage.unmeasured.mode:
off(zadano) — ništa se drugo ne mijenja.list— prikaz Coverage dobiva grupu Neizmjereno na dnu koja imenuje svaku takvu datoteku, a svaki je redak otvara; rezultat učitavanja ih broji; značke ih označavaju s?u Exploreru; afuciniCoverage.threshold.unmeasuredFilesmože oboriti Check Coverage Thresholds kad ih je više od broja koji postavite. Nijedan se postotak ne pomiče.count— sve što činilist, a uz to se svaka neizmjerena datoteka broji protiv izvođenja kao nepokrivena datoteka svojih redaka koda, pa statusna traka, pragovi, značke, povijest, svaki izvoz i prikaz Test Coverage pokazuju niži broj. Datoteka se crta kao neizmjerena gdje god se pojavi, njezine trake u rubu kažu „nije izmjereno“ umjesto „nikad se nije izvršilo“, a provjera nepodudaranja pušta je na miru — ne postoji mjerenje kojemu bi njezin sadržaj mogao proturječiti.
{
"fuciniCoverage.unmeasured.mode": "list",
"fuciniCoverage.threshold.unmeasuredFiles": 0
}
Datoteke zaglavlja poznati su lažni pozitiv u C-u: pripadaju obitelji ekstenzija izvođenja, a nijedna ih datoteka traga nikad neće imenovati, jer se zaglavlje samo za sebe ne prevodi ni u što. fuciniCoverage.unmeasured.exclude zato zadano izostavlja **/*.h, **/*.hpp, **/*.hh, **/*.inl i **/*.d.ts, u istoj glob sintaksi kao fuciniCoverage.ignore; dodajte port za platformu koji se ovdje ne gradi ili generirane zamjenske datoteke, i ispadaju iz popisa, brojanja i stanja statusne trake. Datoteka koju ignore imenuje također se nikad ne naziva neizmjerenom — izostaviti je i bila je svrha. threshold.unmeasuredFiles zadano je -1, što ne provjerava; 0 pada čim ijednu datoteku vrste koju izvođenje mjeri nijedan test nije učitao, a vrijedi samo dok je unmeasured.mode list ili count.
13. HTML izvještaji
- Generate Full HTML Report — samostalno generiran, višestranični izvještaj po direktoriju. Izlaz ide u
htmlReport.outputDir, ili u globalnu pohranu proširenja ako nije postavljeno. - Open Annotated Source — jednodatotečni prikaz s napomenama. Usmjerite
externalHtmlReport.dirna unaprijed izrađeni direktorijllvm-cov show --format=htmlkako biste umjesto ugrađenog rendera koristili te stranice. - Export Fucini JSON — potpuni normalizirani model za vaše vlastite alate.
- Export Coverage Report... — izvođenje kao CSV (po datoteci ili po funkciji), Markdown sažetak, LCOV datoteka traga, Cobertura XML, SARIF, ili samostalan SVG bedž za vaš README. Dostupno i s gumba pokraj Generate Full HTML Report u prikazu Covered Files. Sve osim CSV-ova gubi podatke — MC/DC, regije i instancijacije nemaju gdje stati u LCOV, Coberturu ni SARIF — pa Fucini JSON i CSV-ovi ostaju formati koji nose svaku metriku.
- Copy Uncovered Lines — Markdown sažetak svake praznine, spreman za lijepljenje u PR.
U Visual Studiju. Grupa Reports u Tools → Coverage Studio: Show Annotated Source otvara aktivni dokument kao stranicu u prostoru dokumenata — svaki redak u svojoj boji, nalazi uz njega — pomicanu s uređivačem u oba smjera; Open HTML Report piše jednostranični izvještaj u htmlReport.outputDir (ili %LOCALAPPDATA%\Fucini\CoverageStudio\html-report) i otvara preglednik; Generate Full HTML Report ondje piše indeks po mapi i stranicu po datoteci; Export Coverage Report… nudi istih osam formata i pita kamo spremiti; Generate Coverage Badge piše značku onamo gdje kaže badge.outputPath, nakon svakog učitavanja uz badge.autoUpdate. Anotiranoj stranici treba WebView2, kao i prozoru Coverage; izvještajima na disku ne treba.
Screenshot pending — add assets/img/vs-annotated-source.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/report.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/report-directory-summary.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/report-file-summary.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/report-coverage-gaps.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/report-mcdc-detail.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/export-picker.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/annotated-source.png (see SCREENSHOTS.md).Označeni izvorni kod naspram običnog izvornog koda
Open Annotated Source zamjenjuje aktivnu karticu web-prikazom pokrivenosti u boji za tu datoteku, u istom stupcu; Open Annotated Source to the Side radi isto, ali podijeljeno, tako da izvorni kod i označeni prikaz stoje jedan pored drugog. Za izmjenu na istom mjestu — korisno na malom zaslonu gdje podjela čini svaku ploču preuskom — upotrijebite Toggle Annotated Source: ona izmjenjuje aktivnu karticu između ta dva prikaza, pamteći koji trenutačno gledate. Iz samog označenog prikaza, Show Source vraća izravno na obični uređivač za tu datoteku.
Koji HTML zapravo vidite ovisi o externalHtmlReport.dir: kad je postavljen i ondje već postoji stranica koja odgovara aktivnoj datoteci (llvm-cov raspoređuje stranice po datoteci kao <naziv-repozitorija>/<relativna-putanja>.html, pa mapu s nazivom repozitorija izvještaja nikad nije potrebno konfigurirati), prikazuje se ta stranica generirana alatnim lancem umjesto ugrađenog rendererera — njezine lokalne poveznice/stilovi prepisuju se kako bi radili unutar web-prikaza, a sadrži detalje koje ugrađeni prikaz ne reproducira (MC/DC prikazi proširenja, isticanje regija, sažeci direktorija). Nema odgovarajuće stranice za tu datoteku, ili je postavka ostavljena praznom? Tada se koristi ugrađeni renderer. Proširenje samo čita ovaj direktorij — nikad u njega ne piše.
Značka pokrivenosti za README
Generate Coverage Badge zapisuje SVG u stilu shieldsa za aktivno izvođenje u radni prostor — badge.outputPath, zadano coverage-badge.svg, relativno prema mapi radnog prostora ili apsolutno, s istim varijablama kao svaka druga postavka putanje — i nudi njegovo otvaranje. To je obična datoteka u vašem repozitoriju, pa je README ugrađuje bez ikakvog servisa iza nje, bez obilaska preko shields.io, a radi i u repozitoriju odsječenom od mreže:

badge.metric bira što značka prikazuje: lines (s oznakom coverage), branches, mcdc ili weighted, isti kompozitni rezultat koji prikazuje statusna traka, s oznakom score. Izvođenje bez podataka za odabranu metriku dobiva sivi n/a umjesto crvenih 0%. Boja prati vaše vlastite razine colorScale.*: lowColor ispod lowThreshold, midColor do highThreshold, highColor odatle nadalje. S uključenim badge.autoUpdate značka se iznova zapisuje nakon svakog uspješnog učitavanja, tiho, a izlazni kanal bilježi svaki zapis kao [FUCINI_BADGE] — zadano isključeno jer pri svakom učitavanju piše u radni prostor. Predajte SVG zajedno s kodom i slika na stranici repozitorija prati broj u uređivaču.
{
"fuciniCoverage.badge.outputPath": "docs/coverage-badge.svg",
"fuciniCoverage.badge.metric": "weighted",
"fuciniCoverage.badge.autoUpdate": true
}
14. Povijest i trendovi
Omogućite history.enabled za lokalno pohranjivanje izvođenja (zadržavajući history.retention njih). Zatim dobivate strelicu trenda (▲/▼) u statusnoj traci, grafikon trenda u prikazu Coverage i dvije naredbe usporedbe: Compare with Last Run i Compare Two History Runs, od kojih svaka daje diff regresije/poboljšanja po datoteci.
U Visual Studiju. Svako se učitavanje uspoređuje s prethodnim: trokut u rubnom stupcu na svakom retku koji se počeo ili prestao izvršavati (sinceLastRun.enabled), trend uz rezultat u statusnoj traci i Compare with Last Run za datoteke čiji su se brojevi pomaknuli. Uz history.enabled izvođenja se čuvaju pod %LOCALAPPDATA%\Fucini\CoverageStudio\history, njih history.retention, pa usporedba preživljava ponovno pokretanje, grafikon trenda ima što crtati, a Compare Two History Runs… bira bilo koja dva od njih.
Screenshot pending — add assets/img/history-compare.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/since-last-run.png (see SCREENSHOTS.md).Grafikon trenda
Ispod alatne trake prikaza Coverage, s dva spremljena izvođenja ili više, pokrivenost redaka iz povijesti kao crta, od najstarijeg do najnovijeg, najnovijih trideset: točka po izvođenju koja pri prelasku mišem kaže svoj datum i brojku, a uz nju posljednja brojka sa strelicom smjera od prvoga. Okomita ljestvica vlastiti je raspon izvođenja, pa tim na 92–94% vidi pomak, a ne ravnu crtu ispod 100. Oba izdanja crtaju ga iz iste povijesti.
Screenshot pending — add assets/img/trend-chart.png (see SCREENSHOTS.md).
Sesije pokrivenosti
Jedno testno izvođenje rijetko pokriva sve što je promjena dotaknula: jedinični testovi izvedeni ovdje, integracijski skup ondje, prolazak kroz sučelje s uključenom pokrivenošću negdje drugdje. Start Coverage Session pretvara učitavanja koja slijede u jedan zbroj — svako se izvođenje dodaje prethodnom redak po redak kao unija, redak koji je bilo koje od njih izvršilo pokriven je, a brojevi se zbrajaju — pa rub uređivača, stablo i rezultat pokazuju što su sva zajedno dosegnula. Izvođenje na zaslonu, ako ga ima, prvo je u sesiji. Traka iznad stabla kaže koliko izvođenja i od kada te završava sesiju; End Coverage Session radi isto, a sljedeće učitavanje opet stoji samo. U Visual Studiju jedna stavka pod Tools → Coverage Studio započinje sesiju, a označena je završava.
Screenshot pending — add assets/img/coverage-session.gif (see SCREENSHOTS.md).
CI osnovica: gdje sam u odnosu na main?
Compare with Last Run odgovara što je učinila vaša posljednja promjena; prije pull requesta pitanje je gdje stojite u odnosu na main, a odgovor je na poslužitelju za izgradnju. baseline.report imenuje izvještaj koji objavljuje izgradnja grane main, a svako se učitavanje uspoređuje s njim: kartica u statusnoj traci nosi razliku u jednom retku — vs CI baseline: 84.20% → 85.10% (+0.90%), 3 file(s) moved — a Compare with CI Baseline navodi datoteke koje su se pomaknule, datoteku po datoteku, istim riječima kao Compare with Last Run. U Visual Studiju naredba je pod Tools → Coverage Studio i dohvaća ili čita izvještaj kad to zatražite. Tri načina da ga imenujete, u .vscode/settings.json:
- URL koji poslužuje CI. GitLab drži posljednje artefakte posla grane na stabilnoj adresi; token ostaje izvan datoteke postavki kroz
${env:…}uremote.headers. Jenkins:https://jenkins.example.com/job/app/job/main/lastSuccessfulBuild/artifact/coverage/lcov.info. TeamCity:https://tc.example.com/repository/download/App_Main/.lastSuccessful/coverage/lcov.infosAuthorization: Bearer ${env:TC_TOKEN}. URL se dohvaća i predmemorira točno kao URL izcoverageFile.paths(ETag,remote.refreshMinutes). - Datoteka koju je cjevovod kopirao na dijeljeni resurs — apsolutna putanja poput
\\build\drops\app\main\coverage.cobertura.xml. - Preuzeti artefakt koji se drži pod mapom, recimo
ci/main.lcov.info(stavite mapu u.gitignore) — putanja relativna prema mapi.
{
"fuciniCoverage.baseline.report": "https://gitlab.example.com/api/v4/projects/42/jobs/artifacts/main/raw/coverage/lcov.info?job=test",
"fuciniCoverage.remote.headers": ["PRIVATE-TOKEN: ${env:GITLAB_TOKEN}"]
}
Bilo koji format koji čitač poznaje bit će dovoljan. Putanja koju je CI zapisao relativno prema svom checkoutu — src/Billing/Invoice.cs, kako je Coverlet zapisuje na izvoditelju — smješta se pod ovu mapu prije usporedbe, da se susretne s datotekom koju je lokalno izvođenje razriješilo; apsolutna putanja s drugog računala ne odgovara ničemu, pa neka cjevovod zapisuje relativne putanje. Osnovica koja se ne može dohvatiti ni pročitati redak je u oknu Output, nikad neuspjelo učitavanje.
Screenshot pending — add assets/img/ci-baseline.gif (see SCREENSHOTS.md).main.
Artefakt je zip, a i to se čita. GitHub i GitLab predaju artefakt kao arhivu, što god bilo stavljeno u njega. Izvještaj u arhivi imenujte iza znaka #: član se pronalazi po putanji ili po njezinu kraju; bez # to je jedina datoteka arhive, ili jedina koja izgleda kao izvještaj, a gdje ih je više, okno Output ih imenuje. Isto vrijedi za zip koji ste preuzeli (ci/artifact.zip#lcov.info) i, u VS Codeu, za URL u coverageFile.paths. Token ide poslužitelju za koji je postavljen i nikamo dalje: preusmjeravanje na pohranu koja drži arhivu slijedi se bez njega.
{
"fuciniCoverage.baseline.report": "https://api.github.com/repos/acme/app/actions/artifacts/1234567/zip#coverage/lcov.info",
"fuciniCoverage.remote.headers": ["Authorization: Bearer ${env:GITHUB_TOKEN}"]
}
14a. Za AI agente: pokrivenost na zaslonu
Agent koji piše testove može ih pokrenuti i pročitati postotak. Ono što sam ne može jest pitati što uređivač zna: koji se retci ove funkcije nikad nisu izvršili, koja strana koje grane, koji testovi izvršavaju redak, je li diff koji je upravo napisao pokriven. Šest alata odgovara upravo na to, riječima po kojima agent može postupiti, iz izvođenja koje je učitano — ista isključenja, isto premapiranje, isti brojevi kao na zaslonu. Tako agent kojem je rečeno da pokrije praznine u funkciji i recenzent koji gleda rub uređivača govore o istim retcima.
| Alat | Na što odgovara |
|---|---|
coverage_summary | Zbrojevi izvođenja po metrici i datoteke najdalje od pokrivenosti. Prvo što treba pitati. |
coverage_gaps | Što se nikad nije izvršilo u datoteci, funkciji ili rasponu redaka: nepokriveni retci, krakovi grana koji nisu uzeti, MC/DC uvjeti bez svojeg para, mutanti koji su preživjeli. |
tests_for_line | Koji su testovi izvršili redak, gdje izvještaj to kaže — izvođenje po testu. |
patch_coverage | Pokrivenost diffa — radno stablo prema refu ili predana zakrpa — i njegovi retci koji se nikad nisu izvršili. |
coverage_delta | Što se pomaknulo od prethodnog izvođenja: zbrojevi i datoteke koje su dobile ili izgubile. |
test_run_command | Naredba koja izvodi testove ovog radnog prostora s uključenom pokrivenošću. Agent je pokreće; uređivač sam ponovno učitava izvještaj. |
Vlastiti agent VS Codea ima ih kao alate, bez ikakvog podešavanja. Svi ostali agenti — svaki klijent koji podržava MCP, Model Context Protocol — dolaze do njih preko poslužitelja koji uređivač pokreće kad je mcp.enabled uključen, jednako u VS Codeu i u Visual Studiju. Copy MCP Server Configuration stavlja unos za klijenta u međuspremnik, onako kako ga VS Code i Visual Studio čitaju u datoteci mcp.json; klijent koji vanjski ključ naziva mcpServers uzima isti unos pod tim imenom.
Screenshot pending — add assets/img/mcp-config.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/vs-mcp-config.png (see SCREENSHOTS.md).{
"servers": {
"fucini-coverage": {
"type": "http",
"url": "http://127.0.0.1:39217/mcp",
"headers": { "Authorization": "Bearer …" }
}
}
}
- Isključen je dok ga ne uključite i sluša samo na
127.0.0.1: ništa izvan ovog računala ne dolazi do njega. - Poziv mora nositi vaš token, izrađen jednom i sačuvan za vas; bez njega odgovor je 401. Kopirana konfiguracija nosi token: držite je izvan repozitorija.
- Poziv koji je poslala web-stranica — to piše u njegovu
Origin— odbija se, što god nosio. - Čita izvođenje koje je učitano i ne zapisuje ništa. Testno izvođenje se imenuje, ne pokreće: agent pokreće naredbu u vlastitom terminalu.
Port je mcp.port, 39217 ako nije postavljen. Gdje je taj zauzet — drugi prozor, drugo izdanje uz ovo — koristi se sljedeći slobodni, a kopirana konfiguracija imenuje onaj koji radi. Okno Output kaže gdje poslužitelj sluša ([FUCINI_MCP]) i zašto nije mogao ([FUCINI_MCP_001]). Ono što plan ne uključuje — imena testova, MC/DC pojedinosti — alati broje, a ne navode poimence, kao i opis pri prelasku mišem.
15. Referenca naredbi
U Visual Studiju. Svaka je naredba pod Tools → Coverage Studio, nazvana kao u tablici bez prefiksa Fucini Coverage:; alatna traka prozora Coverage i izbornik desnog klika na redak imaju one koje ondje pripadaju, a izbornik desnog klika u prozoru koda ima tri koje djeluju na uređivač: Run This Test with Coverage, Show Tests That Ran This Line i Exclude Selection from Coverage. One s tipkama dvostruki su akordi nakon Ctrl+Shift+U: R ponovno učitava, N i P idu na sljedeći i prethodni nepokriveni redak, B na sljedeću djelomično testiranu odluku, T navodi testove koji su izvršili redak, X isključuje označeno — ne VS Codeov Alt+N, jer u Visual Studiju Alt i slovo otvaraju izbornik. Promijenite ih pod Tools → Options → Keyboard, gdje su navedene kao Coverage Studio: …. Nema u ovom izdanju: ploča Test Coverage VS Codeov je API — izvođenje je umjesto toga u prozoru Coverage — a Solution Explorer ne može prikazivati značke. Samo u ovom izdanju: Run Native Project with Coverage, za početni C++ projekt.
U Visual Studiju: gdje je što. Prozor Coverage nalazi se pod View → Other Windows → Coverage, a prvi je i pod Tools → Coverage Studio, gdje je svaka naredba ovog izdanja, u grupama: učitavanje i ponovno učitavanje, praćenje datoteke, dvije naredbe kopiranja i kartice; Run Tests with Coverage, Run Native Project with Coverage i Collect Coverage in Test Explorer…; Next i Previous Uncovered te djelomično testirane odluke; bojanje, brojači izvršavanja i načini rada rubnog stupca; izvor pokrivenosti datoteke, testovi koji su izvršili redak, jedan test s pokrivenošću, dva načina isključivanja; Compare with Last Run, Compare Two History Runs…, Compare with CI Baseline, sesija pokrivenosti i Check Coverage Thresholds; grupa Reports — Show Annotated Source, Open HTML Report, Generate Full HTML Report, Export Coverage Report… i Generate Coverage Badge; zatim Getting Started, pragovi usklađenosti i Licence…. Vlastita alatna traka prozora ima pet najčešće korištenih: Load Coverage, Reload, Toggle Coverage Painting, Copy Coverage Summary i pragove usklađenosti; ispod njih perspektiva, filtar i sortiranje te polje za pretraživanje; ispod toga trend. Zadržite pokazivač na retku stabla i pritisnite njegov ⋯ za izbornik retka — otvori datoteku, otvori njezinu mapu, kopiraj putanju, apsolutnu ili relativnu, s bilo kojom vrstom kose crte, isključi je iz pokrivenosti. Na desnom kraju statusne trake su rezultat izvođenja i rezultat otvorene datoteke, s trendom od posljednjeg izvođenja; Show Coverage Card i Show Coverage Card for This File otvaraju kartice iza njih, iste koje VS Code prikazuje kad se pokazivač zaustavi na njegovoj stavci statusne trake.







Screenshot pending — add assets/img/statusbar-and-toolbar.gif (see SCREENSHOTS.md).
Screenshot pending — add assets/img/statusbar-menu.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/worst-functions.png (see SCREENSHOTS.md).| Naredba | Što radi |
|---|---|
| Load Coverage | Otkrij i učitaj pokrivenost za radni prostor. Zadano Alt+Shift+R (Ctrl+Alt+R na macOS-u). |
| Pick Coverage File | Odaberite datoteke traga — jednu, više njih ili svaki put još jednu; odabiri se zbrajaju, spajaju i zapisuju u coverageFile.paths pa se otada učitavaju sami. |
| Show Loaded Coverage Files | Popis datoteka traga u aktivnom izvođenju. Prikaz Pokrivenost također ih popisuje, svaku s gumbom za uklanjanje i gumbom za odabir pokraj njih. |
| Toggle Tracefile Watch | Pratiti promjene datoteka traga i automatski ponovno učitati. |
| Run Tests with Coverage | Prepoznaj pokretač testova, pokreni ga s pokrivenošću u zadatku terminala, učitaj što zapiše i ponudi dodavanje putanje u postavke. |
| Run This Test with Coverage | Test pod kursorom — metoda, klasa ili blok describe, ili datoteka — izveden receptom suženim na njega, zatim učitan kao svako izvođenje. Također u kontekstnom izborniku uređivača. |
| Show Tests That Ran This Line | Gdje izvještaj kaže koji su testovi što izvršili, navedi testove koji su izvršili redak pod kursorom, najzaposleniji prvi, i otvori odabrani ondje gdje je napisan. |
| Run Tests Affected by My Changes… | Navedi testove koji su izvršili redak koji radno stablo mijenja prema testImpact.baseRef, otvori odabrani ili izvedi samo te testove gdje izvještaji potječu iz izvođenja po testu. |
| Show Minimal Test Set… | Najmanje testova koji i dalje izvršavaju svaki redak koji skup izvršava, zatim testovi koji ne dodaju nijedan vlastiti redak. |
| Run App with Coverage… | Pokreni .NET aplikaciju mape pod dotnet-coverage i, kad se zatvori, učitaj ono kroz što ste prošli. |
| Run Mutation Tests Here | Mutiraj funkciju u kojoj je kursor — ili označeno, ili datoteku — alatom Stryker.NET, StrykerJS ili PIT i učitaj izvještaj uz pokrivenost na zaslonu. |
| Exclude This File from Coverage / Exclude from Coverage | Stavi otvorenu datoteku — ili, na retku prikaza Coverage, datoteku ili /** mape — u fuciniCoverage.ignore u postavkama mape, jednom. |
| Exclude Selection from Coverage | Zapiši isključenje ondje gdje je kod: [ExcludeFromCodeCoverage] iznad .NET člana, LCOV_EXCL_LINE u jednom retku, LCOV_EXCL_START/STOP oko više njih, znakom komentara same datoteke. Također žaruljica i kontekstni izbornik uređivača. |
| Start Coverage Session / End Coverage Session | Dok sesija traje, svako se učitavanje dodaje prethodnom kao unija; traka iznad stabla broji izvođenja i završava je. |
| Next / Previous Uncovered | Skači između nepokrivenih regija. Zadano Alt+N / Alt+P (Ctrl+Alt+N / Ctrl+Alt+P na macOS-u). |
| Choose Editor Gutter Mode... | Isključeno, trake samo na nepokrivenim retcima, crveno-jantarno-zelene trake ili toplinska karta broja pogodaka u rubu uređivača. |
| Cycle Editor Gutter Mode | Jedan korak dalje kroz off, uncovered, coverage i heatmap — Alt+G ili gumb načina u statusnoj traci. |
| Choose Coverage Source for This File... | Kad otvorenu datoteku mjeri više od jednog učitanog izvještaja, odaberite iz kojeg dolaze njezini brojevi — za datoteku, njezinu mapu ili uzorak; zapisuje pravilo coverageFile.sources. |
| Clear Coverage Source for This File... | Uklanja pravila coverageFile.sources koja se odnose na otvorenu datoteku. |
| Toggle Inline Hit Counts | Prikaži ili sakrij brojeve izvršavanja ×N iza svakog retka — prebacuje hitCounts.inline. |
| Show in Test Coverage View | Objavi aktivno izvođenje u vlastitu ploču Test Coverage VS Codea (i uz isključen testCoverage.publish) i otvori je. |
| Suggest Path Remap Rule | Izvedi pravilo pathRemap koje bi nepodudarene datoteke aktivnog izvođenja podudarilo s radnim prostorom i ponudi njegovo dodavanje. |
| What Community Includes | Svako ograničenje i svaka uskraćena značajka besplatne razine u jednom popisu, s time koliko je svakog ograničenja iskorišteno. |
| Open HTML Report | Otvori generirano statično izvješće. |
| Generate Full HTML Report | Izgradi izvješće s više stranica. |
| Open Annotated Source / …to the Side | Prikaz pokrivenosti s bilješkama za datoteku. |
| Toggle Annotated Source | Prebaci između izvora i označenog prikaza. Zadano Alt+A (Ctrl+Alt+A na macOS-u). |
| Show Worst-Covered Files / Folders / Functions | Quick Pick poredan od najnižega. |
| Copy Uncovered Lines | Markdown sažetak svakog nepokrivenog raspona. |
| Compare Two History Runs / with Last Run | Regresijska razlika po datoteci — dva izvođenja koja je povijest sačuvala, ili izvođenje na zaslonu prema onom koje je zamijenilo. |
| Compare with CI Baseline | Učitano izvođenje prema izvještaju koji imenuje baseline.report — onom grane main iz CI-ja, URL-u ili preuzetom artefaktu — datoteku po datoteku. |
| Show Indirect Coverage Changes… | Retci čija se pokrivenost pomaknula iako ih nitko nije uređivao, prema CI osnovici ili prethodnom izvođenju, po datoteci. |
| Check Coverage Thresholds | Ocijeni provjere usklađenosti. |
| Export Fucini JSON | Izvezi trenutačno izvođenje kao Fucini JSON. |
| Export Coverage Report... | Odaberite format — CSV, Markdown, LCOV, Cobertura XML, SARIF ili SVG bedž — i odredište. |
| Generate Coverage Badge | Zapiši SVG značku za aktivno izvođenje u badge.outputPath, s prikazom badge.metric, i ponudi njezino otvaranje. |
| Copy MCP Server Configuration | Stavi u međuspremnik ono što MCP klijentu treba da pita o pokrivenosti na zaslonu — adresu poslužitelja i vaš token; ako je poslužitelj isključen, ponudi njegovo uključivanje. |
| Show Status Bar Menu | Otvori izbornik brzih radnji. |
| Browse for External HTML Report / Full Report Output Dir… | Postavi direktorije izvješća putem birača. |
16. Referenca postavki
Potpuna, kategorizirana tablica postavki — svaka opcija sa zadanom vrijednošću — nalazi se na stranici Značajke i postavke. Svi ključevi imaju prefiks fuciniCoverage..
Vrijedi istaknuti: fuciniCoverage.language fiksira vlastito korisničko sučelje ovog proširenja tijekom izvođenja (statusna traka, obavijesti, opisi, web-prikazi) na određeni jezik, neovisno o jeziku prikaza VS Codea — zadano je auto, a isporučuje se s paketima za svih 18 podržanih jezika. To ne mijenja stavke palete naredbi ni oznake u postavkama, koje VS Code i dalje određuje prema vlastitom jeziku prikaza.
U Visual Studiju. Isti fuciniCoverage.* ključevi, čitani iz najviše četiri datoteke, pri čemu kasnija pobjeđuje: vlastite korisničke postavke VS Codea ako je VS Code na računalu — čitaju se, nikad ne pišu, pa vaše boje i pragovi dolaze s vama; %APPDATA%\Fucini\CoverageStudio\settings.json, korisničke postavke ovog izdanja; .vscode\settings.json u mapi ili uz rješenje, pa je repozitorij postavljen za VS Code postavljen i za Visual Studio; i fucini-coverage.json u korijenu rješenja, za tim koji radije ne bi držao mapu .vscode u .NET repozitoriju — čita ga i izdanje za VS Code. Zupčanik na alatnoj traci prozora Coverage otvara prozor postavki koji piše korisničku datoteku ili datoteku mape koja postoji, kako kaže njegov izbornik Write changes to, i čuva komentare datoteke koju uređuje. fuciniCoverage.language ondje radi na isti način; izbornici prate jezik samog Visual Studija.
17. Kodovi pogrešaka
Dijagnostika ide u izlazni kanal Fucini Coverage (View → Output → Fucini Coverage), svaka sa stabilnim kodom FUCINI_*.
U Visual Studiju. Isti kodovi idu u okno Fucini Coverage prozora Output (View → Output) i čuvaju se u %LOCALAPPDATA%\Fucini\CoverageStudio\coverage-studio.log, za pitanje koje stigne nakon što se IDE zatvori. Tri koja se pojavljuju: ništa nije označeno iako okno kaže da su datoteke učitane — način ruba je off, odaberite Show Coverage in Editor; FUCINI_REMAP_001 i informacijska traka — izvještaj imenuje putanje koje ovdje ne postoje, a okno predlaže pravilo pathRemap; prozor Coverage kaže da treba WebView2 — instalirajte Microsoft Edge WebView2 Runtime, oznakama u uređivaču on ne treba.
| Kôd | Značenje |
|---|---|
FUCINI_PARSE_001 | Nepodržan/neprepoznat format pokrivenosti — nijedan parser nije odgovarao datoteci. |
FUCINI_PARSE_010 | Datoteka lcov nije imala zapise SF. |
FUCINI_PARSE_020 | llvm-cov JSON nevaljan, nedostaje data[] ili nije sadržavao datoteke. |
FUCINI_PARSE_030 | Nedostaje Cobertura korijen <coverage> ili je XML nevaljan. |
FUCINI_PARSE_040 | Nedostaje JaCoCo korijen <report> ili nema izvornih datoteka. |
FUCINI_PARSE_050 | Istanbul/SimpleCov JSON nevaljan ili nije sadržavao datoteke. |
FUCINI_PARSE_060 | SimpleCov JSON nevaljan ili nedostaje polje files na najvišoj razini. |
FUCINI_PARSE_070 | Go profil bez mode: zaglavlja ili bez blokova pokrivenosti. |
FUCINI_PARSE_080 | Nedostaje Clover korijen <coverage> ili <project>, ili u njemu nema datoteka. |
FUCINI_PARSE_090 | Nedostaje OpenCover korijen <CoverageSession> ili u njemu nema datoteka. |
FUCINI_PARSE_100 | coverage.py JSON nije valjan ili nema files objekt na najvišoj razini. |
FUCINI_PARSE_110 | gcov/gcovr JSON nije valjan ili nema files polje na najvišoj razini. |
FUCINI_PARSE_120 | GNATcoverage XML bez elementa <source> ili index.xml čiji xi:include nikad nisu razriješeni — umjesto toga učitajte *.xml datoteke po izvoru. |
FUCINI_PARSE_130 | Nedostaje korijenski element <BullseyeCoverage> ili u njemu nema elemenata <src>. |
FUCINI_PARSE_140 | Nedostaje korijenski element <CoverageDSPriv>, nema tablice <SourceFileNames> za razrješavanje redaka ili nema podataka o recima. |
FUCINI_PARSE_150 | Neispravan Xcode JSON pokrivenosti ili nedostaje targets polje najviše razine. |
FUCINI_PARSE_160 | Nedostaje SonarQubeov korijenski element <coverage> ili u njemu nema elemenata <file>. |
FUCINI_PARSE_170 | Neispravan Coveralls JSON ili nedostaje source_files polje najviše razine. |
FUCINI_LOAD | Učitavanje je prekinuto iz svoje obavijesti o napretku; prethodno izvođenje, ako ga ima, ostaje učitano. |
FUCINI_REMOTE_001 | URL iz coverageFile.paths nije bilo moguće dohvatiti, s razlogom; umjesto toga učitava se zadnja preuzeta kopija. Obični retci [FUCINI_REMOTE] bilježe svako preuzimanje i svaku provjeru bez promjene (304). |
FUCINI_REMOTE_002 | URL iz coverageFile.paths nije dao potpun odgovor u 30 sekundi — najčešće proxy ili VPN koji prihvati vezu i zatim šuti; umjesto toga učitava se zadnja preuzeta kopija. |
FUCINI_REMOTE_003 | URL iz coverageFile.paths odgovorio je HTML stranicom umjesto tracefileom — najvjerojatnije stranicom za prijavu. Stranica se ne sprema u predmemoriju, umjesto nje učitava se zadnja preuzeta kopija; provjerite token u remote.headers. |
FUCINI_REMAP_002 | Predloženo je pravilo pathRemap za putanje koje je učitavanje ostavilo nepodudarenima, s time koliko ih objašnjava — ili se nijedno nije moglo izvesti, ili je izvedeno pravilo već u postavci i nije ih razriješilo. |
FUCINI_REMAP_003 | Predloženo pravilo dodao je u fuciniCoverage.pathRemap Apply Suggested Remap i pokrivenost se ponovno učitava. |
FUCINI_GITDIFF_001 | Git proširenje nije dostupno; pokrivenost diffa se preskače i prikazuje se cijeli prolaz. |
FUCINI_GITDIFF_002 | gitDiff.baseRef počinje s -, čime nijedna git referenca ne može početi (git bi to pročitao kao opciju); pokrivenost diffa se preskače i prikazuje se cijeli prolaz. |
FUCINI_IGNORE | Koliko je datoteka fuciniCoverage.ignore izostavio iz izvođenja, i koje. |
FUCINI_UNMEASURED_001 | Datoteke vrste koju izvođenje mjeri, a nijedan ih test nije učitao, jedna po retku. |
FUCINI_UNMEASURED_002 | Više od 5.000 datoteka radnog prostora podudarilo se s jednom od ekstenzija izvođenja; za popis Neizmjereno razmotreno je samo prvih 5.000. |
FUCINI_UNMEASURED_003 | U načinu count neke su neizmjerene datoteke popisane, ali se ne broje: dosegnuta je gornja granica čitanja (2.000 datoteka ili 50 MB po učitavanju). |
FUCINI_UNMEASURED_004 | Neizmjerenu datoteku nije bilo moguće pročitati; popisana je, ali se ne broji. |
FUCINI_TESTCOVERAGE | Koliko je datoteka objavljeno u prikaz Test Coverage VS Codea. |
FUCINI_BADGE | Značka je zapisana, s putanjom, oznakom i vrijednošću. |
FUCINI_BADGE_001 | Značku nije bilo moguće zapisati, s razlogom. |
FUCINI_WORKSPACE | Mapa je dodana radnom prostoru ili uklonjena iz njega; pokrivenost se ponovno otkriva. |
FUCINI_VARIABLES | Što je svaka ${command:…} u postavkama putanja odgovorila ili zašto je ostala kako je napisana: naredba nije uspjela, nije vratila ništa upotrebljivo ili radni prostor nije pouzdan. |
FUCINI_WATCH | Što nadzornik radi: putanje koje nadzire, konfigurirana datoteka koja se pojavila, zadatak imenovan u watch.reloadAfterTasks koji je završio (s izlaznim kodom) i pokrenuo ponovno učitavanje, ili putanja pod files.watcherExclude koja se umjesto toga ispituje. |
18. Privatnost
Telemetrijom upravlja postavka telemetry.enabled opsega window. Prema zadanome je isključena. Dnevni sažetak i obavijest o uklanjanju uz to zahtijevaju da globalna postavka telemetry.telemetryLevel VS Codea dopušta telemetriju; signal o instalaciji i nekoliko malih događaja šalju se u svakom slučaju, kao i unos u evidenciji korištenja za instalaciju u probnom razdoblju ili na besplatnoj razini Community. Na razini Community Unlock Full Features mijenja ovu telemetriju za sve Pro značajke, uključujući MC/DC, na 30 dana, jednom po računalu — isključite je ponovno i vrijedi standardni skup Community; na plaćenu licencu ni u jednom slučaju ne utječe. Što se šalje, pogledajte u pravilima privatnosti.
Dvije stvari vrijedi znati jer po njima možete postupiti. Prva je vaš ID evidencije korištenja: u probnom razdoblju i na razini Community proširenje ga prikazuje pod Show License / Activation i na dnu odjeljka What Community Includes, gdje odabir tog retka kopira ID i otvara pravila. Evidencija vaše računalo poznaje po hashu i ni po čemu drugome, pa je taj ID jedini način da pitate što se u njoj čuva o vama, zatražite brisanje ili uložite prigovor — navedite ga i pronaći ćemo vaš redak; bez njega ne možemo. Druga je zapis o instalaciji: jedan redak, zapisan pri prvoj dojavi instalacije i sačuvan umjesto da se izbriše nakon 90 dana, koji sadrži identifikator instalacije, dan, mjesto na koje je razriješena njezina adresa, verzije i operacijski sustav — ne i samu adresu, niti išta o vašem kodu. Po njemu možemo reći koliko je instalacija bilo tijekom godina. Oboje je u cijelosti opisano u pravilima privatnosti i oboje brišemo na vaš zahtjev.

19. Evaluacija i aktivacija
Fucini Coverage Studio distribuira se kao evaluacijsko predizdanje. Pri prvom pokretanju traži se da pristanete na evaluaciju i probno razdoblje počinje — sve su značajke dostupne tijekom 14-dnevnog probnog razdoblja, računajući od prve upotrebe na toj instalaciji. Ne postoji fiksni datum nakon kojega bi išta prestalo raditi.
Od verzije 2.2026.2 probno razdoblje nove instalacije počinje čim proširenje jednom dosegne poslužitelj licenci; do tada radi na razini Community i to kaže. U razvojnom kontejneru ili Codespaceu probno razdoblje ne počinje — puni skup ondje otključava kôd pretplate, ključ ili 7-dnevna propusnica.
Kad probno razdoblje istekne, ništa nije zaključano: proširenje prelazi na besplatnu razinu Community. Da biste vratili puni skup, aktivirajte — aktivacija se povezuje s licencnim poslužiteljem i automatski primjenjuje vraćeni ključ, bez e-pošte i bez ključa koji biste prepisivali ručno:
Screenshot pending — add assets/img/licence-dialog.png (see SCREENSHOTS.md).- Pokrenite
Fucini Coverage: Show License / Activation(dostupno i s trake stanja kad probno razdoblje ili ključ istekne) i kliknite Request License… (ili Request Renewed Key… ako ste već aktivirali). - Potvrdite zahtjev. Ključ se izdaje automatski, a vaši se kontaktni podaci iz ranijeg zahtjeva ponovno koriste umjesto da se traže opet.
- To je sve. Aktivacijski ključ generira se i automatski upisuje u
fuciniCoverage.license.key. Traka stanja začas prelazi s probnog razdoblja na aktiviranu licencu.
Ručni put u jednoj slici: otvorite ploču licencije, odaberite Enter Key, zalijepite ključ iz e-pošte i natpis prelazi u „Activated”.
Screenshot pending — add assets/img/activate-key.gif (see SCREENSHOTS.md).Ako automatski zahtjev ikada zakaže (nema veze, problem s poslužiteljem): pokrenite Fucini Coverage: Copy Activation Request Code, pošaljite ga putem kontaktne stranice ili na info@fucini.consulting te zalijepite ključ FCK1.… koji primite natrag pomoću Fucini Coverage: Enter Activation Key (ili izravno u settings.json):
{ "fuciniCoverage.license.key": "FCK1.…zalijepite cijeli ključ…" }Naziv postavke je fuciniCoverage.license.key (opseg korisnik/globalno). Ključ je vezan uz vaš stroj i korisnika OS-a, može imati datum isteka te može omogućiti ili ograničiti pojedine značajke i ograničiti dnevni broj učitavanja pokrivenosti. Ako se prikaže „invalid for this machine”, zatražite novi ključ s ove instalacije — ključ izdan za drugi stroj ovdje nikada neće biti valjan.
U Visual Studiju. U tom izdanju nema besplatne razine: bez pretplate ništa se ne čita. S pretplatom plan ondje odlučuje o onome o čemu odlučuje u VS Codeu — značajka koju plan ne uključuje uskraćena je, a njezina naredba to kaže umjesto da se izvede. I ondje vrijedi najstarija verzija koju licencni poslužitelj još podržava: build stariji od nje dobiva jednom dnevno obavijest s datumom kada prestaje raditi, i do tada radi dalje. Rad izvan mreže nikad ne zaustavlja build.
Besplatna razina Community: tjedna kvota
Community nikad ne prestaje prikazivati pokrivenost. Oznake na margini, pregledno ravnalo, hoveri, CodeLens, prikaz Coverage, način rada watch, pokrivenost diffa i povijest uopće se ne broje, a učitavanje tracefilea naredbom ograničeno je samo na 25 dnevno. Mjeri se izlaz: po pet tjedno za otvaranje HTML izvještaja, izvoz, usporedbu dvaju izvođenja, provjeru pragova i prikaz anotiranog izvornog koda na mjestu.
Tjedan je vaš, a ne kalendarski: počinje prvom upotrebom i završava sedam dana kasnije. Kad se kvota potroši, poruka navodi radnju i dan kada se vraća, a nakon te jedne poruke spominje je samo statusna traka. Fucini Coverage: What Community Includes navodi svaku kvotu, koliko je potrošeno i kada se obnavlja, prije nego što ijednu dosegnete.
Screenshot pending — add assets/img/weekly-allowance.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/community-limit-prompt.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/community-includes-weekly.png (see SCREENSHOTS.md).Tri pojedinosti pripadaju plaćenim planovima, dok njihovi nalazi ostaju besplatni: Community označava svaki redak koji ima preživjele mutante i kaže koliko ih je, ali ne i što je svaki mutant promijenio; kaže koliko je testova izvršilo redak, ali ne i njihova imena; te prikazuje Max CRAP izvođenja, ali ne i rangirani popis Riskiest Methods.
Screenshot pending — add assets/img/mutant-hover-community.png (see SCREENSHOTS.md).Ako ste Community već koristili kad je stigla tjedna kvota (0.2026.83), vaša prijašnja ograničenja vrijede još 30 dana; o tome ste obaviješteni jednom, s datumom. Brojači se čuvaju na vašem računalu – u vlastitoj pohrani VS Codea i u ~/.fucini-coverage/, pa novi VS Code profil nastavlja isti tjedan – i nikada se nikamo ne šalju.
7-dnevna propusnica
Niste spremni za pretplatu? 7-dnevna propusnica je sve iz Pro izdanja na tjedan dana, plaćeno jednom: ništa se ne obnavlja i nema se što otkazati. Kupite je na stranici s cijenama (poruka na ograničenju izdanja Community ima gumb za to), a aktivacijski kôd stiže e-poštom.
Screenshot pending — add assets/img/pricing-week-pass.png (see SCREENSHOTS.md).- Pokrenite
Fucini Coverage: Enter Subscription Code– naredba postoji i u izdanju Community i u Pro. - Odaberite Pro i zalijepite kôd
FCB1-…iz e-poruke. - To je sve. Ključ se izdaje i primjenjuje umjesto vas te radi izvan mreže. Tjedan teče od uplate, stoga aktivirajte čim kupite. Kad istekne, proširenje se samo vraća na Community i nastavlja prikazivati pokrivenost.
Screenshot pending — add assets/img/pass-step-plan.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/pass-step-code.png (see SCREENSHOTS.md).U Visual Studiju. Isti kod aktivira Fucini Coverage Studio za Visual Studio, 2022 i 2026: otvorite Tools → Coverage Studio → Licence…, zalijepite kod, odaberite plan za koji vrijedi i pritisnite Activate. Prozor Coverage tada iznad stabla kaže Activated; otvoren strelicom, redak pokazuje datum do kojeg ključ vrijedi i gumb do vašeg računa. Jedno računalo je jedno mjesto: aktivirajte VS Code ili Visual Studio, a drugi uređivač na istom računalu slijedi sam — Visual Studio čita ključ VS Codea, a VS Code ključ Visual Studija — pa se ništa ne unosi dvaput i ne zauzima se drugo mjesto. Oba održavaju ključ na isti način: Pro Plus, Business i Enterprise javljaju se dvaput dnevno, a Pro ključ obnavlja se u tjednu prije isteka.


Prelazak na novo računalo i upravljanje mjestima
Ključ je vezan uz jedno računalo, pa novo računalo treba novi — a pretplata plaća samo onoliko računala koliko navodi. Staro oslobodite sami: prijavite se na upravljanje pretplatom, pronađite mjesto koje više ne koristite, odaberite Free up i zatim aktivirajte novo računalo istim kodom. Kupnja Proa ne šalje vam lozinku — račun postoji, samo je još nema, pa prvi put upotrijebite postavi ili ponovno postavi lozinku s adresom kojom ste se pretplatili.
Na planovima Business i Enterprise svakog kolegu pozivate e-poštom s iste stranice. Svatko dobiva aktivacijski kod koji je samo njegov, a čim ga upotrijebi, njegova se adresa pojavi uz njegovo mjesto — kad netko ode, vidite koje je bilo njegovo i oslobodite ga za sljedećega. Pozivnica drži mjesto od trenutka slanja i istječe nakon 14 dana ako ostane neiskorištena; povucite je da mjesto odmah vratite.
Testiranje predizdanja
Novosti stižu na fucini.software prije nego na Marketplace, a možete zatražiti da vam se nude. Otvorite prikaz Coverage, razvijte ploču s licencijom i pritisnite Testiraj predizdanja… — ili postavite fuciniCoverage.update.preRelease. Od tada proširenje ovdje provjerava zaseban kanal predizdanja uz uobičajeni i nudi ono što je novije.
Screenshot pending — add assets/img/licence-prerelease.png (see SCREENSHOTS.md).Predizdanja su testirana, ali to su gradnje u koje smo najmanje sigurni — dobrovoljno biste se javili da pronađete ono što nam je promaknulo. Pridruživanjem nam javljate da je ova instalacija u kanalu, pa znamo koliko ljudi testira i možemo reći što se promijenilo; izlaskom vas sljedeće stabilno izdanje vraća na uobičajeni put. Predizdanje nije uvijek dostupno, a pridruživanje kad ga nema ništa ne stoji: proširenje nađe prazan kanal, o tome ništa ne kaže i nastavlja nuditi stabilna izdanja dok neko ne bude objavljeno.
Screenshot pending — add assets/img/licence-prerelease-joined.png (see SCREENSHOTS.md).20. Kontakt i licenca
Pitanja, prijave grešaka ili alternativni uvjeti licenciranja — pogledajte kontaktnu stranicu ili pošaljite e-poštu na info@fucini.consulting. Licencirano pod MIT s uvjetom atribucije u bilješkama izdanja; pogledajte također Notice.
21. U naredbenom retku
Čitač radi i bez uređivača: npm install -g fucini-coverage, besplatno, na Windowsu, Linuxu, WSL-u i macOS-u. fucini-coverage check coverage/lcov.info --lines 80 vrata su na kojima proces izgradnje pada; summary, export, report, badge i compare rade ono što rade istoimene naredbe uređivača, a mcp poslužuje šest alata iz gornjeg odjeljka agentu na poslužitelju. Čita fucini-coverage.json, datoteku postavki koju čita izdanje za Visual Studio, pa se pragovi postavljaju jednom. fucini-coverage help <command> objašnjava svaku; cijela je stranica fucini-coverage na npm-u.
Screenshot pending — add assets/img/cli-demo.gif (see SCREENSHOTS.md).