TAM KILAVUZ

Kullanım Kılavuzu

İlk iz dosyanızdan güvenlik standardı uyumluluk kapılamasına kadar — Fucini Coverage Studio'nun yapabildiği her şey ve bunu tam olarak nasıl kullanacağınız.

VSIX'i indir

1. Giriş

Fucini Coverage Studio, derlemenizin zaten ürettiği kapsam izleme dosyalarını düzenleyici içinde birinci sınıf kapsama dönüştürür — VS Code'da ve Visual Studio'da. Yirmi beş biçimi okur, bunları tek bir kanonik Fucini modeline normalleştirir, birden çok çalıştırmayı deterministik biçimde birleştirir ve sonucu düzenleyicinin kendisinde gösterir — oluklar, CodeLens, üzerine gelme ve bir Covered Files görünümü — böylece düzenleyicinizden ayrılmanızı gerektiren ayrı bir görüntüleyici yoktur. İki sürüm tek bir okuyucuyu paylaşır: aynı rapor her ikisinde de basamağına kadar aynı sayıları verir. Bu kılavuz VS Code'dan yazılmıştır; Visual Studio'nun farklılaştığı yerde bir In Visual Studio kutusu nasıl olduğunu söyler.

İşlevsel güvenlik iş akışları göz önünde bulundurularak tasarlanmıştır: MC/DC kapsamı, bölge ve C++ örnekleme kapsamı, güvenlik ağırlıklı bileşik puan ve IEC 61508, ISO 26262 ve DO-178C düşüncesine uygun, yapılandırılabilir bir COMPLIANT / NON-COMPLIANT kararı.

Fucini Coverage Studio in VS Code: a file opened from the Coverage view, uncovered lines and half-taken branches in the editor, the MC/DC hover, the heatmap, the status-bar card and the annotated sourceScreenshot pending — add assets/img/marketplace-demo.gif (see SCREENSHOTS.md).

2. Kurulum ve gereksinimler

  • VS Code ≥ 1.88 — bu uzantının desteklediği en düşük sürüm — ya da Visual Studio 2022 veya 2026, Community, Professional veya Enterprise (aşağıdaki kutuya bakın).
  • Projenizin zaten ürettiği bir kapsam izleme dosyası (bkz. §4).

Marketplace'ten veya Extensions → ⋯ → Install from VSIX… aracılığıyla bir .vsix dosyasından yükleyin. Uzantı başlangıçta etkinleşir ve etkinlik çubuğuna bir Coverage simgesi ekler.

Visual Studio'da. Aynı ürün ikinci bir uzantı olarak, Visual Studio için Fucini Coverage Studio, Visual Studio 2022 ve 2026 — Community, Professional ve Enterprise için yayımlanır. Visual Studio'nun kendi kod kapsamını kullanmaz: Visual Studio 2022'de bu bir Enterprise özelliğidir, dolayısıyla Community ve Professional'da IDE'nin göstereceği tek kapsam budur. .vsix dosyasını açarak — VSIX Installer hangi Visual Studio olduğunu sorar — ya da Extensions → Manage Extensions üzerinden kurun; uzantı bir çözüm veya klasör açıldığında yüklenir. Coverage penceresi, Windows 11 ve Visual Studio 2026'nın zaten getirdiği Microsoft Edge WebView2 Runtime'ı gerektirir; düzenleyicideki işaretler onsuz da çalışır.

3. Hızlı başlangıç

Kendi projenizi bağlamadan önce nasıl çalıştığını görmek ister misiniz? Demo projesini indirin (~6 KB — hazır bir lcov.info içeren küçük bir C projesi):

  1. İstediğiniz yere açın, ardından VS Code'da coverage-studio-demo.code-workspace dosyasını açın (File → Open Workspace from File…).
  2. Henüz yapmadıysanız Fucini Coverage Studio'yu yükleyin (yukarıdaki §2'ye bakın).
  3. Çalışma alanının kendi .vscode/settings.json dosyası zaten paket içindeki coverage/lcov.info'ya işaret eder, bu yüzden uzantı etkinleştirilir etkinleştirilmez oluklar ve Covered Files görünümü belirir — Load Coverage adımına gerek yoktur.
  4. İzleme dosyasını kendiniz yeniden oluşturmak mı istiyorsunuz (ör. farklı bir derleyiciyle)? scripts/gen-coverage.sh dosyasını çalıştırın (Windows'ta .ps1) — kullanılabilir derleyici hedefleri için çalışma alanının kendi README.md dosyasına bakın.

Visual Studio'da. Bir çözüm ya da klasör açın (File → Open → Folder, bir CMake projesi böyle açılır) — yukarıdaki demo klasör olarak açılır ve .vscode/settings.json dosyası orada da okunur. Ayarların adını verdiği yerdeki bir rapor kendiliğinden yüklenir ve Output penceresinin Fucini Coverage bölmesi hangi dosyaların yüklendiğini söyler; aksi halde Tools → Coverage Studio → Load Coverage File…, bir kez — hatırlanır. Bir kaynak dosya açıp Show Coverage in Editor'ı seçin: kırmızı hiç çalışmamış bir satır, kehribar yalnızca tek yöne gidilmiş bir karardır ve Ctrl+Shift+U, N bir sonraki kapsanmamış satıra gider. View → Other Windows → Coverage, her dosyanın sayılarını ve hepsinin üzerinde tek bir puanı gösteren ağaçtır; durum çubuğu bu puanı çalıştırma için ve içinde bulunduğunuz dosya için gösterir. Tools → Coverage Studio → Getting Started bu adımları her biri için bir düğmesi olan bir sayfa olarak açar; ilk seferde kendiliğinden açılır.

  1. Normal test iş akışınızla bir kapsam iz dosyası oluşturun.
  2. Komut Paleti (Ctrl+Shift+P) → Fucini Coverage: Load Coverage. watch.enabled açıkken (varsayılan), eşleşen bir dosya otomatik olarak yüklenir.
  3. Kapsanan bir kaynak dosyayı açın: durum çubuğu yüzdesini gösterir, Kapsam görünümü dolar, bir satırın üzerine gelmek isabet sayısını gösterir ve çalıştırma yerel Test Coverage panelinde belirir. Kapsanmayan satırlarda çubuklar, bir isabet sayısı ısı haritası ve satır içi ×N sayıları bir ayar ötededir (editorGutter.mode, hitCounts.inline).
Covered (green) and uncovered (red) gutters in the editorScreenshot pending — add assets/img/gutters.png (see SCREENSHOTS.md).

4. İz dosyası üretimi

Aşağıdakilerden herhangi biri yükleme sırasında otomatik olarak algılanır:

Her derleyici için eksiksiz kopyala-yapıştır tarifleri — Swift, Rust, Go, Python, .NET, PHP ve daha fazlası dahil — şu sayfada: Kapsam Tarifleri: 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 en zengin girdidir — satırlar, dallar ve fonksiyonlara ek olarak bölgeler, MC/DC ve C++ şablon örneklemelerini de taşır.

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
BiçimTipik dosyaEk ölçütler
LCOVlcov.infosatırlar, dallar, işlevler
llvm-cov JSONcoverage.json+ bölgeler, MC/DC, örneklemeler
Cobertura XMLcoverage.xmlsatırlar, dallar
JaCoCo XMLjacoco.xmlsatırlar, dallar, işlevler
Istanbul / nyccoverage-final.jsondeyimler, dallar, işlevler
SimpleCov.resultset.jsonsatırlar
Clover XMLclover.xmlsatırlar, dallar, işlevler
OpenCover XMLcoverage.opencover.xmlsatırlar, dallar, işlevler
coverage.py JSONcoverage.jsonsatırlar, dallar
gcov / gcovr JSONcoverage.jsonsatırlar, dallar, işlevler
Go coverage profilecoverage.outsatırlar
SonarQube genericcoverage.xmlsatırlar, dallar
GNATcoverage XML (Ada)*.xmlsatırlar, dallar, MC/DC
BullseyeCoverage XMLcoverage.xmlsatırlar, koşul/karar
Visual Studio*.coveragexmlsatırlar, dallar
Coveralls JSONcoveralls.jsonsatırlar, dallar
Xcode xccov JSONcoverage.jsonişlevler ve dosya toplamları — satır başına veri yok
gcov plain text*.gcovsatırlar, dallar, işlev çağrıları
VectorCASTcoverage.xmlsatırlar, dallar, MC/DC çiftleri, işlevler, işlev çağrıları
Testwell CTC++*.txtsatırlar, koşul/karar
Lauterbach TRACE32*.xmldeyimler, kararlar, koşullar, MC/DC, işlevler, çağrılar, nesne kodu
EMMA XML (Java)coverage.xmlsatırlar
UCIS / Aldec UCDB*.xmldeyimler, karar dalları
NCover XMLCoverage.xmlsatırlar, işlevler
dotCover DetailedXMLdotCover.xmlsatırlar, işlevler
PIT (mutation)mutations.xmlmutasyon puanı — kapsam yok
Stryker (mutation)mutation-report.jsonmutasyon puanı — kapsam yok

Visual Studio'dan ölçülen yerel bir C++ projesi

Visual Studio'da. Visual Studio'nun bir C++ projesi için kendi kapsamı yalnızca Enterprise'daydı ve bu boşluğu dolduran ücretsiz OpenCppCoverage eklentisi emekliye ayrıldı. Tools → Coverage Studio → Run Native Project with Coverage başlangıç projesini — bir .vcxproj — alır, MSBuild'e nereye ve hangi araç setiyle derlendiğini sorar ve onu iki yoldan biriyle ölçer. ClangCL araç setinde, makinede LLVM'in llvm-profdata ve llvm-cov araçları varken (Visual Studio'nun C++ Clang tools for Windows bileşeni bunları getirir), projeyi -fprofile-instr-generate -fcoverage-mapping ile, MSBuild'e önce içe aktarması söylenen bir props dosyası üzerinden coverage\native\ içine yeniden derler — projede hiçbir şey değişmez — programı LLVM_PROFILE_FILE ayarlanmış olarak çalıştırır, profili birleştirir ve bölge hassasiyetinde coverage\native\lcov.info dosyasını dışa aktarır. Başka herhangi bir araç setinde, OpenCppCoverage kuruluysa, projeyi olduğu gibi derler — bir Debug derlemesinde PDB'ler vardır — ve OpenCppCoverage altında çalıştırır; o da coverage\native\opencppcoverage.xml dosyasını yazar. Her komut Fucini Coverage bölmesine gider ve rapor bir test çalıştırmasınınki gibi yüklenir ve hatırlanır. Ölçülemeyen bir projeye nedeni ve ne kurulacağı söylenir. Sorduğu soru için MSBuild 17.8 (Visual Studio 2022 17.8) ya da üstü.

Visual Studio: Run Native Project with Coverage on a C++ project — the instrumented build, the run, and the gutter filling inScreenshot pending — add assets/img/vs-native-run.gif (see SCREENSHOTS.md).
Visual Studio'da: bir C++ projesinde Run Native Project with Coverage — derleme, çalıştırma ve dolmaya başlayan düzenleyici.

5. Yükleme ve keşif

Varsayılan olarak uzantı, çalışma alanı kökünden tarama yapar. Bunu iki ayarla daha kesin hale getirin:

{
  "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"
  ]
}
  • Her paths girdisi defaultLocation'a görecelidir (veya ayarlanmamışsa çalışma alanı köküne).
  • * içeren bir girdi özyinelemeli olarak aranır; düz bir dosya adı yalnızca temel klasörde doğrudan eşleşir.
  • paths boş olduğunda, uzantı önce coverage.json'ı, ardından lcov.info'yu arar ve ilk bulduğunu yükler.
  • Pick Coverage File, seçtiğiniz dosyaları bu yolların yerine kullanır — her seçim kümeye eklenir ve tümü birleştirilir — siz onları kaldırana veya bu ayarları düzenleyene kadar.
  • Değişkenler — her yol ayarı ${workspaceFolder}, ${workspaceFolderBasename}, ${userHome}, ${env:NAME}, ${command:id} ve ${config:section.key}’i genişletir. Uzantının tanımadığı bir değişken yazıldığı gibi bırakılır; böylece bir yazım hatası yok olmak yerine keşif günlüğünde aranan yol olarak görünür. ${command:id} önce o komutu çalıştırır — yalnızca güvenilen bir çalışma alanında ve en fazla beş saniye —, böylece ${command:cmake.buildDirectory} seçili CMake kitini izler.
  • URL girdileri — bir http(s):// girdisi her yüklemede uzantının depolama alanına indirilir ve oradan yüklenir; Kapsam görünümü URL’yi adlandırır. Her indirme koşulludur (ETag / Last-Modified), bu yüzden değişmemiş bir yapıt hiçbir şey indirmez; bir indirme başarısız olduğunda bunun yerine son indirilen kopya yüklenir, nedeni çıktıdadır. remote.headers, değişkenleri genişletilmiş Name: value başlıkları ekler, remote.refreshMinutes bir zamanlayıcıyla yeniden indirir ve URL’nin kendisi bir dosya adıyla bitmediğinde bir #lcov.info parçası biçimi adlandırır.
  • Yoksayma glob’ları — fuciniCoverage.ignore bütün dosyaları (dışarıdan alınan, üretilmiş, üçüncü taraf) çalıştırma yüklenirken ondan düşürür; böylece her görünüm, kapı ve dışa aktarım onlarsız sayar; yükleme sonucu kaçının dışarıda bırakıldığını söyler, çıktı onları adlandırır. Desenler çalışma alanına göreli yolla ve mutlak yolla eşleşir; / içermeyen bir desen, .gitignore gibi, herhangi bir derinlikteki bir klasör ya da dosya adıyla eşleşir.
  • Çok köklü çalışma alanları — her klasör kendi koşullarıyla keşfedilir: defaultLocation, paths, pathRemap, ignore, watch.* ve remote.* klasör başına okunur; böylece bir klasörün kendi .vscode/settings.json’ı ya da .code-workspace girdisi geçerli olur ve bir girdideki ${workspaceFolder} o girdinin kendi klasörü demektir. Her klasörün iz dosyaları tek bir çalıştırmada birleşir, Kapsam görünümü dosyaları klasöre göre gruplandırır ve çalışma alanına eklenen ya da ondan çıkarılan bir klasör kapsamı kendiliğinden yeniden yükler.
  • Bir görevden sonra yeniden yükleme — watch.reloadAfterTasks, watch.enabled açık olsun olmasın bitişi kapsamı yeniden yükleyen görevleri (tasks.json’daki bir label ya da Run Task listesinin gösterdiği biçimiyle source: name) adlandırır — izleyicinin takip edemediği derlemeler için. Çalışma alanı dışındaki mutlak bir paths girdisi de yoklanır; böylece orada beliren bir dosya yüklenir.
  • İptal edebileceğiniz ilerleme — on ya da daha fazla iz dosyasının, ya da 8 MB ve üzerinin yüklenmesi, okunan dosyayı ve aşamayı adlandıran, İptal düğmeli bir ilerleme bildirimi altında çalışır; daha küçüğü yalnızca durum çubuğunu döndürür. İptal etmek önceki çalıştırmayı yüklü bırakır ve bunu söyler.

1.2026.6'dan beri mutlak bir girdi de joker karakter içerebilir: ${workspaceFolder}/build/coverage-merged/*.lcov.info o klasördeki her böyle dosyayı yükler ve ** her derinlik anlamına gelir. İlk joker karakterden önceki klasörler bakılan yerdir ve izlenir; böylece bir derlemenin oraya yazdığı rapor kendiliğinden yüklenir. Visual Studio sürümü böyle bir girdiyi aynı şekilde okur ve 1.2026.5'ten beri göreli bir joker karakter orada da, burada hep olduğu gibi, her derinlikte aranır.

paths yapılandırılmamışsa, temel klasörün altında bulunan iyi bilinen rapor adlarından ilki yüklenir. Önce uzantının her zaman aradığı dört ad — coverage.json, lcov.info, coverage.out, clover.xml — ardından 0.2026.83 sürümünden itibaren jacoco.xml, coverage.xml, cobertura.xml, coverage.cobertura.xml, coverage.opencover.xml ve coverage-final.json, sonra da varsayılan yapılandırmaların yazdığı yerler: coverage/ (nyc, Jest, vitest, PHPUnit, SimpleCov), target/site/jacoco/jacoco.xml (Maven), build/reports/jacoco/test/jacocoTestReport.xml (Gradle) ve TestResults/*/coverage.cobertura.xml (dotnet test). Böylece bir Java veya .NET projesi, bir lcov projesinin her zaman yaptığı gibi, kapsamını ilk açılışta gösterir.

1.2026.3'ten beri bir .NET çözümünün daha da azına ihtiyacı var: her test projesinin TestResults/<run>/ klasörü, yalnızca çalışma alanı klasörünün kendisininki değil, bilinen yerler arasındadır ve Microsoft'un toplayıcısının <user>_<machine>_<date>.cobertura.xml dosyası Coverlet'in coverage.cobertura.xml dosyasının yanında bulunur — dolayısıyla testleri Visual Studio'nun Test Explorer'ında çalıştırılmış bir çözüm kapsamını ilk açılışta gösterir, her çalıştırma klasörü yüklenir ve birleştirme her dosya için en yeni çalıştırmanın sözünü korur. Ayrıca varsayılan olarak açık olan fuciniCoverage.ignore.generated, tasarımcı ve üretilmiş dosyaları — *.Designer.cs, *.g.cs, *.generated.cs, *.razor.g.cs, AssemblyInfo, genel using'ler, Migrations/ ve obj/ — ignore uygulanmadan önce her toplamın, sayfanın ve dışa aktarmanın dışında bırakır; böylece kimsenin test etmediği üretilmiş bir tablo çözüme eşik denetimini kaybettirmez.

Visual Studio'da: her test çalıştırmasından sonra kapsam. Testlerinizi her zamanki gibi çalıştırın. Tools → Coverage Studio → Collect Coverage in Test Explorer…, çözümün yanına Microsoft'un Cobertura toplayıcısını içeren tek bir .runsettings koyar. Tools → Options → Test → Auto detect runsettings files açıkken Visual Studio bunu kendiliğinden alır; değilse Test → Configure Run Settings altında bir kez seçin. O andan itibaren her çalıştırma test projesinin altına bir rapor yazar ve çözümdeki izleme, rapor belirdiği anda onu, ayarların adlandırdığı her şeyle birleştirerek yükler — Test Explorer'dan, bir terminalden ya da bir betikten olması fark etmez. Hiçbir şey Test Explorer'a bağlanmaz, bu yüzden Visual Studio 2026 ve Microsoft.Testing.Platform oldukları gibi çalışır. Run Tests with Coverage VS Code komutudur: dotnet test, vitest, jest, pytest, go, cargo, maven, gradle, phpunit ve ctest'i tanır, testleri Output penceresinde kapsam açık olarak çalıştırır ve yazdıklarını yükler; coverlet.collector olmayan bir test projesi, test SDK'sının birlikte getirdiği toplayıcıyla çalıştırılır ve testRun.skipWhenTestsFail, bir çalıştırma kırmızı bittiğinde son iyi kapsamı ekranda tutar.

Bir belirtecin arkasındaki, her çeyrek saatte bir yeniden denetlenen bir CI yapıtı — belirteç ortamda kalır, asla settings.json içinde değil:

{
  "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
}
A tracefile loaded from a URL: the Coverage view names the address it came fromScreenshot pending — add assets/img/remote-tracefile.png (see SCREENSHOTS.md).

Yeniden yükleme bilerek sessizdir — her derlemeden sonra bir iletişim kutusu, tek yanıtı olan bir sorudur. Sessiz olmayan şey Coverage simgesidir: görünüm önünüzde değilken yeniden okunan izleme dosyalarının sayısını taşır ve ipucu bunları adlandırır. Görünümü açın, sayı kaybolur.

A build rewrites two reports while the Explorer is open: the Coverage icon in the activity bar gains a count, its tooltip names what reloaded, and opening the view clears itScreenshot pending — add assets/img/coverage-badge.gif (see SCREENSHOTS.md).

İz dosyası onlar hakkında ne derse desin hiçbir zaman sayılmaması gereken dosyalar:

{
  "fuciniCoverage.ignore": ["vendor/**", "**/*.generated.ts", "build/**"]
}

Dosya izleyicisinin takip edemediği bir derleme için test görevi bittiğinde yeniden yükleme — sembolik bağlı bir çıktı ağacının yerine yenisini koyan bir çalıştırma, bir ağ paylaşımındaki rapor, dosyasını sonradan işleyen bir kapsam adımı:

{
  "fuciniCoverage.watch.reloadAfterTasks": ["npm: test", "coverage-report"]
}

6. Çalıştırmaları birleştirme

Mevcut her paths girdisi yüklenir ve tek bir çalıştırmada birleştirilir. Birleştirme belirleyicidir — sonuç yükleme sırasına bağlı değildir — ve birden çok izleme dosyasının ölçtüğü bir dosya sayılarını diskteki en yeni mtime’a sahip olandan alır: bir modülün kendi yeniden çalıştırması, daha geniş ve daha eski bir çalıştırmanın onun hakkında söylediklerine eklenmek yerine onları değiştirir. Kapsam görünümü bunun ne yaptığını gösterir: her dosya satırı sayılarının geldiği izleme dosyasını söyler, bu sayıların daha eski bir raporu geçersiz kıldığı yerde rozet çerçevelidir, ağacın üstündeki her izleme dosyası satırı kaç dosyasının geçersiz kılındığını veya başkalarını geçersiz kıldığını sayar ve bir izleme dosyası satırına tıklamak yeniden tıklanana dek onun dosyalarını ağaçta vurgular (coverageView.mergedMarks çerçeveyi ve vurguyu kapatır).

Four reports merged onto one source file: llvm-cov brings lines, functions, regions, branches, MC/DC and instantiations, two TRACE32 exports bring function calls and object code, and a mutation report brings the mutation scoreScreenshot pending — add assets/img/four-reports-one-file.svg (see SCREENSHOTS.md).

Birleştirilmiş bir çalıştırma, altı klasik ölçütten fazlasını taşıyabilir ve her biri onu ölçen rapordan gelir: satırlar, işlevler, bölgeler, dallar, MC/DC ve örneklemelerin yanında işlev çağrıları, nesne kodu ve bir mutasyon puanı. Coverage görünümü, çalıştırmanın taşıdığı her ölçüt için bir sütun gösterir — taşımadığı ölçüt için ise hiç göstermez — ve bunları puanınızdaki ağırlıklarına göre, en ağırı önce, her genişlikte sıralar: sığmayan sütunlar kaybolmak yerine yana kayar. Görünümü alt panele sürüklediğinizde bir tabloya dönüşür. Durum çubuğu kartları, HTML raporu ve CSV ile Markdown dışa aktarımları aynı kuralı izler: bir raporun taşıdığı şey gösterilir, taşımadığı şey sıfır olarak yazdırılmak yerine dışarıda bırakılır.

The Coverage view in a real window: eight tracefiles from five languages above a tree with MC/DC, Conditions, Branches, Regions and the weighted score in columns beside every file, and a covered C# file open next to itScreenshot pending — add assets/img/coverage-view-editor.png (see SCREENSHOTS.md).
The Coverage view as a wide panel: C, C++, JavaScript, Python and .NET merged into one tree, with MC/DC, branches, regions, functions, lines, instantiations, mutation score, Max CRAP and the weighted score in columns beside every file, and an em dash where a metric does not applyScreenshot pending — add assets/img/coverage-view-columns.png (see SCREENSHOTS.md).
The Coverage view over a workspace of eleven projects: every tracefile listed, the tree collapsed to one row per project with its percentage and bar, scrolled through, expanded, and a file opened from itScreenshot pending — add assets/img/workspace-overview.gif (see SCREENSHOTS.md).
Visual Studio: the Coverage window over a folder of eleven projects — collapsed to one row per project with its bar, then expanded, then a file opened from itScreenshot pending — add assets/img/vs-workspace-overview.gif (see SCREENSHOTS.md).
Visual Studio'da: on bir projelik bir klasör üzerinde Coverage penceresi — çubuğuyla birlikte proje başına tek satıra daraltılmış, sonra genişletilmiş, sonra oradan açılan bir dosya.

Bir dosya hangi rapordan gelir

Yüklü birkaç rapor aynı dosyayı ölçtüğünde, en yenisi dosyayı tümüyle kazanır — bir modülün kendi yeniden çalıştırması daha eski ve daha geniş bir çalıştırmanın söylediğinin yerini aldığında doğru olan budur. Raporlar aynı kodu bilerek ölçtüğünde ise yanlıştır: o zaman düzenleyici her derlemede aralarında gidip gelir ve her biri hikâyenin yalnızca bir kısmını anlatır. coverageFile.sources bunun yerine ne yapılacağını dosya başına söyler. Üç durum bunu gerektirir:

  • Raporlardan biri daha iyidir. llvm-cov'un coverage.json dosyası MC/DC taşır, aynı derlemenin GCC gcov.info dosyası ise yalnızca satırları ve dalları: coverage.json dosyasını seçin, diğerini yalnızca GCC'nin derlediği birkaç dosya için tutun.
  • Tek bir derlemenin birkaç test takımı. Birim testleri, entegrasyon testleri ve hardware-in-the-loop her biri kendi raporunu yazar; her biri tek başına diğerlerinin çalıştırdığı satırları dışarıda bırakır. Birleştir, union: bir satır, herhangi bir raporun onu çalıştırdığı yerde kapsanmıştır ve sayılar toplanır.
  • Tek kod tabanı, iki derleyici. clang ve GCC ile derlenen aynı kaynaklar araç zincirine özgü kodda farklı yollardan geçer — burada bir intrinsic, orada taşınabilir bir yedek — ve her rapor diğer yarının hiç çalışmadığını söyler. Birleştir, agree: bir satır yalnızca onu ölçen her raporun onu çalıştırdığı yerde kapsanmıştır ve raporların uyuşmadığı satırlar turkuaz ile işaretlenir. Derleyiciler arası bir denetimin sorduğu soru budur: yayımladığım her derleme gerçekte neyi çalıştırdı?

Kuralları nadiren elle yazarsınız. Kapsam görünümünde bir dosyaya sağ tıklayıp Choose Coverage Source... öğesini seçin (ya da açık dosyada Choose Coverage Source for This File... komutunu çalıştırın): dosyayı ölçen her raporu kendi satırları, dalları ve MC/DC'siyle listeler, ardından Combine them — agree ve Combine them — union gelir; birini seçin ve dosya için mi, klasörü için mi yoksa bir desen için mi geçerli olacağını belirtin. Clear Coverage Source for This File... kuralı yeniden kaldırır. Ayarlarda her kural dosyalar üzerinde bir glob, rapor üzerinde bir glob (/ içermeyen bir desen raporun dosya adıyla eşleşir, {a,b} birden fazlasını belirtir) ve birleştirmek için "combine": "agree" ya da "union" değerinden oluşur. Dosyaları eşleşen ve raporu dosyayı ölçen ilk kural karar verir; yalnızca bir raporun ölçtüğü bir dosya o rapordan asla alınmaz. Birleştirilmiş bir dosyanın dalları, MC/DC'si ve bölgeleri, bunlar bakımından en zengin rapordan gelir. coverageFile.mergeStrategy: "order", hiçbir kuralın kapsamadığı dosyaları zamanlara göre değil coverageFile.paths sırasına göre belirler.

{
  "fuciniCoverage.coverageFile.paths": ["clang.json", "gcc/bits.gcov.json.gz"],
  "fuciniCoverage.coverageFile.sources": [
    { "files": "src/**", "report": "{clang.json,bits.gcov.json.gz}", "combine": "agree" }
  ]
}

Gördükleriniz: Kapsam görünümündeki dosya satırı, sayılarının geldiği raporu ya da birleştirilmişse her raporu ve kipi, tartışmalı satırlar için ≠ n ile birlikte adlandırır. Kenar boşluğu ve Annotated Source bu satırları turkuazla işaretler ve hangi raporun onları kaç kez çalıştırdığını söyler. Durum çubuğunun üzerine gelme kartı açık dosyanın kaynağını, tüm çalıştırma için de geçerli kuralları ve diğer dosyalar hakkında nasıl karar verildiğini gösterir. Demodaki samples/c-cross-check, açılmaya hazır iki derleyici durumudur. Visual Studio da bunların hepsini yapar: Kapsam görünümündeki bir satırda Choose Coverage Source..., Tools > Coverage Studio altında da Choose ve Clear Coverage Source for This File....

Kaynak seçme ve birleştirme ücretli planlara dahildir. Community'de, kural yokken olduğu gibi her dosyayı en yeni rapor kazanır ve ayarlardaki bir kural sessizce yok sayılmak yerine kullanılmıyor olarak belirtilir.

Choose Coverage Source on bits.c: clang.json with lines, branches and MC/DC, bits.gcov.json.gz with lines and branches, and the two ways to combine them
VS Code'da: Kapsam görünümünden bits.c üzerinde Choose Coverage Source... — clang raporu, GCC raporu ya da ikisi birleştirilmiş.
Animation in VS Code: bits.c combined by agree with four teal lines, Choose Coverage Source opened from the Coverage view, and the file reloaded combined by union
VS Code'da: iki tıklamada agree'den union'a — tartışmalı satırlar turkuaz kalır, sayılar değişir.
Animation in Visual Studio: bits.c combined by agree, the Coverage window's row menu, Choose Coverage Source and its two dialogs, and the file reloaded combined by union
Visual Studio'da: aynısı Kapsam görünümündeki satır menüsünden — raporlar, sonra kuralın ne kadar uzağa uzandığı, sonra yeniden yüklenen dosya.
bits.c with the clang and GCC reports combined by agree: the Coverage view row names both reports with four disputed lines, and the builtin and the portable loop are marked in teal
VS Code'da: bits.c, clang ve GCC agree ile birleştirilmiş — satırda ≠ 4 yazar ve yalnızca bir derlemenin çalıştırdığı dört satır turkuazdır.
bits.c with the clang and GCC reports combined by union: every line covered, the four disputed lines still teal, and the status bar naming the union
Aynı dosya union ile birleştirilmiş: iki derlemeden herhangi birinin çalıştırdığı her satır kapsanmıştır, bu yüzden bits.c satırlarının 100%'üne ulaşır — derlemelerin ayrıştığı satırlar ise turkuaz kalır.
The Annotated Source of bits.c, combined by agree: the source line under the title names both reports, and each teal row says how often each report ran it
Annotated Source başlığın altında birleştirmeyi, her turkuaz satırda da her raporun onu kaç kez çalıştırdığını gösterir.
The status bar's hover card for bits.c, ending with the coverage source: both reports, combined by agree, disagreeing on four lines
Durum çubuğundaki dosyanın üzerine gelme kartı sayılarının nereden geldiğini söyler; çalıştırmanın kartı her kuralın karar verdiği dosyaları sayar.
Visual Studio: Choose Coverage Source on bits.c from the Coverage window's row menu — the clang report, the GCC report and the two ways to combine them; behind it the row's agree badge with four disputed lines and the teal lines in the margin
Visual Studio'da: Kapsam görünümündeki bir satırdan Choose Coverage Source... — aynı raporlar ve onları birleştirmenin aynı iki yolu; durum çubuğu birleşimi adlandırır.

7. Yol yeniden eşleme

CI genellikle iş istasyonunuzda bulunmayan mutlak build makinesi yollarını kaydeder. Bunları sıralı kurallarla yeniden yazın:

{
  "fuciniCoverage.pathRemap": [
    { "from": "/builds/ci/project", "to": "${workspaceFolder}" },
    { "from": "\\\\", "to": "/" }
  ]
}

Kurallar sırayla uygulanır; her önek için ilk eşleşme kazanır. Bunu Windows/Unix ayırıcı farklarını gidermek veya bir konteyner yolunu checkout'unuza eşlemek için kullanın.

Kuralı nadiren kendiniz yazmak zorunda kalırsınız. En yaygın “yüklendi ama hiçbir şey yanmıyor” durumu, yolları bir konteynerden ya da CI checkout’undan gelen (/build/src/a.c, /home/runner/work/repo/repo/src/a.c, C:\agent\_work\1\s\src\a.c) bir iz dosyasıdır; oysa çalışma alanında src/a.c vardır. Bir yükleme dosyaları eşleşmemiş bıraktığında uzantı dosya adlarını çalışma alanında arar, çoğunu açıklayan önek kuralını çıkarır, bunu [FUCINI_REMAP_002] olarak günlüğe yazar ve yükleme sonucu Apply Suggested Remap sunar — tek tıklama kuralı fuciniCoverage.pathRemap’e ekler ve yeniden yükler. Suggest Path Remap Rule aynı çözümlemeyi paletten istek üzerine çalıştırır. Tıklama olmadan hiçbir şey yazılmaz.

Bir to, iz dosyasının içinde bulunduğu çalışma alanı klasörünü temsil eden ${workspaceRoot}’u kullanabilir; çok köklü bir çalışma alanında önce o klasörü, sonra dosyanın bulunduğu ortaya çıkan diğer her klasörü dener. Kuralların kendileri klasör başına okunur; böylece çok köklü bir çalışma alanının her kökü kendi kurallarını taşıyabilir.

8. Editör içi kapsam

  • Göstergeler ve cetvel — varsayılan olarak düzenleyicinin kendi kenar boşluğu yalnızca bulguları gösterir: MC/DC çubukları, son-çalıştırmadan-beri üçgenleri, düzenlenmiş satır noktaları. editorGutter.mode yalnızca-kapsanmayan çubuklar ya da bir isabet sayısı ısı haritası ekler (aşağıda); bütün bir dosyanın renk kodlu görünümü Annotated Source’tur.
  • Fonksiyon CodeLens — her fonksiyonun üzerinde kapsam yüzdesi; ilk kapsanmayan satırına atlamak için tıklayın. codeLens.enabled ile açıp kapatın.
  • Dal ve MC/DC üzerine gelme — dal başına alınan/alınmayan sayıları ve koşul başına vektör tablosu için bir karar satırının üzerine gelin. mcdcGutter.enabled ile renkli bir kenar boşluğu çubuğu etkinleştirin.
  • Ölü kod uyarıları — ölçülebilir satırlara ve sıfır kapsama sahip fonksiyonlar Problems panelinde işaretlenir (deadCode.enabled).
  • Next / Previous Uncovered — boşluklar arasında atlayın.
  • Durum çubuğu — proje geneli bir $(dashboard) NN% öğesi ve dosya başına bir öğe, ikisi de bileşik puana göre renklendirilir; tam bir metrik tablosu için üzerine gelin.
  • Gezgin rozetleri — dosya ve klasör başına kapsam rozetleri, üzerine gelince metrik dökümüyle. Varsayılan olarak kapalı: explorerBadges.enabled ile açın.
  • Son çalıştırmadan beri — önceki çalıştırmada yürütülüp bunda yürütülmeyen her satırda kırmızı, tersi için yeşil bir üçgen; genel bakış cetveli ve üzerine gelince isabet sayılarıyla.
  • Düzenlenmiş arabellekler — her işaret, ipucu ve CodeLens siz düzenledikçe metinle birlikte kayar ve yeniden yazılmış bir satırdan çekilir; orada gri bir nokta nedenini söyler.
  • Satır içi isabet sayıları — hitCounts.inline, bir deyimin başladığı her satırın ardına ×12 yazar, ×0 dâhil: üzerine gelince hep orada olan sayı, üzerine gelmeden. Toggle Inline Hit Counts bunu açıp kapatır; durum çubuğu menüsü hangisi geçerliyse Göster ya da Gizle olarak sunar.
  • Satır başına Problems kayıtları — problems.perLine, açık bir belgede hiç çalışmamış her bitişik satır bloğuna (kırk satırlık ölü bir işlev kırk değil, tek kayıttır) ve uncoveredAndPartial olarak dal kolu hiç alınmamış her satıra, düzenleyicide dalgalı bir çizgiyle bir Bilgi tanısı koyar. Kayıtlar siz düzenledikçe satırlarını izler ve belge kapanınca gider; problems.enabled arkasındaki dosya başına kayıt değişmez.
  • Satır rengi — lineHighlight, kenar boşluğunun işaretlediği şey için satırların kendisinin arkasına yarı saydam bir renk koyar (uncovered ya da çalışmış satırlar için de heatmap). Kendi ayarı: boşluklar renklendirilirken kenar boşluğu temiz kalabilir ya da tersi.
  • Genel bakış cetveli — overviewRuler, kaydırma çubuğundaki şeride kenar boşluğundan bağımsız karar verir: follow (çubuklarla birlikte, eskisi gibi), uncovered (her zaman; böylece kenar boşluğu kapalıyken de kaydırma çubuğu dosyanın boşluklarını haritalar) ya da off.
  • Bir satırı hangi izleme dosyası kapsadı — birden çok rapor birleştirildiğinde, çalışma sayısı ipucu Kapsayan: ve o satırı kapsayan her raporla biter; lcov’un TN: kaydındaki küme adı dâhildir. Coverage görünümündeki bir izleme dosyası satırına tıklamak, onun katkıda bulunduğu satırları her açık düzenleyicide aydınlatır.
Function CodeLens and MC/DC hover tooltipScreenshot pending — add assets/img/codelens-hover.png (see SCREENSHOTS.md).
A function CodeLens on a C# method: 37.14% covered, 13 of 35 lines, branches 10 of 22, complexity 22, CRAP 142.2 — with the uncovered branches of the method marked underneathScreenshot pending — add assets/img/codelens-crap.png (see SCREENSHOTS.md).
Alt+N jumps from one uncovered line to the next, Alt+P goes backScreenshot pending — add assets/img/jump-between-gaps.gif (see SCREENSHOTS.md).
Explorer badges: a coverage percentage on every measured file and folder of all five demo projects, beside a covered C# file with its gutters, hit counts and CodeLensScreenshot pending — add assets/img/explorer-badges.png (see SCREENSHOTS.md).

Düzenleyici kenar boşluğu kipleri

editorGutter.mode, düzenleyicinin kendi kenar boşluğunun her zaman gösterdiği bulguların üstüne kapsam hakkında ne göstereceğine karar verir. off (varsayılan) yalnızca bunlardır. uncovered, hiç çalışmamış her satıra bir çubuk, bir dal kolu hiç alınmamış her satıra kehribar rengi bir çubuk koyar, kapsanan satırlara ise hiçbir şey; böylece yeşil bir duvar üç kırmızıyı gizlemez. coverage, kapsanan her satıra yeşil bir çubuk ekler; böylece tüm dosya renk ölçeğinin renkleriyle kırmızı, kehribar ve yeşil okunur. heatmap ise bunun yerine çalıştırılmış her satıra sıcak bir ton ekler; ne kadar sık çalıştıysa o kadar sıcak — bir satırın kapsanıp kapsanmadığını değil, ne sıklıkla çalıştığını gösterir, bu yüzden %100 kapsanan bir dosya orada sarıdan kahverengiye uzanır, asla yeşil olmaz. Choose Editor Gutter Mode... paletten ya da durum çubuğu menüsünden birini seçer; durum çubuğunun sağındaki kip düğmesi ya da Alt+G tek basışta bir sonrakine geçer (statusBar.showModeToggle düğmeyi gizler). İkisi de ayarı yazar. Örnek, kapsanmayan çubuklarını ve satır içi sayıları birlikte açıyor:

{
  "fuciniCoverage.editorGutter.mode": "uncovered",
  "fuciniCoverage.hitCounts.inline": true
}
Uncovered mode: a red bar and wash on lines that never ran, amber on a line with a branch arm never taken, and the execution count written after each lineScreenshot pending — add assets/img/gutters.png (see SCREENSHOTS.md).
The coverage mode in VS Code: green bars on lines that ran in full, amber where a branch arm never did, red where nothing ran; the status bar names lcov.info as the report and the mode button reads Coverage
VS Code’da: coverage kipi — bir satırın tamamen çalıştığı yerde yeşil, bir dal kolunun hiç alınmadığı yerde kehribar, hiçbir şeyin çalışmadığı yerde kırmızı. Dosyanın durum çubuğu öğesi sayılarının geldiği raporu adlandırır; yanındaki kip düğmesi Coverage der.
Alt+G pressed four times: heatmap, off, uncovered and back to coverage
VS Code’da: dört kez Alt+G — heatmap, off, uncovered ve yeniden coverage.
Visual Studio: Gutter: Coverage on Quote.cs, green, amber and red bars beside the hit counts
Visual Studio'da: Quote.cs üzerinde Gutter: Coverage (Red, Amber, Green).

Isı haritası dosyaya görelidir. Bir satırın tonu, o satırın sayacını aynı dosyanın en sıcak satırıyla logaritmik bir ölçekte ve beş kademede karşılaştırır — böylece bin kez çalışan bir döngü gövdesi ile iki kez çalışan bir işlev, biri diğerini bastırmadan birlikte görünür; her şeyin tam olarak bir kez çalıştığı bir dosya da tekdüze soluk değil, tekdüze sıcak görünür. Koyu temada renk geçişi sönük zeytin yeşilinden canlı turuncuya, açık temada soluk sarıdan kahverengiye uzanır: her iki durumda da daha fazla renk daha fazla yürütme anlamına gelir ve kırmızı, hiç çalışmamış satırlar için ayrılmış kalır. lineHighlight: "heatmap" aynı tonları kodun arkasına bir zemin rengi olarak yerleştirir, hitCounts.inline ise tam sayıyı satırın sonuna yazar.

{
  "fuciniCoverage.editorGutter.mode": "heatmap",
  "fuciniCoverage.lineHighlight": "heatmap",
  "fuciniCoverage.hitCounts.inline": true
}
The heatmap on a dark theme: functions that ran once in dim olive, the decision that ran five times in vivid orange, lines that never ran in redScreenshot pending — add assets/img/heatmap-dark.png (see SCREENSHOTS.md).
The same file on a light theme: pale yellow for lines that ran once, brown for the hottestScreenshot pending — add assets/img/heatmap-light.png (see SCREENSHOTS.md).
Switching from uncovered mode to the heatmap, on a dark and then on a light themeScreenshot pending — add assets/img/heatmap.gif (see SCREENSHOTS.md).

Renkler sizin. colorScale.lowColor, midColor ve highColor kenar boşluğunun, zemin renklerinin ve her yüzdenin kırmızısını, kehribarını ve yeşilini boyar; heatmap.colors ve heatmap.colorsDark, açık ve koyu tema için ısı haritasının beş tonunu en az çalışan satırdan en çok çalışana doğru tutar. Ayarlar sayfası sonucu hiçbir şey kaydedilmeden önce gösterir: Colour scale altında, satırlar kayıp giderken bir önizleme görünür kalır — iki dönüm noktalı renk geçişi, kendi renklerinde birkaç yüzde ve coverage kipinde ve ısı haritasında boyanmış küçük bir açık ve küçük bir koyu düzenleyici — ve bir renk seçildiği anda yeniden çizilir.

{
  "fuciniCoverage.heatmap.colors": ["#e3f2fd", "#90caf9", "#42a5f5", "#1e88e5", "#0d47a1"]
}
The settings page in VS Code: two colours typed in, the pinned colour preview repainting each time
VS Code’da: ayarlar sayfasına yazılan iki renk — önizleme her seferinde yeniden çizilir.
Visual Studio: the same settings page and the same colour preview
Visual Studio'da: aynı sayfa, aynı önizleme.

Bir satırın hiç çalışmayan kısmı

Bir satır ya kapsanmıştır ya da kapsanmamıştır; gerçek ise çoğu zaman ikisinin arasındadır: return x > hi ? hi : x; çalıştı, ama hi kolu hiç çalışmadı. lineHighlight açıkken, çalışmış bir satırın hiç yürütülmemiş kısmı düzenleyicide renklendirilir; sütun aralıkları taşıyan her biçim için (llvm-cov, Istanbul, Go, dotnet-coverage) — Annotated Source'un işaretlediği aralıkların aynısı. Yalnızca çalışmış satırlarda: hiç çalışmamış bir satır zaten bütün olarak işaretlidir. Bir C++ şablonu, herhangi bir örneklemenin yürüttüğü yerde yürütülmüş sayılır; her örneklemenin ne yaptığını ise örnekleme metriği bildirir.

An executed line whose opening brace is tinted: the if ran, the block it opens never didScreenshot pending — add assets/img/partial-line.png (see SCREENSHOTS.md).

Bu satırı hangi testler çalıştırdı

Bazı raporlar yalnızca bir satırın çalıştığını değil, onu hangi testlerin çalıştırdığını da söyler: .coveragerc içinde dynamic_context = test_function ayarıyla ve coverage json --show-contexts komutuyla yazılan coverage.py, -coverbytest seçeneğiyle toplanan OpenCover ve test başına bir bölüm (TN:) olarak yazılmış, bölümleri her satırda bir test olacak şekilde tek bir kayda toplanan bir lcov izleme dosyası. Satırın başına, isabet sayısının bulunduğu yere gelin; testler adlarıyla gösterilir — sınıf ve yönteme kısaltılmış olarak, ilk beşi adıyla, geri kalanı sayı olarak; işlevin CodeLens'i onu kaç testin çalıştırdığını söyler. Show Tests That Ran This Line — Command Palette, düzenleyicinin bağlam menüsü, Visual Studio'da Tools → Coverage Studio ya da Ctrl+Shift+U, T — bunları en yoğunu başta listeler ve seçtiğinizi çalışma alanında yazıldığı yerde açar. Bir dotnet test çalıştırması hangi testin neyi çalıştırdığını söyleyemez; testRun.perTest ayarlayın, Run Tests with Coverage test sınıflarını listeler ve her seferinde birini çalıştırır, her raporu sınıfıyla etiketler; böylece ipucu, lens ve komut .NET için de yanıt verebilir. Bu bilgi dosya başına tutulur, dolayısıyla testler hakkında hiçbir şey bilmeyen bir raporla birleştirildiğinde de korunur.

{
  "fuciniCoverage.testRun.perTest": true
}
# .coveragerc
[run]
dynamic_context = test_function

coverage run -m pytest && coverage json --show-contexts
Hovering the start of two lines of a Python file: each names the tests that ran it; an uncovered line names noneScreenshot pending — add assets/img/tests-per-line.gif (see SCREENSHOTS.md).
Show Tests That Ran This Line: the caret on a line, the list of tests that ran it busiest first, and the picked test opened where it is writtenScreenshot pending — add assets/img/tests-for-line.gif (see SCREENSHOTS.md).
Show Tests That Ran This Line: liste, en yoğunu başta, ve yazıldığı yerde açılan test.
Visual Studio: the caret on line 62 of Quote.cs, Show Tests That Ran This Line, the dialog listing Tests.QuoteTests, and Go to Test opening QuoteTests.cs
Visual Studio'da: Quote.cs dosyasının 62. satırında Show Tests That Ran This Line — onu çalıştıran test ve testi açan Go to Test.

İşaretlerde başarılı ya da başarısız

Kapsanan bir satır, testi geçmiş de olsa kalmış da olsa aynı görünür. Raporun bir satırı hangi testlerin çalıştırdığını söylediği ve çalıştırıcının sonuç dosyasının bu testlerin nasıl bittiğini söylediği yerde, başarısız bir testin çalıştırdığı satırın başına kırmızı bir çubuk, genel bakış cetveline de bir şerit konur; satırın ipucu başarısız testlerin adlarını verir ve Show Tests That Ran This Line her birinin yanına başarısız yazar. Bir test kırmızıyken bakılacak yer, onun içinden geçtiği koddur. Sonuçlar her yüklemede her raporun klasöründen — her .trx dosyası ve JUnit biçiminde yazan araçların kullandığı adlar (TEST-*.xml, junit*.xml, test-results*.xml) — ve klasöre göreli yollar ya da glob desenleri olarak testResults.paths içinden okunur. Run Tests with Coverage, dotnet test'ten raporun yanına bir test-results.trx yazmasını ister; dolayısıyla testRun.perTest açıkken ayrıca bir şey ayarlamak gerekmez. testResults.enabled bu okumayı kapatır.

{
  "fuciniCoverage.testResults.paths": ["build/test-results/**/*.xml", "reports/junit.xml"]
  }
A failing test: a red bar on the lines it ran, the hover naming it under Failing tests that ran this line, and Show Tests That Ran This Line writing failed beside itScreenshot pending — add assets/img/pass-fail.gif (see SCREENSHOTS.md).
Visual Studio: a failing test — the red bar on the lines it ran, the hover naming it, and Show Tests That Ran This Line writing failed beside itScreenshot pending — add assets/img/vs-pass-fail.gif (see SCREENSHOTS.md).
Visual Studio'da: kırmızı bir test — çalıştırdığı satırlardaki kırmızı çubuk, üzerine gelince adını söyleyen ipucu ve yanına failed yazan Show Tests That Ran This Line.

Bir değişikliğin dokunduğu testler

Tam bir çalıştırmanın yavaşça yanıtladığını Run Tests Affected by My Changes… hemen yanıtlar: bütün testler içinde hangileri az önce düzenlediğim koddan geçti? git'ten çalışma ağacının testImpact.baseRef karşısındaki farkı istenir — varsayılan olarak HEAD, yani henüz commit edilmemiş olan; dalın değiştirdiği her şey için origin/main — ve değişen bir satırı çalıştıran testler listelenir; değişikliğin en büyük bölümünü çalıştıran test en başta. Bir testi seçmek onu açar. Raporların test başına bir çalıştırmadan (testRun.perTest) geldiği yerde ilk girdi yalnızca bu testleri çalıştırır, her sınıfı kendi raporuna yazarak; böylece geri kalan bütün sınıfların raporları yerinde durur ve toplamlar bütün test takımının toplamları olarak kalır. Yalnızca bir eklemenin ya da silmenin altındaki satırları çalıştırmış bir test de listelenir: aksi halde raporu yanlış satırları gösterirdi.

An uncommitted edit, Run Tests Affected by My Changes…, the list with the test that ran most of the change first, and the run of only those testsScreenshot pending — add assets/img/test-impact.gif (see SCREENSHOTS.md).
Visual Studio: an edit, Run Tests Affected by My Changes…, the list with the test that ran most of the change first, and the run of only thoseScreenshot pending — add assets/img/vs-test-impact.gif (see SCREENSHOTS.md).
Visual Studio'da: bir düzenleme, Run Tests Affected by My Changes…, değişikliğin en büyük kısmını çalıştıran testin başta olduğu liste ve yalnızca bu testlerin çalıştırılması.

Her satırı yine de çalıştıran en küçük test kümesi

Show Minimal Test Set…, aynı test başına satır verisinden iki soruyu yanıtlar: test takımının çalıştırdığı her satırı hangi birkaç test yine de çalıştırır — commit öncesi hızlı çalıştırma için — ve hangi testler, başka bir testin zaten çalıştırmadığı hiçbir satırı çalıştırmaz. Seçilen testler önce gelir, her biri eklediği satırlarla ve yalnızca kendisinin çalıştırdığı satırlarla birlikte; sonra geri kalanlar, her biri hiçbir şey eklemediği belirtilerek. Seçim açgözlü seçimdir — önce en çok satırı çalıştıran test, sonra ona en çok satır ekleyen — bu yüzden en küçük kümeye yakındır ve her seferinde aynıdır. Satırlara göre gereksiz olmak, bir testin denetlediği şeye göre gereksiz olmak değildir: hiçbir satır eklemeyen bir test, yine de o satırlardaki bir değeri doğrulayan tek test olabilir. Liste, bir test takımı budanırken nereye bakılacağını söyler, neyin silineceğini asla.

Show Minimal Test Set…: the chosen tests first, then the tests that add nothingScreenshot pending — add assets/img/minimal-test-set.png (see SCREENSHOTS.md).
Visual Studio: Show Minimal Test Set… — the chosen tests, then the tests that add nothingScreenshot pending — add assets/img/vs-minimal-test-set.png (see SCREENSHOTS.md).
Visual Studio'da: Show Minimal Test Set… — seçilen testler, ardından hiçbir şey eklemeyen testler.

Bu testi çalıştır, kapsamla

İmleci bir testin içine koyun ve Run This Test with Coverage komutunu çalıştırın — Command Palette, düzenleyicinin bağlam menüsü, Visual Studio'da Tools → Coverage Studio ya da Ctrl+Shift+U, R — ve yalnızca o test kapsam açıkken çalışır: imlecin içinde olduğu test yöntemi, yöntemler arasındaysa test sınıfı ya da describe bloğu, her sınıfın üstündeyse dosya. İmlecin altındaki metinden okunur; bu yüzden hangi dil hizmeti kurulu olursa olsun C#, VB ve F# ([Fact], [Test], [TestMethod] ve benzerleri), JavaScript ve TypeScript (it, test, describe) ve Python (def test_…) için çalışır. Klasörün tarifi ona daraltılır — dotnet test --filter "FullyQualifiedName~…", jest ya da vitest <file> -t "…", bir pytest düğüm kimliği — ve yazdığı her çalıştırma gibi yüklenir; daraltılamayan bir çalıştırıcı bunu söyler ve Run Tests with Coverage hepsini çalıştırır.

Run This Test with Coverage: the caret in a Fact, the one dotnet test --filter run in the terminal, the gutter of the class under test filling inScreenshot pending — add assets/img/run-this-test.gif (see SCREENSHOTS.md).
Run This Test with Coverage: bir test, bir çalıştırma, test edilen sınıf aydınlanmış.
Visual Studio: the caret in the Fact AGoldCustomerGetsTenPercent, Run This Test with Coverage, the run appearing in the Tracefiles list and the lenses saying run by 1 test(s)
Visual Studio'da: bir [Fact] içinde Run This Test with Coverage — Tracefiles listesindeki çalıştırma, metotların üstündeki satırlar kodu tek bir testin çalıştırdığını söylüyor.

Go ve Rust. Bir Go dosyasında imlecin içinde olduğu func TestXxx (ya da Fuzz…, Example…) tek başına, kendi paketinde ve tam adıyla çalışır — go test ./pkg/calc -run "^TestTotal$" — ve imleç bir testin dışındaysa dosyanın paketi çalışır. Bir Rust dosyasında #[test] işlevi crate içindeki yoluyla ve --exact ile çalışır; imleç bir mod içinde olup hiçbir testin içinde değilse o modülün testleri çalışır; tests/ altındaki bir entegrasyon testi kendi ikili dosyasında çalışır (--test api). Bir çalıştırıcıya yalnızca kendi dilinin dosyaları verilir: bir Go klasöründeki bir TypeScript dosyası için boş bir çalıştırma başlatılmaz, durum bir cümleyle bildirilir.

Her kayıttan sonra kapsam

testRun.onSave açıkken bir kaynak dosyayı kaydetmek, kaydettikten kısa bir süre sonra onu kapsayan testleri kapsamla çalıştırır ve kenar boşluğu bunu izler. Bir .NET çözümünde kaydedilen dosyanın projesi .csproj grafı üzerinden bulunur ve yalnızca ona — doğrudan ya da başka projeler üzerinden — başvuran test projeleri çalıştırılır, her biri bir dotnet test <project>; diğer her çalıştırıcı tarifinin tamamını çalıştırır; hiçbir projenin sahip olmadığı ve hiçbir raporun ölçmediği bir dosya hiçbir şey çalıştırmaz. Art arda birkaç kayıt tek bir çalıştırmadır ve sürmekte olan bir çalıştırma kesilmez. Gerisi Run Tests with Coverage nasıl yapıyorsa öyledir: terminal, Output bölmesi, yüklenen rapor. Varsayılan olarak kapalı — bu keşfedilecek bir varsayılan değil, seçilecek bir alışkanlıktır.

{
  "fuciniCoverage.testRun.onSave": true
}
Coverage after every save: an edit to a C# file, Ctrl+S, the covering test project runs by itself, and the gutter changesScreenshot pending — add assets/img/coverage-on-save.gif (see SCREENSHOTS.md).
Her kayıttan sonra kapsam: düzenleyin, kaydedin, kenar boşluğu kısa bir süre sonra izler.
Visual Studio: with testRun.onSave on, a comment line added to Quote.cs and saved, the tests running by themselves and the lens above Price changing
Visual Studio'da: testRun.onSave açık — Quote.cs kaydedildi, testler kendiliğinden çalışıyor, metodun üstündeki satır değişiyor.

Uygulamanın kendisi, kapsamla

Bir test çalıştırması, testlerin hangi kodu çalıştırdığını söyler. Bir insanın çalıştırdığı kod — bir sürümden önce ekranları tıklayarak dolaşırken, bir müşterinin adımlarını yinelerken — o da kapsamdır ve onu Run App with Coverage… toplar. Klasörün .NET uygulaması — bir Exe, bir WinExe, bir web ya da worker projesi, asla bir test projesi değil; birden çok varsa bir seçim listesi çıkar — Microsoft'un dotnet-coverage aracı altında, bir konsol uygulamasına yazı yazılabilsin diye kendi konsolunda başlatılır ve siz kapatana kadar çalışır. İçinden geçtikleriniz sonra her çalıştırma gibi yüklenir ve bir kapsam oturumunda testlerin çalıştırdıklarına eklenir. Uygulamanın nasıl sonlandığı, çalıştırmanın başarısız sayılmasına yol açmaz. Aracın bir kez kurulması gerekir: dotnet tool install --global dotnet-coverage.

Run App with Coverage…: the console app started under dotnet-coverage, a few inputs, closed, and its coverage loadedScreenshot pending — add assets/img/run-app.gif (see SCREENSHOTS.md).
Visual Studio: Run App with Coverage… — the console app, a few inputs, closed, and its coverage loadedScreenshot pending — add assets/img/vs-run-app.gif (see SCREENSHOTS.md).
Visual Studio'da: Run App with Coverage… — konsol uygulaması, birkaç girdi, kapatılması ve yüklenen kapsamı.

Mutantlar ve bulundukları yerler

Bir mutasyon aracı — Java için PIT, JavaScript, C# ve Scala için Stryker, C ve C++ için Mull — kodunuzu küçük biçimlerde değiştirir ve testleri her değişikliğe karşı çalıştırır. Hiçbir testin fark etmediği bir değişiklik, hayatta kalan bir mutanttır: kod çalıştı ve ne yaptığını hiçbir şey denetlemedi. Mutasyon puanı kaç tanesinin yakalandığını söyler; 0.2026.83 sürümünden itibaren düzenleyici, diğerlerinin nerede olduğunu söyler. Böyle bir mutant içeren satırın sonunda bir not bulunur (⚑ 2 mutants survived), rapor hangi metnin değiştiğini belirtiyorsa değiştirilen metnin altı çizilir (Stryker ve Mull belirtir), genel bakış cetvelinde bir şerit yer alır ve üzerine gelince neyin değiştirildiği, onu kaç testin çalıştırdığı ve yakalanan mutantlar için hangi testin yakaladığı gösterilir.

A surviving mutant in the editor: the note after the line, the underlined text, and the hover naming the change — ConditionalBoundary: value <= loScreenshot pending — add assets/img/mutant-hover.png (see SCREENSHOTS.md).

Hayatta kaldı, testlerin değiştirilen kodu çalıştırdığı ve hepsinin geçtiği anlamına gelir. Test edilmedi (raporda no coverage), o kodu hiçbir testin çalıştırmadığı, dolayısıyla hiçbir şeyin fark edemeyeceği anlamına gelir. Yakalanan mutantlar üzerine gelince sayılır ve asla işaretlenmez; hiçbir zaman adil bir sınama olmamış mutantlar — örneğin derlenmeyecek olanlar — puanın dışındadır. Annotated Source'ta bu tür her satırın altında bir satır ve bir Next Mutant düğmesi (U) bulunur; HTML raporlarında ise satıra bağlantı veren bir Surviving Mutants bölümü vardır. Hiçbir şeyi açmak gerekmez ve mutasyon raporu olmayan bir proje bunların hiçbirini görmez.

Surviving mutants marked in the editor, the hover naming the change, and the annotated source jumping from one to the next with UScreenshot pending — add assets/img/mutants.gif (see SCREENSHOTS.md).

Bir test fark eder miydi? İmlecin olduğu yerde bir mutasyon çalıştırması

Bir projenin mutasyon çalıştırması bir saat sürer; tek bir işlevinki bir dakika. Run Mutation Tests Here o bir dakikalık çalıştırmayı yapar: klasörün mutasyon çalıştırıcısına, imlecin içinde olduğu işlevi — ya da seçili satırları, ya da dosyayı — mutasyona uğratması söylenir ve raporu ekrandaki kapsamın yanına yüklenir; hayatta kalan mutantlar orada işaretlenir. C# için bu Stryker.NET'tir (dotnet tool install --global dotnet-stryker); ona karakter aralığı ve dosyanın projesine başvuran test projesi bildirilir; JavaScript ve TypeScript için StrykerJS'tir, ona satırlar bildirilir; Java için Maven ile PIT'tir, ona sınıf bildirilir. Mutasyon çalıştırıcısının nasıl sonlandığı, çalıştırmanın başarısız sayılmasına yol açmaz: eşiğinin altındaki bir puan bir çıkış kodudur, ama ortada yine de bir rapor vardır. Hiçbir şey yazmamış bir çalıştırıcı olduğunda bu, neyin kurulu olması gerektiğiyle birlikte söylenir.

Run Mutation Tests Here on one function: Stryker.NET runs that minute, and the surviving mutants are marked in the editorScreenshot pending — add assets/img/mutation-here.gif (see SCREENSHOTS.md).
Visual Studio: Run Mutation Tests Here on one function, and the surviving mutants markedScreenshot pending — add assets/img/vs-mutation-here.gif (see SCREENSHOTS.md).
Visual Studio'da: tek bir işlevde Run Mutation Tests Here ve işaretlenmiş hayatta kalan mutantlar.

VS Code’un kendi Test Coverage görünümü

testCoverage.publish açıkken (varsayılan), yüklenen her çalıştırma düzenleyicinin yerel Test Coverage görünümüne de gider — Test Explorer’ın kapsam paneli, onun Explorer’a koyduğu dosya başına yüzdeler ve düzenleyicinin kendi Show Inline Coverage anahtarı — satırlar, dal kolları ve işlevler olarak, ayrıntılar istek üzerine yüklenerek, hangi iz dosyasından gelmiş olurlarsa olsunlar ve hiçbir test bağdaştırıcısı işin içine girmeden. Show in Test Coverage View, ayar ne derse desin etkin çalıştırmayı yayımlar ve paneli açar; durum çubuğu menüsü bunu quickActions.showTestCoverage arkasında sunar. Kapalıyken Test Explorer’da hiçbir Fucini Coverage girdisi görünmez. Bir iz dosyası testlerini adlandırdığında (lcov'un TN: bölümleri), her test Test Explorer'da Fucini Coverage altında görünür ve görünüm bir dosyanın kapsamını teste göre filtreleyebilir.

VS Code's own Test Coverage view filled from the loaded reports, one bar each for statements, branches and functionsScreenshot pending — add assets/img/test-coverage-view.png (see SCREENSHOTS.md).

Problems panelinde kapsanmayan satırlar

Doğası gereği gürültülü olduğu için varsayılan olarak kapalıdır ve yalnızca açık olan belgeler içindir — iki bin dosyalık bir çalıştırma paneli boğamaz. Dosya başına tek kayıtla yetinen problems.enabled’dan bağımsızdır:

{
  "fuciniCoverage.problems.perLine": "uncoveredAndPartial"
}
The Problems panel: one entry per file below the statement threshold, and a possible-dead-code entry for every function that never ranScreenshot pending — add assets/img/problems-panel.png (see SCREENSHOTS.md).

9. Fark kapsamı

Süslemeleri bir git temel referansına göre değişen satırlarla sınırlayın — bir PR'ın tam olarak neyi kapsayıp neyi kapsamadığını incelemek için ideal:

{
  "fuciniCoverage.gitDiff.enabled": true,
  "fuciniCoverage.gitDiff.baseRef": "origin/main"
}
Diff coverage: only the five lines changed against the base ref are marked and judged — 5 of 5 lines, 7 of 8 branchesScreenshot pending — add assets/img/diff-coverage.png (see SCREENSHOTS.md).

Visual Studio'da. Aynı iki ayar, aynı dosyalardan okunur: uzantı, çalıştırmanın her dosyası için git diff <baseRef> komutunu kendisi çalıştırır ve çalıştırmayı dalınızın değiştirdiği satırlara indirger — kenar çubuğunda, Coverage penceresinde ve eşik denetimlerinde. git hiçbir şey yanıtlamadığında Output bölmesi git'in ne yanıtladığını söyler.

Yeni kod için bir eşik

threshold.newCode, tüm çalıştırmaya uygulanan eşiklerin yanında başlı başına bir eşiktir: gitDiff.baseRef karşısında değişen ve ölçülebilen satırların çalışmış olması gereken en düşük yüzdesi. Genelde %62'de olan bir proje, bugün yazılanın test edilmesini yine de isteyebilir. Her yüklemede, ekranda kalmaya devam eden tüm çalıştırma üzerinden sayılır — gitDiff.enabled ise başka bir şeydir: çalıştırmanın yerine değişen satırları gösterir. Check Coverage Thresholds ve Problems içindeki uyumluluk kayıtları, bu eşiğin aşılamadığını kendi cümlesiyle bildirir: New code 72.00% < 80% (18 of 25 line(s) changed against origin/main ran). Ölçülebilecek hiçbir satırı olmayan bir değişiklik — yorumlar, bir README — hiçbir şeyi başarısız kılmaz.

{
  "fuciniCoverage.threshold.newCode": 80,
  "fuciniCoverage.gitDiff.baseRef": "origin/main"
  }
Check Coverage Thresholds failing New code 72.00% < 80% beside a run that passes its own gatesScreenshot pending — add assets/img/new-code-gate.png (see SCREENSHOTS.md).
Visual Studio: Check Coverage Thresholds failing the new-code gate in the Error List, beside a run that passes its own gatesScreenshot pending — add assets/img/vs-new-code-gate.png (see SCREENSHOTS.md).
Visual Studio'da: yeni kod eşiğinde başarısız olan Check Coverage Thresholds, kendi eşiklerini geçen bir çalıştırmanın yanında.

Etikete, yazara, tarihe göre yeni kod

Yeni kod, varsayılan olarak çalışma ağacının gitDiff.baseRef karşısında değiştirdiği satırlardır — bir dal, bir commit ya da bir etiket: "v1.4.0", o sürümden bu yana olan her şeydir. İki ayar, bir referansın soramadığını sorar. gitDiff.author bir yazarın adının bir parçasını alır ve yeni kod o zaman git'in o yazara atfettiği satırlardır; gitDiff.since bir gün alır ve yeni kod o zaman, hangi dalla gelmiş olurlarsa olsunlar, en son o gün ya da daha sonra değiştirilmiş satırlardır; ikisi birlikteyse o yazarın o günden bu yana değiştirdiği satırlar. Bu satırlar git blame'den, aynı anda tek bir dosya olmak üzere okunur — büyük bir çalıştırma bunu her yüklemede hisseder — ve fark kapsamı ile yukarıdaki eşik için diff'in yerini alır. Henüz commit edilmemiş bir satır her iki durumda da sayılır.

{
  "fuciniCoverage.gitDiff.author": "Ada",
  "fuciniCoverage.gitDiff.since": "2026-09-01"
  }
The same gate scoped by author and date: new code by Ada since 2026-09-01Screenshot pending — add assets/img/new-code-author.png (see SCREENSHOTS.md).

Dolaylı değişiklikler: kimse dokunmadığı halde değişenler

Bir diff hangi satırların değiştiğini söyler; iki çalıştırma ise hangi satırların artık çalışmadığını ya da çalışmaya başladığını söyler. Bakmaya değer satırlar, bu ikisinin uyuşmadığı satırlardır: kimsenin düzenlemediği ama artık çalışmayan kod — çünkü bir test silinmiştir, akışta daha önce gelen bir dal artık erken dönüyordur, bir fixture değişmiştir. Diff'i gözden geçiren biri bunları göremez — tanım gereği diff'in dışındadırlar. Show Indirect Coverage Changes… bunları dosya dosya, en çok kaybeden dosya başta olmak üzere listeler ve seçtiğiniz dosyayı bu türden ilk satırında açar. Çalıştırma, baseline.report bir temel çizgi adlandırıyorsa CI temel çizgisiyle — bir pull request de buna göre değerlendirilir — aksi halde kendinden önceki çalıştırmayla karşılaştırılır; çalışma ağacının gitDiff.baseRef karşısında değiştirdiği satırlar ve bu değişikliğin dosyanın satırlarını kaydırdığı bir yerin altındaki her şey dışarıda bırakılır.

Show Indirect Coverage Changes…: a file that lost lines nobody edited, after a test was removed between two runsScreenshot pending — add assets/img/indirect-changes.png (see SCREENSHOTS.md).
Visual Studio: Show Indirect Coverage Changes… — a file that lost lines nobody editedScreenshot pending — add assets/img/vs-indirect-changes.png (see SCREENSHOTS.md).
Visual Studio'da: Show Indirect Coverage Changes… — iki çalıştırma arasında bir test kaldırıldıktan sonra, kimsenin düzenlemediği satırları kaybeden bir dosya.

10. Bileşik puan

Uzantı, altı sayı raporlamak yerine bunları tek bir Ağırlıklı Harmonik Ortalama'da (WHM) birleştirir. Yüzdeleri pᵢ ve ağırlıkları wᵢ olan metrikler için:

WHM = ( Σ wᵢ ) / ( Σ wᵢ / pᵢ )

Harmonik ortalamaya en küçük terim hakimdir, bu nedenle zayıf bir metrik mükemmel bir metrikle maskelenemez — tam olarak bir güvenlik kapısından istediğiniz özellik budur. Varsayılan ağırlıklar:

ÖlçütAğırlıkGerekçe
MC/DC4IEC 61508 SIL 3–4 / ISO 26262 ASIL C–D / DO-178C DAL A–B.
Dallar2IEC 61508 SIL 2+ / ISO 26262 ASIL B+.
Koşullar3Dallar ile MC/DC arasında (DO-178C, ISO 26262).
Bölgeler1.5Deyim içi yollar (ör. kısmi kısa devre).
Satırlar1IEC 61508 SIL 1+ / ISO 26262 ASIL A+.
İşlevler1Ölü kod denetimi.
Örneklemeler0.5C++ şablon kapsamı; en dar kapsam.
İşlev çağrıları1Yürütülmüş olan çağrı noktaları (gcov, VectorCAST, Testwell CTC++, TRACE32).
Nesne kodu0Ona bir ağırlık vermediğiniz sürece kapalıdır: deyim kapsamını zaten içerir.
Mutasyon puanı0Ona bir ağırlık vermediğiniz sürece kapalıdır: kapsam değildir.

Bir metriği puandan çıkarmak için herhangi bir ağırlığı 0 olarak ayarlayın. Verilerde bulunmayan metrikler (örneğin düz bir lcov çalıştırmasındaki MC/DC) basitçe atlanır.

Nesne kodu ve mutasyon puanı, siz aksine karar verene kadar 0 ağırlığındadır (whmWeights.objectCode, whmWeights.mutation). Nesne kodu kapsamı deyim kapsamını içerir; bu nedenle ikisine de ağırlık vermek aynı kanıtı iki kez saymak olur. Mutasyon puanı ise hiç kapsam değildir — bir test paketi her satırı çalıştırıp hiçbir şeyi yakalamayabilir. Her ikisinin de yine kendi sütunu ve kendi eşiği vardır.

The default weights of the composite score: MC/DC 4, branches 2, regions 1.5, lines, functions and function calls 1, instantiations 0.5; object code and mutation score 0 until given a weightScreenshot pending — add assets/img/score-weights.svg (see SCREENSHOTS.md).

Koşul kapsamı

a && b tek bir karardır — iki dal — ve dört sonucu olan iki koşuldur. Bir test takımı her iki dalı da alıp b'nin yanlış olduğu durumu hiç görmeyebilir: dal kapsamı tamdır, koşul kapsamı ise dörtte üçtür. Bu düzey, DO-178C ve ISO 26262'de dal kapsamı ile MC/DC arasında yer alır ve 0.2026.83 sürümünden itibaren dalların içine katılmak yerine kendi başına bir metriktir: durum çubuğu kartlarında bir satır, Coverage görünümünde, raporlarda ve dışa aktarımlarda bir sütun, puanda 3 ağırlık (whmWeights.conditions) ve bir kapı (threshold.conditions; standard profilinde kapı yok, safety profilinde 100).

One decision, a && b, and the same two tests: branches 2 of 2, conditions 3 of 4 because b is never seen false, MC/DC 1 of 2 because b is never shown to matterScreenshot pending — add assets/img/branch-condition-mcdc.svg (see SCREENSHOTS.md).

BullseyeCoverage condition sondalarından, bir TRACE32 cond dışa aktarımından ve -fcondition-coverage ile derlenen GCC 14'ten okunur. Koşulları kararlardan ayırt etmeyen bir raporda böyle bir satır, sütun ya da ağırlık bulunmaz. Bullseye veya TRACE32 kullanıyorsanız: koşullar eskiden dal olarak sayılıyordu; bu nedenle dal yüzdeniz bu sürümle değişir, yeni ağırlıkla birlikte bileşik puanınız da değişir. Puanı eskisi gibi görmek için whmWeights.conditions değerini 0 yapın.

GCC 14, satır satır. -fcondition-coverage, gcov'un hangi koşulun hangi sonucunun eksik olduğunu söylemesini sağlar — koşul 1 hiç doğru olmadı, koşul 0 hiç doğru da yanlış da olmadı — ve her koşul, gcov'un JSON'undan ve metin dökümünden (condition outcomes covered 3/6) okunarak kendi satırında işaretlenir ve ipucunda adıyla belirtilir. Ölçüt, diğer ölçütlerin bulunduğu her yerdedir: threshold.conditions ona eşik koyar ve bir çalıştırmada böyle bir değer yoksa bu eşik değerlendirilmeden bırakılır, Copy Coverage Summary çıktısında bir Conditions sütunu vardır, badge.metric conditions değerini alır ve arama kutusu conditions < 80 ifadesini kabul eder. Bir işlevin dal değeri, dosyanınki ve çalıştırmanınki gibi, koşullarının sonuçlarını içermez.

GCC 14 condition coverage: the mark on the line and the hover naming the outcome never seenScreenshot pending — add assets/img/gcc-conditions.png (see SCREENSHOTS.md).

Karmaşıklık ve CRAP

Bazı raporlar her işlevin döngüsel karmaşıklığını taşır: OpenCover (Coverlet'in yazdığı biçim budur), JaCoCo, Clover ve Cobertura. Bu durumda uzantı, işlev için bu karmaşıklıktan ve kendi ölçtüğü kapsamdan bir CRAP puanı — Change Risk Anti-Patterns — hesaplar:

CRAP = complexity² × (1 − coverage)³ + complexity

Basit ve tamamen test edilmiş bir işlevin puanı kendi karmaşıklığı kadardır, fazlası değil; karmaşık ve neredeyse hiç test edilmemiş bir işlevin puanı ise yüzleri bulur. Demo projesinin C# örneğinde Price() işlevinin karmaşıklığı 22'dir ve satırlarının yaklaşık %37'si kapsanmıştır; bu 142.2 eder. Shipping() işlevinin karmaşıklığı ise 12'dir ve tamamen kapsanmıştır; bu da 12 eder. Alışılmış sınır 30'dur: bu değerde veya üzerinde olan bir işlev, HTML raporunda Riskiest Methods altında, en kötüsü en başta olacak şekilde listelenir.

CRAP against line coverage for two methods: Price() with complexity 22 sits at 142.2 and needs about 75% coverage to get under 30; Shipping() with complexity 12 is fully covered and scores 12Screenshot pending — add assets/img/crap-curve.svg (see SCREENSHOTS.md).

Karmaşıklık ve puan, işlevin CodeLens'inde ve açıklamalı kaynakta işlevin yanında yer alır. Max CRAP, bir dosyadaki işlevlerin en yüksek puanıdır — ortalama değil, en kötüsü — ve Coverage görünümünde, HTML raporunda ve CSV ile Markdown dışa aktarımlarında bir sütundur. Bilgi amaçlıdır: eşiği yoktur ve bileşik puanda ağırlığı yoktur. Karmaşıklık taşımayan raporların (lcov, gcov, Istanbul, coverage.py) CRAP değeri de olmaz, boş bir sütunu da.

0.2026.83 sürümünden itibaren C ve C++ için de var. llvm-cov karmaşıklık bildirmez; bu yüzden raporun zaten taşıdığı dal verilerinden sayılır: işlevin kendi dosyasında yazılmış koşullar, artı bir — McCabe'in tanımı ve kaynak düzeyindeki araçların .NET ve Java için saydığı şey. Başka bir dosyadaki makrodan gelen koşullar, örneğin her assert, sayılmaz.

The Riskiest Methods section of the HTML report: Price() with complexity 22, 37.14% of its lines covered, CRAP 142.2Screenshot pending — add assets/img/riskiest-methods.png (see SCREENSHOTS.md).

Risk hotspots ve hangi dosyaların gösterileceği

Coverage görünümünün ağacının altında Risk hotspots, karmaşık kodun az kapsamla buluştuğu işlevleri en kötüsü başta olmak üzere listeler; her biri dosyasını işlevde açar. Bir işlev CRAP puanıyla — hotspots.crapThreshold, varsayılan 30, metriğin yazarlarının önerdiği değer — ya da tek başına döngüsel karmaşıklıkla, hotspots.complexityThreshold, varsayılan olarak kapalı, listeye girer; yalnızca karmaşıklık taşıyan raporlarda (OpenCover, Coverlet'ten Cobertura, JaCoCo, llvm-cov) bulunur. Community sayıyı ve en kötü puanı görür; sıralı liste Pro'dadır. Sıralamanın yanındaki ikinci açılır liste ağacın hangi dosyaları göstereceğini söyler — tümü, boşluklu dosyalar, test edilmemiş dosyalar ya da son çalıştırmadan beri değişen dosyalar; klasörler dosyalarını izler ve kendi sayılarını korur. İkisi de Visual Studio'da, Coverage penceresinde de vardır.

Visual Studio: the Coverage window with the filter beside the sort and the risk hotspots under the treeScreenshot pending — add assets/img/vs-hotspots.png (see SCREENSHOTS.md).
Visual Studio'da: sıralamanın yanındaki filtre ve ağacın altındaki Risk hotspots ile Coverage penceresi.

Ad alanları, sınıflar ve yöntemler

Sınıflarını adlandıran bir .NET raporu için — Cobertura ve Coverlet'in coverage.cobertura.xml dosyası, OpenCover — üçüncü bir açılır liste, Folders / Namespaces, aynı çalıştırmayı ad alanları, sınıflar ve yöntemler olarak çizer: bir ad alanının sayısı sınıflarının toplamıdır, bir sınıfınki yöntemlerinin; tıpkı bir klasörünkinin dosyalarının toplamı olması gibi, aynı sıralama ve aynı süzgeçle. Bir yöntem satırı dosyayı yöntemde açar; hiçbir ad alanında bildirilmemiş bir sınıf (no namespace) altındadır. Seçim coverageView.perspective ayarına yazılır; sınıf adı taşımayan bir çalıştırmanın açılır listesi yoktur ve klasörlerini gösterir. Visual Studio'da Coverage penceresinde aynı açılır liste vardır.

The Coverage view drawn as namespaces, classes and methods, the dropdown on Namespaces, a method row about to open its fileScreenshot pending — add assets/img/namespace-perspective.png (see SCREENSHOTS.md).
Aynı çalıştırma ad alanı, sınıf ve yönteme göre.
Visual Studio: the Coverage window with the dropdown on Namespaces, the Pricing namespace open on Customer and its methods
Visual Studio'da: ad alanı, sınıf ve metoda göre Coverage penceresi.

Düğmelerin ve açılır listelerin altında bir arama kutusu. Bir sözcük, adı ya da yolu onu taşıyan satırları tutar — yazılan her sözcüğün orada olması gerekir; bir karşılaştırma, rakamı onu geçen satırları tutar — puan üzerinde < 80%, lines >= 90, branches = 0, functions != 100, mcdc < 50 — ve invoice < 80 ikisini birden ister. Ad alanı perspektifinin yöntem satırları ve risk noktaları dosyalarla birlikte aranır; böylece bir işlev çalıştırmada olduğu yerde bulunur. Ağaç siz yazdıkça, sayfanın içinde, yeniden çizilmeden süzülür; eşleşme içeren bir klasör onun için açılır ve kutu boşalınca yeniden kapanır; Esc kutuyu temizler. Aynı kutu, aynı dil bilgisi, Visual Studio'da.

Typing lines < 80 into the Coverage view's search box: the tree keeps only the files under eighty percent, folders opening to show themScreenshot pending — add assets/img/tree-search.gif (see SCREENSHOTS.md).
Ağaçta arama: bir ad, sonra lines < 80.

Ağaç düzenleyiciyi izler

Baktığınız dosya Coverage görünümünde vurgulanır, üstündeki klasörler açılır ve satırı görünür alana kaydırılır — zaten açık olan dosyayı ağaçta aramak artık gerekmez. Bunun dışında ağaç kaydırma konumunu korur ve hiçbir şey yeniden çizilmez. coverageView.followActiveEditor varsayılan olarak açıktır; ağacı bıraktıkları yerde tutmayı yeğleyenler bunu bu ayarla kapatır.

Switching editor tabs: the Coverage view's highlighted row follows, the folders above it openedScreenshot pending — add assets/img/follow-editor.gif (see SCREENSHOTS.md).
Visual Studio: switching documents, and the Coverage window's highlighted row followingScreenshot pending — add assets/img/vs-follow-editor.gif (see SCREENSHOTS.md).
Visual Studio'da: belgeler arasında geçiş ve Coverage penceresinin onu izleyen vurgulu satırı.

11. Uyumluluk kapılaması

COMPLIANT / NON-COMPLIANT kararı (açıklamalı kaynak görünümünde, HTML raporunda ve her iki durum çubuğu üzerine gelme bilgisinde gösterilir), metrik başına eşikler ve bir modla belirlenir:

The status-bar hover card: NON-COMPLIANT, 3 of 5 gates below threshold — functions and regions pass, lines and branches miss narrowly (amber), MC/DC misses outright (red)Screenshot pending — add assets/img/statusbar.png (see SCREENSHOTS.md).
ModCOMPLIANT olduğunda…
strict (default)ayrı ayrı denetlenen her ölçüt kendi eşiğini karşılar — ödün yok.
whmtek ağırlıklı bileşik puan threshold.weighted değerini karşılar.
bothhem ağırlıklı denetim HEM DE ölçüt bazlı katı denetim karşılanır.
eitherağırlıklı denetim VEYA ölçüt bazlı katı denetim karşılanır (en gevşek).

0 değerindeki bir eşik o kapıyı kapatır ve raporun taşımadığı bir ölçüt hiçbir zaman değerlendirilmez. Ayarlamadığınız bir eşiğin ne anlama geldiğini aşağıdaki profil belirler. Talep üzerine değerlendirmek için Fucini Coverage: Check Coverage Thresholds komutunu çalıştırın.

Visual Studio'da. Tools → Coverage Studio → Check Coverage Thresholds, çalıştırmayı aynı threshold.* anahtarlarına göre değerlendirir ve sonucu durum çubuğunda ve Output bölmesinde söyler; compliance.diagnostics, problems.enabled, problems.perLine ya da deadCode.enabled ile bulgular Error List'te derleyicininkilerin yanında durur — eşiğin altındaki her dosya için bir kayıt, kapsanmamış her aralık için bir kayıt, hiç çalışmamış her işlev için bir kayıt — ve her biri dosyasını ilgili satırda açar.

Visual Studio: Check Coverage Thresholds, with the findings in the Error List beside the compiler's ownScreenshot pending — add assets/img/vs-error-list.png (see SCREENSHOTS.md).
Visual Studio'da: Check Coverage Thresholds, bulgular Error List içinde.

Eşik profilleri

threshold.profile, ayarlamadığınız bir eşiğin ne anlama geldiğini belirler. 0.2026.82 sürümünden beri varsayılan olan standard, güvenlikle ilgili olmayan sıradan bir projeden beklenebilecek düzeydir. safety ise her kapının 100 olmasıdır — bir güvenlik gerekçesinin (safety case) istediği ve 0.2026.81 sürümüne kadar sunulanın tam olarak aynısı.

Ölçütstandardsafety
Satırlar80100
İşlevler80100
Bölgeler75100
Dallar70100
Bileşik puan75100
MC/DC, örneklemeler, işlev çağrıları, nesne kodukapı yok100
Koşullarkapı yok100
Mutasyon puanıkapı yokkapı yok

Kendi ayarladığınız bir eşik her iki profile de üstün gelir. Örnek, dallar için kapıyı 90'a, geri kalan her şey için 100'e koyar; yalnızca bazı ölçütleri 100'de tutmak için standard profilinde kalın ve bunları kendiniz ayarlayın. Ayarların işleyişinden kaynaklanan bir çekince vardır: sunulan varsayılana eşit bir değer, hiç değer girilmemiş olmasından ayırt edilemez; bu nedenle safety altında tam olarak standart değeriyle yazılmış bir eşik — örneğin satırlar için 80 — yine de 100 sayılır.

{
  "fuciniCoverage.threshold.profile": "safety",
  "fuciniCoverage.threshold.branch": 90
}
The settings panel: the threshold profile above the grid of thresholds, showing the standard figuresScreenshot pending — add assets/img/threshold-profile.png (see SCREENSHOTS.md).
Switching the threshold profile to safety in the settings panel: the live preview asks for 100% everywhere; back on standard it asks for 80, 70, 80 and 75 and marks the rest as not gatedScreenshot pending — add assets/img/threshold-profiles.gif (see SCREENSHOTS.md).

Eski varsayılanlara güveniyorduysanız, 0.2026.82 sürümüne güncelledikten sonra safety seçeneğini belirleyene kadar daha hoşgörülü değerlendirilirsiniz. Daha önce çalışmış bir kurulum bunu bir kez bildirir; bildirimdeki Keep 100% (safety) düğmesi profili kullanıcı ayarlarınıza yazar. Paylaşılan bir projede herkesin aynı şekilde değerlendirilmesi için profili çalışma alanı ayarlarına da ekleyin. Configure Coverage Compliance & Thresholds... komutunda profil, eşik ızgarasının üstünde yer alır ve canlı önizleme gerçekten yürürlükte olan kapılarla değerlendirir. Her kartta ve raporda, kapısı kapalı olan bir ölçüt değerini onay işareti veya çarpı yerine nötr bir çizgiyle gösterir.

The status-bar card under the standard profile: two of four gates below threshold, and a neutral mark on the metrics that are not gatedScreenshot pending — add assets/img/statusbar-metrics.png (see SCREENSHOTS.md).

11a. Nesne kodu kapsamı

Buradaki diğer her ölçüt kaynaktan ölçülür: bir araç kodunuzu enstrümante eder, enstrümante derleme çalışır ve sayaçlar hangi deyimlerin, dalların ya da koşulların işletildiğini söyler. Nesne kodu kapsamı başka bir şeyi ölçer — derlenmiş ikili dosyanın ne kadarının gerçekten çalıştığını, komut baytı cinsinden, kaynağı enstrümante ederek değil komut akışını izleyerek. Bu önemlidir, çünkü derleyici kaynağınızın hiçbir satırının karşılığı olmayan kod üretir: dizi sınır denetimleri, switch atlama tabloları, yazmaç boşaltmaları, yığın sondaları, ilgili komuttan yoksun çekirdeklerde bölme ya da kayan nokta için çalışma zamanı yardımcı rutinlerine çağrılar. Ayrıca bu assembly'yi kapsıyor mu? sorusunu yanıtlayan buradaki tek ölçüttür — elle yazılmış assembly hiçbir zaman enstrümante edilmez ve kaynak tabanlı bir araç ona erişemez. DO-178C nedenini açıkça söyler: A seviyesinde, bir derleyici veya bağlayıcı kaynak deyimlerine doğrudan izlenemeyen kod ürettiğinde, 6.4.4.2b hedefi tam da bu üretilmiş kod için ek doğrulama ister.

Deyim kapsamını içerir — yürütülen her makine komutu bir deyimden gelmiştir, dolayısıyla %100 nesne kodu kapsamı %100 deyim kapsamı anlamına gelir. Tersi geçerli değildir ve bu asimetri ölçmenin bütün amacıdır. Bundan iki şey çıkar. Bileşik puanda hiçbir ağırlığı yoktur, çünkü aynı yürütmelerin iki ölçüsünü ortalamak aynı kanıtı iki kez saymaktır; bunun yerine fuciniCoverage.threshold.objectCode ile kapı denetimine tabidir — ağırlık değil gereklilik, standardın istediği biçimde. Ve teslim edilen şey farkın kendisidir: %100 satır kapsamı ile %100'ün altında nesne kodu kapsamına sahip bir çalıştırma, kaynağınızın karşılığını vermediği derleyici üretimi kodu tam olarak bulmuştur; bu yüzden uygunluk kartı bunu «%94» diye gömmek yerine 312 bayt hiç çalışmadı, %100 satır kapsamıyla der. Tersi — kaynağı çalışmamışken bütün ikili dosyanın çalışmış görünmesi — düşük bir puan değil bir çelişkidir: neredeyse her zaman birleştirmenin bir tarafındaki eski bir iz dosyası ya da dosya yollarıyla hiç eşleşmemiş modül adları. Bu bir bulgu olarak raporlanır.

Nesne kodu kapsamı, ikili dosyanın komutlarının gözlenebildiği bir yerde çalışmasını gerektirir. Üç yol vardır ve maliyetleri birbirinden çok farklıdır. Nesne kodu kapsamını yalnızca üçüncüsü üretir; ilk ikisi, çoğu zaman asıl çözülmeye değer olan komşu bir sorunu çözdükleri için burada.

  1. Hedef üzerinde çalışan, enstrümante bir derleme. GCC çapraz derleyicileri -fprofile-arcs -ftest-coverage kabul eder, dolayısıyla iş istasyonunda işleyen enstrümantasyon hedefte de işler — şu farkla ki çıplak donanım sisteminde .gcda sayaçlarını yazacak bir dosya sistemi, çoğu zaman da onları yazacağı bir exit() yoktur. Sayaçlar zaten RAM'dedir; çözüm o belleği dökmek ve dosyaları hedef dışında yeniden kurmaktır. NASA JPL'in embedded-gcov projesi (Apache-2.0) tam olarak bunu yapar: dosya sistemi, işletim sistemi ya da standart C kütüphanesi olmadan. Bu size kendi çapraz derleyicinizle, kendi komut kümeniz için, kendi donanımınızda üretilmiş bir derlemenin deyim, dal ve işlev kapsamını verir — nesne kodu kapsamını değil; üstelik ölçülen ikili dosya enstrümantedir, yani gönderdiğinizden daha büyük ve daha yavaştır. Sonucu LCOV, gcovr JSON, gcov JSON olarak ya da GCC 9'dan eski bir araç zincirinde düz metin .gcov listesi olarak yükleyin.
  2. Komut kümesi simülatörü. Gerçek hedef ikili dosyayı bir simülatörde çalıştırın ve kapsamı yürütülen adreslerden türetin: donanım yok, enstrümantasyon yok, prob yok — ve komutları gözlediği için gerçek nesne kodu kapsamı üretebilir. Sınır, gerçeğe uygunluktur: bir simülatör çekirdeği iyi, çevre birimlerini daha az iyi modeller; bu yüzden silikonunuzu yakından modellemiyorsa sistem geneli sonuçlara kuşkuyla yaklaşın.
  3. Yonga üstü iz ve bir hata ayıklayıcı. Sertifikasyon düzeyindeki yol ve gerçekten müdahalesiz olan tek yol: çekirdeğin iz birimi komut akışını bir hata ayıklayıcıya bildirir, o da bunu kapsama dönüştürür. Hiçbir şey enstrümante edilmez, kod boyutu değişmez ve zamanlama etkilenmez — sonucu gerçekten gönderdiğiniz ikili dosyaya dair kanıt yapan da budur. Bütçelemeden önce silikonu denetleyin: birçok mikrodenetleyici ailesinde tam iz yalnızca büyük bir iz tamponu ve yüksek hızlı iz portu bulunan bir emülasyon ya da geliştirme türevinde vardır; üretim parçaları ise indirgenmiş bir iz birimi sunar ve üreticinin bunlar için önerdiği çare, kodu enstrümante edip işlemci zamanı harcayan bir yazılım izidir — yani bu yolun seçilme nedeni olan özelliği ortadan kaldırır.

Birçok gömülü proje, aynı kaynakları geliştirme makinesi için derleyip birim testleri orada çalıştırarak kapsamı ölçer. Bu hızlıdır, donanım gerektirmez ve çoğu ekip için doğru varsayılan seçenektir — ama bu kanıtın gerçekte neyi tanımladığı konusunda net olmakta fayda var: gönderdiğinizden farklı bir derleyici, farklı bir optimize edici, farklı bir komut kümesi ve farklı bir ikili dosya. Yazılımların çoğu için bu kabul edilebilir ve iyi anlaşılmış bir ödünleşimdir. IEC 61508, ISO 26262 veya DO-178C'ye göre değerlendirilen işler için bu, standart “ana makine mi hedef mi” itirazıdır ve yukarıdaki yollar buna standart yanıtlardır — ilki kaynak kapsamı için bunu kapatır, üçüncüsü nesne kodu için.

Bugün nesne kodu için okunan dışa aktarım, Lauterbach TRACE32'nin metric="object" ile COVerage.EXPORT.ListModule'üdür; onu diğer her iz dosyası gibi yükleyin. Bu ölçüt yalnızca ücretli lisansla ve değerlendirme dönemi boyunca puanlanır ve kapı denetimine tabi tutulur. Community kurulumu onu puanlamaz — ama bir iz dosyası onu içerdiğinde bilgilendirilir, çünkü dosyadaki en güçlü kanıtı sessizce atlayan bir uygunluk kararı, neyi atladığını söyleyen bir karardan daha kötü olurdu.

12. Kod olmayan satırları hariç tutma

excludeComments açıkken (varsayılan), tamamen yalnızca yorum içeren veya boş satırlara düşen ifadeler toplamlardan hariç tutulur — bu ayrıca rastgele bir isabet sayısının bir yoruma düştüğü bilinen bir llvm-cov/gcov tuhaflığını da etkisiz hale getirir. Standart işaretçilere de uyulur:

x = risky();          // LCOV_EXCL_LINE
// LCOV_EXCL_START
debug_only_block();
// LCOV_EXCL_STOP

C, C++, Objective-C, CUDA ve C# içinde önişlemci yönergeleri de kod sayılmaz: # ile başlayan bir satır — #define, #include, #if — ve sondaki bir ters eğik çizginin onu devam ettirdiği satırlar. gcov bir makronun her kullanımını tanımlandığı satıra yazar; bu yüzden raporlanan tek satırı #define CHANNEL_COUNT (33U) olan bir başlık, .c dosyasındaki bir döngü ona kadar çalıştığı için %100 kapsanmış görünüyordu, sabitini hiçbir şeyin kullanmadığı bir başlık ise %0. Böyle bir başlığın artık ölçülecek bir şeyi yok ve listelenmiyor.

Hariç tutulan satırları yine de saymak için excluded.includeInTotals'ı true olarak ayarlayın.

Bir dosyayı ya da klasörü dışarıda bırakmak, ağaçtan

Coverage görünümünde bir dosyaya ya da klasöre sağ tıklayıp Exclude from Coverage seçin — satırın yol eylemleri arasında da vardır — ya da açık dosyada Exclude This File from Coverage çalıştırın: dosyanın çalışma alanına göreli yolu ya da klasörün /** deseni, klasörün ayarlarındaki fuciniCoverage.ignore içine bir kez girer ve yeniden yükleme onu her toplamdan ve her sayfadan çıkarır; desen oradadır ki yeniden çıkarılabilsin. Visual Studio'da satır menüsü ve Tools → Coverage Studio aynı iki komuta sahiptir; aynı ayarı aynı dosyaya yazarlar.

Right-click a folder row in the Coverage view, Exclude from Coverage, and the tree redraws without it while the pattern appears in settings.jsonScreenshot pending — add assets/img/exclude-from-tree.gif (see SCREENSHOTS.md).
Bir klasörde Exclude from Coverage: ağaç onsuz, desen ayarlarda.
Visual Studio: Exclude This File from Coverage on fees.ts, the tree without fees.ts, then .vscode/settings.json with the pattern src/fees.ts under fuciniCoverage.ignore
Visual Studio'da: fees.ts üzerinde Exclude This File from Coverage — onsuz ağaç, .vscode/settings.json içindeki desen.

.NET için öznitelikler ve ad alanları

İki ayar, raporun söyleyemediğini kaynaktan okur. ignore.attributes — varsayılan olarak ExcludeFromCodeCoverage — adlandırdığı bir özniteliğin altındaki sınıfı, yöntemi ya da özelliği, raporu hangi araç yazmış olursa olsun, LCOV_EXCL_START/STOP nasıl yapardıysa öyle hariç tutar: Coverlet özniteliğe uyar, OpenCover, dotCover ve dönüştürülmüş bir lcov uymaz; artık hepsi hemfikir. Adlar Attribute sonekiyle ya da onsuz, ad alanıyla ya da onsuz; GeneratedCode, Obsolete ya da kendinizinkini ekleyin. ignore.namespaces, ad alanı bildirimi bir önekle eşleşen her dosyayı dışarıda bırakır, joker olarak * — Acme.Generated, Acme.*.Migrations, *Tests — ve Output bölmesi aldığı dosyaları adlandırır. İkisi de yorum işaretçilerini okuyan geçişte okunur, her iki sürümde de.

{
  "fuciniCoverage.ignore.attributes": ["ExcludeFromCodeCoverage", "GeneratedCode"],
  "fuciniCoverage.ignore.namespaces": ["Acme.Generated", "*.Migrations"]
}

Düzenleyiciden hariç tutma

Satırları seçin ve Exclude Selection from Coverage komutunu ampulden, düzenleyicinin bağlam menüsünden ya da Command Palette'ten alın — Visual Studio'da ampulden (Ctrl+.), kod penceresinin sağ tık menüsünden, Tools → Coverage Studio ya da Ctrl+Shift+U, X ile — ve hariç tutma kodun olduğu yere yazılır: bir C#, VB ya da F# sınıfının, yönteminin ya da özelliğinin üstüne, dosya System.Diagnostics.CodeAnalysis'i zaten içe aktarıyorsa kısa adıyla, aktarmıyorsa tam nitelenmiş olarak, hiçbir using eklenmesi gerekmesin diye [ExcludeFromCodeCoverage]; tek bir kod satırının sonuna LCOV_EXCL_LINE; birkaç satırın çevresine, ilk satırın girintisinde LCOV_EXCL_START ve LCOV_EXCL_STOP — dilin kendi yorum işaretiyle, //, #, ', -- ya da ;. Tek bir geri alma adımı. Ampul bunu Problems kayıtlarının kapsanmamış olarak işaretlediği bir satırda da sunar. Zaten işaretlenmiş bir satır ya da zaten öznitelik taşıyan bir üye olduğu gibi bırakılır.

A selection in a C# method, the light bulb, Exclude from coverage, and the LCOV_EXCL_START and STOP lines appearing around itScreenshot pending — add assets/img/exclude-selection.gif (see SCREENSHOTS.md).
Exclude Selection from Coverage: seçimin çevresine, dosyanın kendi yorum işaretiyle yazılan işaretçiler.
Visual Studio: four lines of an else-if branch in Quote.cs selected, Exclude Selection from Coverage writing LCOV_EXCL_START and LCOV_EXCL_STOP around them, then ExcludeFromCodeCoverage above a method
Visual Studio'da: Exclude Selection from Coverage — bir dalın çevresinde LCOV_EXCL işaretleri, ardından bir metodun üstünde [ExcludeFromCodeCoverage].

Yalnızca dallar ve gcovr'ın işaretçileri

Savunma amaçlı bir else, hiçbir değerin ulaşmadığı bir default:, derleyicinin bir istisna için eklediği kol: satır çalışır ve sayılmalıdır, yalnızca dalı alınamaz. LCOV_EXCL_BR_LINE ve LCOV_EXCL_BR_START … LCOV_EXCL_BR_STOP, bulundukları satırlardaki dalları sayımdan çıkarır, satırları ise sayımda bırakır. LCOV_EXCL_EXCEPTION_BR_LINE ve onun bölge biçimi daha da azını çıkarır — yalnızca bir istisnayla girilen kolları, raporun bunların hangileri olduğunu söylediği yerde; gcov'un JSON'u bunu söyler. Her işaretçi gcovr'ın önekleriyle de okunur: GCOVR_EXCL_LINE, GCOVR_EXCL_START, GCOVR_EXCL_BR_LINE, GCOV_EXCL_STOP ve diğerleri, LCOV_EXCL_ ile başlayanlarla aynı anlama gelir; böylece gcovr için yazılmış bir kaynak, raporu hangi araç üretmiş olursa olsun burada aynı biçimde okunur. Okunmayan: GCOVR_EXCL_FUNCTION — o satırdaki hiçbir şey işlevin nerede bittiğini söylemez.

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
LCOV_EXCL_BR_LINE on a line: the line still counted, its branch gone from the countScreenshot pending — add assets/img/branch-markers.png (see SCREENSHOTS.md).

Nedenini söylemek: gerekçeli hariç tutmalar

Kodu sayımdan çıkarmak bir iddiadır — "bu test edilemez", "bu, geliştirici için bir yardımcı araçtır" — ve DO-178C, ISO 26262 ya da IEC 61508 uyarınca, bir sertifikanın dayandığı sayıyı değiştiren bir iddia yazıya dökülmüş ve incelenebilir olmalıdır. Bu yüzden bir hariç tutma, nedenini yazıldığı yerde söyleyebilir: LCOV_EXCL_LINE ya da LCOV_EXCL_START sonrasındaki metin ya da [ExcludeFromCodeCoverage] özniteliğinin Justification değeri.

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) { /* … */ }

Nedenler her yüklemede okunur ve günlük onları sayar. Export Coverage Report… listeyi yazar — dışlamalar ve gerekçeleri, Markdown ya da CSV olarak: dosya, satırlar, nasıl yazıldığı ve gerekçe ya da none given. Ölçülebilir hiçbir şeyi kalmamış bir dosya da bu listede yer alır. exclusions.requireReason açıkken neden belirtmeyen bir hariç tutma bir bulgudur: Problems içinde kendi satırında bir uyarı ve Check Coverage Thresholds için bir başarısızlık. O zaman Exclude Selection from Coverage önce nedeni sorar ve onu işaretçiyle birlikte ya da özniteliğin Justification değeri olarak yazar; soru kapatılır ya da boş bırakılırsa hiçbir şey hariç tutulmaz.

An exclusion without a reason flagged as a warning at its line, and the exported list with none givenScreenshot pending — add assets/img/justified-exclusions.png (see SCREENSHOTS.md).
Visual Studio: an exclusion without a reason as a warning at its line, and the exported list with none givenScreenshot pending — add assets/img/vs-justified-exclusions.png (see SCREENSHOTS.md).
Visual Studio'da: gerekçesiz bir hariç tutma, satırında bir uyarı olarak; dışa aktarılan listede ise none given.

12a. Bu kapsam hâlâ bu dosyayı mı anlatıyor?

Bir izleme dosyasından okunan kapsam, kaynağı testlerin çalıştığı andaki hâliyle anlatır ve çoğu biçim bunun hangi sürüm olduğunu söylemez. Bu yüzden Kapsam panelindeki her dosya üç durumdan birindedir:

  • ✓ Doğrulandı — izleme dosyası ölçülen her satırın içeriğini kaydeder ve bu hâlâ dosyayla eşleşiyor.
  • İşaret yok — çürütülmedi. Kapsamı yalanlayan da doğrulayan da bir şey yok. Olağan durum budur.
  • ⚠ Çürütüldü — dosyanın kendisi kapsamını çürütüyor. Satır soluklaştırılır ve ipucu neyin bulunduğunu söyler.

Onay işaretini yalnızca iki biçim hak edebilir, çünkü ölçtüğü kaynak hakkında bir şey kaydeden yalnızca iki biçim var: --checksum ile yazılmış lcov (geninfo içinde öntanımlı olarak kapalı; belgelenmiş amacı tam da bir dosyanın iki sürümüne ait kapsamın birleştirilmesini önlemek) ve ölçtüğü her satırın metnini gömen GNATcoverage XML. lcov seçeneğini açmaya değer.

Uyarının ikisine de ihtiyacı yoktur ve her biçimle çalışır: dosya sonunun ötesine kaydedilmiş kapsam, raporun koyduğu yerde artık olmayan adlandırılmış bir işlev ya da dosyada boş olan yürütülmüş satırlar. Zaman damgaları tek başına asla yetmez — bir git checkout tek bir bayt değiştirmeden hepsini değiştirir — bu yüzden değişmiş bir zaman damgası en fazla yeniden bakmak için bir nedendir. Denetim, kapsam yüklenirken ve bir dosya her kaydedildiğinde ya da diskte değiştiğinde yeniden çalışır; böylece işaret dosyayı izler: çalıştırmayla çelişen bir düzenleme işareti koyar, ölçülen sürümü geri getiren bir checkout kaldırır. İpucu bunu neyin kanıtladığını tam olarak söyler. Hepsini kapatmak için staleWarning.enabled ayarını false yapın.

12b. Ölçülmemiş ile kapsanmayan

Çalıştırmanın hiç anmadığı bir dosya ölçülmemiştir: hiçbir test onu yüklememiştir, dolayısıyla hiçbir araç onun için bir satır yazmamıştır. Bu, kapsanmayan — ölçülmüş, sıfır isabetli — ile aynı şey değildir ve uzantı var olmayan bir dosyayı hiçbir zaman %0 olarak puanlamamıştır. 0.2026.69’a kadar yapmadığı şey, var olmayanları hiç göstermemekti: hiç testi olmayan bir modül ağaçta, toplamlarda ya da eşik denetiminde hiç görünmüyordu ve okuyan, dosyalarının yarısı hiç çalıştırılmamış bir proje için “%92” görüyordu.

Artık bir çalıştırma yüklüyken dosya başına durum çubuğu ögesi, çalıştırmanın kendi türünden olup çalıştırmada bulunmayan bir kaynak dosya için ölçülmedi der — “çalıştırmanın türünden” demek, çalıştırmanın ölçtüğü dosya uzantılarından birine sahip olması demektir; böylece bir C projesinin başlıkları ve kaynakları adaydır, Python betikleri değildir. Bunun ötesindeki her şey fuciniCoverage.unmeasured.mode üzerinden isteğe bağlıdır:

  • off (varsayılan) — başka hiçbir şey değişmez.
  • list — Kapsam görünümü en altta böyle her dosyayı adlandıran bir Ölçülmemiş grubu alır, her satır dosyayı açar; yükleme sonucu onları sayar; rozetler onları Explorer’da ? ile işaretler; ve fuciniCoverage.threshold.unmeasuredFiles, belirlediğiniz bir sayıdan fazla olduklarında Check Coverage Thresholds’u başarısız kılabilir. Hiçbir yüzde kıpırdamaz.
  • count — list’in yaptığı her şey; ayrıca ölçülmemiş her dosya kendi kod satırları kadar kapsanmayan bir dosya olarak çalıştırmanın aleyhine de sayılır; böylece durum çubuğu, eşikler, rozetler, geçmiş, her dışa aktarım ve Test Coverage görünümü daha düşük sayıyı gösterir. Dosya göründüğü her yerde ölçülmemiş olarak çizilir, kenar boşluğu çubukları “hiç çalışmadı” yerine “ölçülmedi” der ve uyuşmazlık denetimi ona dokunmaz — içeriğinin çelişebileceği bir ölçüm yoktur.
{
  "fuciniCoverage.unmeasured.mode": "list",
  "fuciniCoverage.threshold.unmeasuredFiles": 0
}

Başlık dosyaları C’de bilinen yanlış pozitiftir: çalıştırmanın uzantı ailesindedirler ve hiçbir iz dosyası birini adlandırmaz, çünkü tek başına hiçbir şeye derlenmez. Bu yüzden fuciniCoverage.unmeasured.exclude, fuciniCoverage.ignore ile aynı glob söz dizimiyle, varsayılan olarak **/*.h, **/*.hpp, **/*.hh, **/*.inl ve **/*.d.ts’yi dışarıda bırakır; burada derlenmeyen bir platform portunu ya da üretilmiş taslakları ekleyin, listeden, sayımdan ve durum çubuğu durumundan düşerler. ignore’un adlandırdığı bir dosya da hiçbir zaman ölçülmemiş sayılmaz — onu dışarıda bırakmak zaten amaçtı. threshold.unmeasuredFiles varsayılan olarak -1’dir, bu denetlemez; 0, çalıştırmanın türünden herhangi bir dosya hiçbir test tarafından yüklenmediği anda başarısız olur ve yalnızca unmeasured.mode list ya da count iken geçerlidir.

13. HTML raporları

  • Generate Full HTML Report — dizin başına, kendiliğinden oluşturulan, çok sayfalı bir rapor. Çıktı, ayarlanmamışsa htmlReport.outputDir'a veya uzantının genel depolamasına gider.
  • Open Annotated Source — tek bir dosya için açıklamalı bir görünüm. Yerleşik oluşturucu yerine bu sayfaları kullanmak için externalHtmlReport.dir'ı önceden oluşturulmuş bir llvm-cov show --format=html dizinine yönlendirin.
  • Export Fucini JSON — kendi araçlarınız için tam normalleştirilmiş model.
  • Export Coverage Report... — çalıştırma; CSV (dosya ya da işlev başına), Markdown özeti, LCOV izleme dosyası, Cobertura XML, SARIF ya da README'niz için kendi kendine yeten bir SVG rozeti olarak. Covered Files görünümünde Generate Full HTML Report yanındaki düğmeden de erişilir. CSV'ler dışında her şey kayıplıdır — MC/DC, bölgeler ve örneklemelerin LCOV, Cobertura ya da SARIF'te yeri yoktur — bu yüzden her ölçütü taşıyan biçimler Fucini JSON ve CSV'ler olarak kalır.
  • Copy Uncovered Lines — bir PR'a yapıştırmaya hazır, her boşluğun Markdown özeti.

Visual Studio'da. Tools → Coverage Studio altındaki Reports grubu: Show Annotated Source etkin belgeyi belge alanında bir sayfa olarak açar — her satır kendi renginde, bulgular yanında — ve düzenleyiciyle her iki yönde birlikte kayar; Open HTML Report tek sayfalık raporu htmlReport.outputDir içine (ya da %LOCALAPPDATA%\Fucini\CoverageStudio\html-report içine) yazar ve tarayıcıyı açar; Generate Full HTML Report oraya klasör başına dizini ve dosya başına sayfayı yazar; Export Coverage Report… aynı sekiz biçimi sunar ve nereye kaydedileceğini sorar; Generate Coverage Badge rozeti badge.outputPath'in söylediği yere yazar, badge.autoUpdate ile her yüklemeden sonra. Açıklamalı sayfanın, Coverage penceresi gibi, WebView2'ye ihtiyacı vardır; diskteki raporların yoktur.

Visual Studio: Show Annotated Source — the file as a page in the document well, beside the editorScreenshot pending — add assets/img/vs-annotated-source.png (see SCREENSHOTS.md).
Visual Studio'da: Show Annotated Source — dosya, düzenleyicinin yanında belge alanında bir sayfa olarak.
Multi-page HTML report directory indexScreenshot pending — add assets/img/report.png (see SCREENSHOTS.md).
The report, Directory Coverage Summary: one row per folder, a column for every metric the run carriesScreenshot pending — add assets/img/report-directory-summary.png (see SCREENSHOTS.md).
The report, File Coverage Summary: one row per file, with Max CRAP where the report carries complexityScreenshot pending — add assets/img/report-file-summary.png (see SCREENSHOTS.md).
The report, Coverage Gaps: every function with uncovered branches or MC/DC conditions, named as writtenScreenshot pending — add assets/img/report-coverage-gaps.png (see SCREENSHOTS.md).
The report, MC/DC Expression Detail: conditions covered per decisionScreenshot pending — add assets/img/report-mcdc-detail.png (see SCREENSHOTS.md).
Export Coverage Report: CSV per file or per function, a Markdown summary, LCOV, Cobertura XML, SARIF, or an SVG badgeScreenshot pending — add assets/img/export-picker.png (see SCREENSHOTS.md).
The report’s annotated page for src/calc.c: per-line hit counts, a fully covered function, an uncovered else branch, a 1/2 partial branch, an MC/DC expansion and a never-called functionScreenshot pending — add assets/img/annotated-source.png (see SCREENSHOTS.md).

Açıklamalı kaynak koda karşı düz kaynak kod

Open Annotated Source, etkin sekmeyi o dosya için aynı sütunda renk kodlu bir kapsam web görünümüyle değiştirir; Open Annotated Source to the Side aynısını böler biçimde yapar, böylece kaynak ve açıklamalı görünüm yan yana durur. Bunun yerine yerinde ileri geri geçiş yapmak için — bölmenin her paneli çok dar bıraktığı küçük ekranlarda kullanışlıdır — Toggle Annotated Source'u kullanın: etkin sekmeyi ikisi arasında değiştirir ve o an hangisine baktığınızı hatırlar. Açıklamalı görünümün içinden Show Source doğrudan o dosyanın normal düzenleyicisine geri döner.

Gerçekte hangi HTML'i göreceğiniz externalHtmlReport.dir'a bağlıdır: ayarlandığında ve orada etkin dosyayla eşleşen bir sayfa zaten mevcut olduğunda (llvm-cov, dosya başına sayfaları <repo-adı>/<göreli-yol>.html şeklinde düzenler, böylece raporun kendi repo-adı klasörünün hiçbir zaman yapılandırılması gerekmez), yerleşik oluşturucu yerine araç zinciri tarafından üretilen bu sayfa gösterilir — yerel bağlantıları/stil sayfası web görünümü içinde çalışacak şekilde yeniden yazılır ve yerleşik görünümün yeniden oluşturamadığı ayrıntıları içerir (MC/DC genişletme görünümleri, bölge vurgulama, dizin özetleri). O dosya için eşleşen sayfa yok mu, ya da ayar boş mu bırakıldı? O zaman yerleşik oluşturucu kullanılır. Uzantı bu dizini yalnızca okur — asla içine yazmaz.

README için bir kapsam rozeti

Generate Coverage Badge, etkin çalıştırma için shields tarzı bir SVG’yi çalışma alanına yazar — badge.outputPath, varsayılan coverage-badge.svg, çalışma alanı klasörüne göreli ya da mutlak, diğer her yol ayarıyla aynı değişkenlerle — ve açmayı önerir. Deponuzdaki düz bir dosyadır; bu yüzden bir README onu arkasında hiçbir hizmet, hiçbir shields.io gidiş dönüşü olmadan gömer ve hava boşluklu bir depoda da çalışır:

![coverage](coverage-badge.svg)

coverage: 83%

badge.metric rozetin ne göstereceğini seçer: lines (coverage etiketli), branches, mcdc ya da weighted — durum çubuğunun gösterdiği bileşik puanın aynısı, score etiketli. Seçilen ölçüt için verisi olmayan bir çalıştırma kırmızı bir %0 yerine gri bir n/a alır. Renk kendi colorScale.* katmanlarınızı izler: lowThreshold’un altında lowColor, highThreshold’a kadar midColor, oradan itibaren highColor. badge.autoUpdate açıkken rozet her başarılı yüklemeden sonra sessizce yeniden yazılır ve çıktı kanalı her yazımı [FUCINI_BADGE] olarak kaydeder — her yüklemede çalışma alanına yazdığı için varsayılan olarak kapalıdır. SVG’yi kodla birlikte işleyin; depo sayfasındaki resim düzenleyicideki sayıyı izler.

{
  "fuciniCoverage.badge.outputPath": "docs/coverage-badge.svg",
  "fuciniCoverage.badge.metric": "weighted",
  "fuciniCoverage.badge.autoUpdate": true
}

14. Geçmiş ve eğilimler

Çalıştırmaları yerel olarak kalıcı hale getirmek için history.enabled'ı etkinleştirin (history.retention kadarını saklayarak). Ardından durum çubuğunda bir eğilim oku (▲/▼), Coverage görünümünde eğilim grafiği ve iki karşılaştırma komutu elde edersiniz: Compare with Last Run ve Compare Two History Runs, her biri dosya başına bir gerileme/iyileştirme farkı üretir.

Visual Studio'da. Her yükleme bir öncekiyle karşılaştırılır: çalışmaya başlayan ya da çalışmayı bırakan her satırda kenar çubuğunda bir üçgen (sinceLastRun.enabled), durum çubuğunda puanın yanında eğilim ve sayıları değişen dosyalar için Compare with Last Run. history.enabled ile çalıştırmalar %LOCALAPPDATA%\Fucini\CoverageStudio\history altında, history.retention kadarı, saklanır; böylece karşılaştırma yeniden başlatmayı atlatır, eğilim grafiğinin çizecek bir şeyi olur ve Compare Two History Runs… bunlardan herhangi ikisini seçer.

Compare with Last Run: the run moved from 83.89% to 83.05%, calc.c lost 4.54 points, and the status bar carries the trendScreenshot pending — add assets/img/history-compare.png (see SCREENSHOTS.md).
Since last run: a red mark on the lines that ran in the previous run and not in this one, a green one on the lines that are newly coveredScreenshot pending — add assets/img/since-last-run.png (see SCREENSHOTS.md).

Eğilim grafiği

Coverage görünümünün araç çubuğunun altında, iki ya da daha çok kayıtlı çalıştırma varken, geçmişin satır kapsamı bir çizgi olarak, en eskiden en yeniye, en yeni otuz: çalıştırma başına, üzerine gelince tarihini ve rakamını söyleyen bir nokta ve yanında ilkinden bu yana yönü gösteren bir okla son rakam. Dikey ölçek çalıştırmaların kendi aralığıdır; böylece %92–94'teki bir takım 100'ün altında düz bir çizgi değil, hareketi görür. Her iki sürüm de bunu aynı geçmişten çizer.

The trend chart under the Coverage view's toolbar: a line over a dozen runs, a dot per run, the last figure and an arrow upScreenshot pending — add assets/img/trend-chart.png (see SCREENSHOTS.md).
Eğilim: kayıtlı çalıştırma başına bir nokta, yanında son rakam.
Visual Studio: the trend line under the Coverage window toolbar, the last figure 68.25%
Visual Studio'da: Coverage penceresinin araç çubuğunun altındaki eğilim, son değer 68.25%.

Kapsam oturumları

Tek bir test çalıştırması bir değişikliğin dokunduğu her şeyi nadiren kapsar: birim testleri burada, tümleştirme takımı şurada, kapsam açıkken arayüzde bir gezinti başka bir yerde çalışmıştır. Start Coverage Session sonraki yüklemeleri tek bir toplama dönüştürür — her çalıştırma bir öncekine satır satır birleşim olarak eklenir, herhangi birinin çalıştırdığı satır kapsanmış sayılır ve sayılar toplanır — böylece kenar boşluğu, ağaç ve puan hepsinin birlikte nereye ulaştığını gösterir. Ekrandaki çalıştırma, varsa, oturumun ilkidir. Ağacın üstündeki bir çubuk ne zamandan beri kaç çalıştırma olduğunu söyler ve oturumu bitirir; End Coverage Session aynısını yapar ve bir sonraki yükleme yeniden tek başına durur. Visual Studio'da Tools → Coverage Studio altındaki tek bir öğe oturumu başlatır ve işaretliyken bitirir.

A coverage session: the unit test run loads, the session starts, the integration run loads on top, and the bar says two runs while the tree's numbers riseScreenshot pending — add assets/img/coverage-session.gif (see SCREENSHOTS.md).
İki çalıştırmalık bir oturum: ikincisi birincisine eklenmiş, ağacın üstündeki çubuk onları sayıyor.
Visual Studio: the unit run loaded, Start Coverage Session, the integration run added, the bar saying 2 runs and lines at 68.25%, then the session ended
Visual Studio'da: Start Coverage Session ve birincisine eklenen ikinci çalıştırma — çubuk iki çalıştırma sayıyor, satırlar 50.79%'dan 68.25%'e çıkıyor.

CI temel çizgisi: main karşısında neredeyim?

Compare with Last Run son değişikliğinizin ne yaptığını yanıtlar; bir pull request öncesinde soru main karşısında nerede durduğunuzdur ve yanıt derleme sunucusundadır. baseline.report, main dalının derlemesinin yayımladığı raporu adlandırır ve her yükleme onun karşısına konur: durum çubuğundaki kart tek satırlık farkı taşır — vs CI baseline: 84.20% → 85.10% (+0.90%), 3 file(s) moved — ve Compare with CI Baseline değişen dosyaları, dosya dosya, Compare with Last Run ile aynı sözcüklerle listeler. Visual Studio'da komut Tools → Coverage Studio altındadır ve siz istediğinizde raporu alır ya da okur. .vscode/settings.json içinde onu adlandırmanın üç yolu:

  1. CI'ın sunduğu bir URL. GitLab bir dalın son iş yapıtlarını sabit bir adreste tutar; belirteç, remote.headers içindeki ${env:…} sayesinde ayar dosyasının dışında kalır. Jenkins: https://jenkins.example.com/job/app/job/main/lastSuccessfulBuild/artifact/coverage/lcov.info. TeamCity: Authorization: Bearer ${env:TC_TOKEN} ile https://tc.example.com/repository/download/App_Main/.lastSuccessful/coverage/lcov.info. URL, bir coverageFile.paths URL'siyle tıpatıp aynı biçimde alınır ve önbelleğe alınır (ETag, remote.refreshMinutes).
  2. İş hattının bir paylaşıma kopyaladığı bir dosya — \\build\drops\app\main\coverage.cobertura.xml gibi mutlak bir yol.
  3. İndirilmiş bir yapıt, klasörün altında tutulan, diyelim ci/main.lcov.info (klasörü .gitignore içine koyun) — klasöre göreli bir yol.
{
  "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}"]
}

Okuyucunun bildiği her biçim olur. CI'ın kendi checkout'una göre yazdığı bir yol — çalıştırıcıda Coverlet'in yazdığı gibi src/Billing/Invoice.cs — farktan önce bu klasörün altına yerleştirilir; böylece yerel çalıştırmanın çözümlediği dosyayla buluşur. Başka bir makineden gelen mutlak bir yol hiçbir şeyle eşleşmez; bu yüzden iş hattı göreli yollar yazsın. Alınamayan ya da okunamayan bir temel çizgi Output bölmesinde bir satırdır, asla başarısız bir yükleme değil.

Compare with CI Baseline: the status bar's card with the vs CI baseline line, then the command listing the files that moved against main, regressions firstScreenshot pending — add assets/img/ci-baseline.gif (see SCREENSHOTS.md).
CI temel çizgisi: karttaki fark ve main karşısında değişen dosyalar.
Visual Studio: baseline.report set to the unit suite report, then Compare with CI Baseline showing statements 50.79% to 68.25% and branches 30.43% to 50.00%, one file changed
Visual Studio'da: Compare with CI Baseline — birim testlerinin raporuna karşı deyimler ve dallar, ve değişen dosya.

Bir yapıt bir zip'tir ve o da okunur. GitHub ve GitLab bir yapıtı, içine ne konmuş olursa olsun, bir arşiv olarak verir. İçindeki raporu bir # işaretinden sonra adlandırın: arşivdeki dosya, yoluna ya da yolunun sonuna göre bulunur; # olmadan arşivin tek dosyası ya da rapora benzeyen tek dosyası alınır, bunlardan birkaç tane varsa Output bölmesi adlarını verir. Aynısı indirdiğiniz bir zip için (ci/artifact.zip#lcov.info) ve VS Code'da coverageFile.paths içindeki bir URL için de geçerlidir. Belirteç, ayarlandığı sunucuya gider, daha öteye gitmez: arşivi tutan depolama alanına yapılan yönlendirme belirteç olmadan izlenir.

{
  "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. Yapay zekâ ajanları için: ekrandaki kapsam

Test yazan bir ajan testleri çalıştırıp bir yüzde okuyabilir. Kendi başına yapamadığı şey, düzenleyicinin bildiğini sormaktır: bu işlevin hangi satırları hiç çalışmadı, hangi dalın hangi tarafı, bir satırı hangi testler çalıştırıyor, az önce yazdığı diff kapsanıyor mu? Altı araç tam olarak bunu yanıtlar; bir ajanın harekete geçebileceği sözcüklerle, yüklü olan çalıştırmadan — ekrandakiyle aynı hariç tutmalar, aynı yeniden eşleme, aynı sayılar. Böylece bir işlevin boşluklarını kapsaması istenen bir ajan ile kenar boşluğuna bakan bir gözden geçiren aynı satırlardan söz eder.

AraçNeyi yanıtlar
coverage_summaryÇalıştırmanın ölçüt başına toplamları ve tam kapsanmaya en uzak dosyalar. İlk sorulacak şey.
coverage_gapsBir dosyada, bir işlevde ya da bir satır aralığında hiç çalışmamış olanlar: kapsanmayan satırlar, alınmayan dal kolları, çifti eksik MC/DC koşulları, hayatta kalan mutantlar.
tests_for_lineRaporun bunu söylediği yerde — test başına bir çalıştırmada — bir satırı hangi testlerin çalıştırdığı.
patch_coverageBir diff'in kapsamı — çalışma ağacının bir referans karşısındaki farkı ya da verilen bir yama — ve diff'in hiç çalışmamış satırları.
coverage_deltaBir önceki çalıştırmadan beri değişenler: toplamlar ve kapsam kazanan ya da kaybeden dosyalar.
test_run_commandBu çalışma alanının testlerini kapsam açıkken çalıştıran komut. Ajan onu çalıştırır; düzenleyici raporu kendiliğinden yeniden yükler.

VS Code'un kendi ajanı bunları, hiçbir kurulum gerekmeden araç olarak kullanır. Geri kalan bütün ajanlar — MCP, yani Model Context Protocol konuşan her istemci — bunlara, mcp.enabled açıkken düzenleyicinin çalıştırdığı bir sunucu üzerinden erişir; VS Code'da da Visual Studio'da da. Copy MCP Server Configuration, istemcinin girdisini VS Code ve Visual Studio'nun bir mcp.json içinde okuduğu biçimde panoya koyar; dış anahtarı mcpServers diye adlandıran bir istemci aynı girdiyi o ad altında alır.

Copy MCP Server Configuration and its message, the token painted overScreenshot pending — add assets/img/mcp-config.png (see SCREENSHOTS.md).
Visual Studio: Copy MCP Server Configuration and its message; the token painted overScreenshot pending — add assets/img/vs-mcp-config.png (see SCREENSHOTS.md).
Visual Studio'da: Copy MCP Server Configuration ve iletisi; token'ın üzeri boyanmış.
{
  "servers": {
    "fucini-coverage": {
      "type": "http",
      "url": "http://127.0.0.1:39217/mcp",
      "headers": { "Authorization": "Bearer …" }
    }
  }
  }
  • Siz açmadıkça kapalıdır ve yalnızca 127.0.0.1 üzerinde dinler: bu makinenin dışından hiçbir şey ona erişemez.
  • Bir çağrı, bir kez üretilip sizin için saklanan belirtecinizi taşımak zorundadır; onsuz yanıt 401'dir. Kopyalanan yapılandırma belirteci içerir: onu depoya koymayın.
  • Bir web sayfasının gönderdiği çağrı — bunu Origin başlığında kendisi söyler — ne taşırsa taşısın reddedilir.
  • Yüklü olan çalıştırmayı okur ve hiçbir şey yazmaz. Test çalıştırması başlatılmaz, yalnızca komutu bildirilir: ajan komutu kendi terminalinde çalıştırır.

Bağlantı noktası mcp.port ayarıdır; ayarlanmadıysa 39217. Bu bağlantı noktası kullanımdaysa — ikinci bir pencere, bunun yanında açık olan diğer sürüm — sıradaki boş olan kullanılır ve kopyalanan yapılandırma çalışan bağlantı noktasını belirtir. Output bölmesi sunucunun nerede dinlediğini ([FUCINI_MCP]) ve neden dinleyemediğini ([FUCINI_MCP_001]) söyler. Bir planın içermediği şeyleri — testlerin adları, MC/DC ayrıntısı — araçlar, ipucunun yaptığı gibi, ayrıntısını vermeden sayar.

15. Komut referansı

Visual Studio'da. Her komut Tools → Coverage Studio altındadır ve tablodaki gibi, Fucini Coverage: öneki olmadan adlandırılmıştır; Coverage penceresinin araç çubuğu ve bir satırdaki sağ tık menüsü oraya ait olanları içerir, kod penceresinin sağ tık menüsünde ise düzenleyici üzerinde iş gören üçü vardır: Run This Test with Coverage, Show Tests That Ran This Line ve Exclude Selection from Coverage. Tuşları olanlar Ctrl+Shift+U sonrası iki vuruşlu akorlardır: R yeniden yükler, N ve P bir sonraki ve önceki kapsanmamış satıra, B bir sonraki kısmen test edilmiş karara gider, T satırı çalıştıran testleri listeler, X seçimi hariç tutar — VS Code'un Alt+N'si değil, çünkü Visual Studio'da Alt ve bir harf menü açar. Bunları Tools → Options → Keyboard altında, Coverage Studio: … olarak listelendikleri yerde değiştirin. Bu sürümde olmayanlar: Test Coverage paneli bir VS Code API'sidir — çalıştırma onun yerine Coverage penceresindedir — ve Solution Explorer rozet gösteremez. Yalnızca bu sürümde: bir C++ başlangıç projesi için Run Native Project with Coverage.

Visual Studio'da: her şey nerede. Coverage penceresi View → Other Windows → Coverage altındadır ve Tools → Coverage Studio altında ilk sıradadır; bu sürümün her komutu orada, gruplar hâlinde bulunur: yükleme ve yeniden yükleme, dosyayı izleme, iki kopyalama komutu ve kartlar; Run Tests with Coverage, Run Native Project with Coverage ve Collect Coverage in Test Explorer…; Next ve Previous Uncovered ile kısmen test edilmiş kararlar; boyama, çalıştırma sayaçları ve kenar çubuğu kipleri; bir dosyanın kapsam kaynağı, bir satırı çalıştıran testler, kapsamla tek bir test, hariç tutmanın iki yolu; Compare with Last Run, Compare Two History Runs…, Compare with CI Baseline, kapsam oturumu ve Check Coverage Thresholds; Reports grubu — Show Annotated Source, Open HTML Report, Generate Full HTML Report, Export Coverage Report… ve Generate Coverage Badge; ardından Getting Started, uyumluluk eşikleri ve Licence…. Pencerenin kendi araç çubuğunda en çok kullanılan beşi vardır: Load Coverage, Reload, Toggle Coverage Painting, Copy Coverage Summary ve uyumluluk eşikleri; altlarında perspektif, süzgeç ve sıralama ile arama kutusu; onların altında eğilim. İşaretçiyi ağacın bir satırında bekletin ve satır menüsü için ⋯ düğmesine basın — dosyayı aç, klasörünü aç, yolunu kopyala; mutlak ya da göreli, her iki eğik çizgi türüyle; kapsamdan hariç tut. Durum çubuğunun sağ ucunda çalıştırmanın puanı ile açık dosyanın puanı, son çalıştırmadan bu yana eğilimle birlikte bulunur; Show Coverage Card ve Show Coverage Card for This File bunların arkasındaki kartları açar — VS Code'un, işaretçi durum çubuğu öğesinde beklediğinde gösterdiği kartların aynısı.

Visual Studio: Tools → Coverage Studio, open, with every command of the edition
Visual Studio’da: Tools → Coverage Studio, bu sürümün her komutuyla.
Visual Studio: View → Other Windows, where the Coverage window is
Visual Studio’da: View → Other Windows, Coverage penceresinin bulunduğu yer.
Visual Studio: the Coverage window's toolbar — Load Coverage, Reload, Toggle Coverage Painting, Copy Coverage Summary, compliance thresholds
Visual Studio’da: Coverage penceresinin araç çubuğu — Load Coverage, Reload, Toggle Coverage Painting, Copy Coverage Summary ve uyumluluk eşikleri.
Visual Studio: a row's menu in the Coverage window — Open, Open Containing Folder, and the four Copy Path entries
Visual Studio’da: bir satırın ⋯ menüsü — dosyayı aç, klasörünü aç, yolunu dört biçimde kopyala.
Visual Studio: the status bar's two items, the run's score and the open file's
Visual Studio’da: durum çubuğunun iki öğesi, çalıştırmanın ve açık dosyanın puanı.
Visual Studio: the run's coverage card, opened by Show Coverage Card
Visual Studio’da: çalıştırmanın kapsam kartı, Show Coverage Card ile.
Visual Studio: the open file's coverage card, opened by Show Coverage Card for This File
Visual Studio’da: açık dosyanın kartı, Show Coverage Card for This File ile.
The status-bar hover cards for the run and the file, then the Coverage view toolbar: Pick Coverage File, Load Coverage, Export Coverage Report and Generate Full HTML Report, ending on the generated reportScreenshot pending — add assets/img/statusbar-and-toolbar.gif (see SCREENSHOTS.md).
VS Code’da: çalıştırma ve dosya için durum çubuğu kartları, ardından Coverage görünümünün araç çubuğu, sonunda üretilen rapor.
The status-bar menu: select a coverage file, run tests with coverage, reload, open the HTML report, choose the gutter modeScreenshot pending — add assets/img/statusbar-menu.png (see SCREENSHOTS.md).
VS Code’da: durum çubuğu menüsü — kapsam dosyası seç, testleri kapsamla çalıştır, yeniden yükle, raporu aç, oluk modunu seç.
Show Worst-Covered Functions: every function of the run, lowest coverage first, with its CRAP score where the report carries complexityScreenshot pending — add assets/img/worst-functions.png (see SCREENSHOTS.md).
VS Code’da: Show Worst-Covered Functions, en düşük kapsam önce, raporun karmaşıklık taşıdığı yerde CRAP puanıyla.
KomutNe işe yarar
Load CoverageÇalışma alanı için kapsamı bul ve yükle. Varsayılan olarak Alt+Shift+R (macOS'ta Ctrl+Alt+R).
Pick Coverage Fileİzleme dosyalarını seçin — bir, birkaç ya da her seferinde bir tane daha; seçimler birikir, birleştirilir ve coverageFile.paths içine yazılır, böylece bundan sonra kendiliğinden yüklenirler.
Show Loaded Coverage FilesEtkin çalıştırmadaki izleme dosyalarını listele. Kapsam görünümü de onları listeler; her birinin yanında bir kaldır düğmesi ve bir seç düğmesi vardır.
Toggle Tracefile Watchİzleme dosyalarındaki değişiklikleri izle ve otomatik yeniden yükle.
Run Tests with CoverageTest çalıştırıcısını tanı, bir terminal görevinde kapsamla çalıştır, yazdığını yükle ve yolu ayarlara eklemeyi öner.
Run This Test with Coverageİmlecin altındaki test — yöntem, sınıf ya da describe bloğu, ya da dosya — ona daraltılmış tarifle çalıştırılır, sonra her çalıştırma gibi yüklenir. Düzenleyicinin bağlam menüsünde de.
Show Tests That Ran This LineRaporun hangi testlerin neyi çalıştırdığını söylediği yerde, imlecin altındaki satırı çalıştıran testleri en yoğunu başta listele ve seçtiğinizi yazıldığı yerde aç.
Run Tests Affected by My Changes…Çalışma ağacının testImpact.baseRef karşısında değiştirdiği bir satırı çalıştıran testleri listele, seçtiğinizi aç ya da raporların test başına bir çalıştırmadan geldiği yerde yalnızca bunları çalıştır.
Show Minimal Test Set…Test takımının çalıştırdığı her satırı yine de çalıştıran en küçük test kümesi, ardından kendine ait hiçbir satır eklemeyen testler.
Run App with Coverage…Klasörün .NET uygulamasını dotnet-coverage altında başlat ve kapandığında içinden geçtiklerinizi yükle.
Run Mutation Tests Hereİmlecin içinde olduğu işlevi — ya da seçimi, ya da dosyayı — Stryker.NET, StrykerJS ya da PIT ile mutasyona uğrat ve raporu ekrandaki kapsamın yanına yükle.
Exclude This File from Coverage / Exclude from CoverageAçık dosyayı — ya da Coverage görünümünün bir satırında dosyayı veya klasörün /** desenini — klasörün ayarlarındaki fuciniCoverage.ignore içine koy, bir kez.
Exclude Selection from CoverageHariç tutmayı kodun olduğu yere yaz: bir .NET üyesinin üstüne [ExcludeFromCodeCoverage], tek satıra LCOV_EXCL_LINE, birkaç satırın çevresine LCOV_EXCL_START/STOP, dosyanın kendi yorum işaretiyle. Ampul ve düzenleyicinin bağlam menüsünde de.
Start Coverage Session / End Coverage SessionBir oturum açıkken her yükleme bir öncekine birleşim olarak eklenir; ağacın üstündeki bir çubuk çalıştırmaları sayar ve oturumu bitirir.
Next / Previous UncoveredKapsanmayan bölgeler arasında geç. Varsayılan olarak Alt+N / Alt+P (macOS'ta Ctrl+Alt+N / Ctrl+Alt+P).
Choose Editor Gutter Mode...Düzenleyicinin kenar boşluğunda kapalı, yalnızca kapsanmayan çubukları, kırmızı-kehribar-yeşil çubuklar ya da bir isabet sayısı ısı haritası.
Cycle Editor Gutter Modeoff, uncovered, coverage ve heatmap arasında bir adım ileri — Alt+G ya da durum çubuğundaki kip düğmesi.
Choose Coverage Source for This File...Açık dosyayı birden çok yüklü rapor ölçtüğünde, sayılarının hangisinden geleceğini dosya, klasörü ya da bir desen için seçin — bir coverageFile.sources kuralı yazar.
Clear Coverage Source for This File...Açık dosyaya uygulanan coverageFile.sources kurallarını kaldırır.
Toggle Inline Hit CountsHer satırın ardındaki ×N çalıştırma sayılarını göster ya da gizle — hitCounts.inline’ı açıp kapatır.
Show in Test Coverage ViewEtkin çalıştırmayı VS Code’un kendi Test Coverage paneline yayımla (testCoverage.publish kapalıyken bile) ve paneli aç.
Suggest Path Remap RuleEtkin çalıştırmanın eşleşmeyen dosyalarını çalışma alanıyla eşleştirecek pathRemap kuralını çıkar ve eklemeyi öner.
What Community IncludesÜcretsiz katmanın her sınırı ve tutulan her özelliği tek listede, her sınırın ne kadarının kullanıldığıyla birlikte.
Open HTML ReportOluşturulan statik raporu aç.
Generate Full HTML ReportÇok sayfalı raporu oluştur.
Open Annotated Source / …to the SideBir dosya için açıklamalı kapsam görünümü.
Toggle Annotated SourceKaynak ile açıklamalı görünüm arasında geçiş yap. Varsayılan olarak Alt+A (macOS'ta Ctrl+Alt+A).
Show Worst-Covered Files / Folders / FunctionsEn düşükten sıralanmış Quick Pick.
Copy Uncovered LinesKapsanmayan her aralığın Markdown özeti.
Compare Two History Runs / with Last RunDosya başına gerileme farkı — geçmişin sakladığı iki çalıştırma ya da ekrandaki çalıştırmanın yerini aldığı çalıştırmayla karşılaştırması.
Compare with CI BaselineYüklenen çalıştırmanın baseline.report'un adlandırdığı raporla — CI'daki main dalınınki, bir URL ya da indirilmiş bir yapıt — dosya dosya karşılaştırması.
Show Indirect Coverage Changes…Kimse düzenlemediği halde kapsamı değişen satırlar, CI temel çizgisine ya da bir önceki çalıştırmaya göre, dosya dosya.
Check Coverage ThresholdsUyumluluk denetimlerini değerlendir.
Export Fucini JSONGeçerli çalıştırmayı Fucini JSON olarak dışa aktar.
Export Coverage Report...Bir biçim — CSV, Markdown, LCOV, Cobertura XML, SARIF ya da bir SVG rozeti — ve bir hedef seçin.
Generate Coverage BadgeEtkin çalıştırmanın SVG rozetini, badge.metric’i göstererek badge.outputPath’e yaz ve açmayı öner.
Copy MCP Server ConfigurationBir MCP istemcisinin ekrandaki kapsam hakkında soru sormak için ihtiyaç duyduğu şeyi — sunucunun adresini ve belirtecinizi — panoya koy; sunucu kapalıysa açmayı öner.
Show Status Bar MenuHızlı eylem menüsünü aç.
Browse for External HTML Report / Full Report Output Dir…Rapor dizinlerini bir seçiciyle ayarla.

16. Ayarlar referansı

Her seçeneğin varsayılanıyla birlikte olduğu eksiksiz, kategorize edilmiş ayarlar tablosu Özellikler ve Ayarlar sayfasında bulunur. Tüm anahtarların önekinde fuciniCoverage. bulunur.

Belirtmekte fayda var: fuciniCoverage.language, VS Code'un Görüntüleme Dilinden bağımsız olarak bu eklentinin kendi çalışma zamanı arayüzünü (durum çubuğu, bildirimler, ipuçları, web görünümleri) belirli bir dile sabitler — varsayılan olarak auto'dur ve desteklenen 18 dilin tümü için paketlerle birlikte gelir. Komut Paletindeki girişleri veya VS Code'un kendi Görüntüleme Dilinden çözümlediği Ayarlar arayüzü etiketlerini değiştirmez.

Visual Studio'da. Aynı fuciniCoverage.* anahtarları, en fazla dört dosyadan okunur, sonraki kazanır: VS Code makinede varsa VS Code'un kendi kullanıcı ayarları — okunur, asla yazılmaz, böylece renkleriniz ve eşikleriniz sizinle gelir; %APPDATA%\Fucini\CoverageStudio\settings.json, bu sürümün kullanıcı ayarları; klasördeki ya da çözümün yanındaki .vscode\settings.json, dolayısıyla VS Code için ayarlanmış bir depo Visual Studio için de ayarlanmıştır; ve çözüm kökündeki fucini-coverage.json, bir .NET deposunda .vscode klasörü tutmak istemeyen bir ekip için — VS Code sürümü de onu okur. Coverage penceresinin araç çubuğundaki dişli, Write changes to seçicisinin söylediği gibi kullanıcı dosyasını ya da klasörün var olan dosyasını yazan ve düzenlediği dosyanın yorumlarını koruyan bir ayarlar penceresi açar. fuciniCoverage.language orada aynı şekilde çalışır; menüler Visual Studio'nun kendi dilini izler.

17. Hata kodları

Tanılamalar Fucini Coverage çıktı kanalına gider (View → Output → Fucini Coverage), her biri sabit bir FUCINI_* koduna sahiptir.

Visual Studio'da. Aynı kodlar Output penceresinin Fucini Coverage bölmesine (View → Output) gider ve IDE kapatıldıktan sonra gelen soru için %LOCALAPPDATA%\Fucini\CoverageStudio\coverage-studio.log dosyasında saklanır. Sık görülen üçü: bölme dosyaların yüklendiğini söylediği halde hiçbir şey işaretlenmemiş — oluk modu off, Show Coverage in Editor'ı seçin; FUCINI_REMAP_001 ve bir bilgi çubuğu — rapor burada var olmayan yolları adlandırıyor ve bölme pathRemap kuralını öneriyor; Coverage penceresi WebView2'ye ihtiyacı olduğunu söylüyor — Microsoft Edge WebView2 Runtime'ı kurun, düzenleyicideki işaretlerin ona ihtiyacı yoktur.

KodAnlamı
FUCINI_PARSE_001Desteklenmeyen/tanınmayan kapsam biçimi — dosyayla eşleşen bir ayrıştırıcı yok.
FUCINI_PARSE_010lcov dosyasında SF kaydı yoktu.
FUCINI_PARSE_020llvm-cov JSON geçersiz, data[] eksik ya da dosya içermiyordu.
FUCINI_PARSE_030Cobertura kökü <coverage> yok ya da XML geçersiz.
FUCINI_PARSE_040JaCoCo kökü <report> yok ya da kaynak dosya yok.
FUCINI_PARSE_050Istanbul/SimpleCov JSON geçersiz ya da dosya içermiyordu.
FUCINI_PARSE_060SimpleCov JSON geçersiz ya da üst düzey files dizisi yok.
FUCINI_PARSE_070mode: başlığı olmayan ya da kapsam bloğu içermeyen Go profili.
FUCINI_PARSE_080Clover kökü <coverage> ya da <project> yok veya içinde dosya yok.
FUCINI_PARSE_090OpenCover kökü <CoverageSession> yok veya içinde dosya yok.
FUCINI_PARSE_100coverage.py JSON'u geçersiz ya da üst düzey files nesnesi eksik.
FUCINI_PARSE_110gcov/gcovr JSON'u geçersiz ya da üst düzey files dizisi eksik.
FUCINI_PARSE_120<source> ögesi olmayan GNATcoverage XML’i ya da xi:include girdileri hiç çözülmemiş bir index.xml — bunun yerine kaynak başına *.xml dosyalarını yükleyin.
FUCINI_PARSE_130<BullseyeCoverage> kök ögesi yok ya da içinde <src> ögesi yok.
FUCINI_PARSE_140<CoverageDSPriv> kök ögesi yok, satırları çözümleyecek <SourceFileNames> tablosu yok ya da satır verisi yok.
FUCINI_PARSE_150Xcode kapsam JSON’u geçersiz veya üst düzey targets dizisi yok.
FUCINI_PARSE_160SonarQube <coverage> kök ögesi yok ya da içinde <file> ögesi yok.
FUCINI_PARSE_170Coveralls JSON’u geçersiz veya üst düzey source_files dizisi yok.
FUCINI_LOADBir yükleme ilerleme bildiriminden iptal edildi; varsa önceki çalıştırma yüklü kalır.
FUCINI_REMOTE_001Bir coverageFile.paths URL’si indirilemedi, nedeniyle; bunun yerine son indirilen kopya yüklenir. Düz [FUCINI_REMOTE] satırları her indirmeyi ve her değişmemiş (304) denetimini kaydeder.
FUCINI_REMOTE_002Bir coverageFile.paths URL’si 30 saniye içinde tam bir yanıt vermedi — çoğunlukla bağlantıyı kabul edip sonra susan bir proxy veya VPN; bunun yerine son indirilen kopya yüklenir.
FUCINI_REMOTE_003Bir coverageFile.paths URL’si tracefile yerine bir HTML sayfasıyla yanıt verdi — büyük olasılıkla bir oturum açma sayfası. Sayfa önbelleğe alınmaz, bunun yerine son indirilen kopya yüklenir; remote.headers içindeki belirteci denetleyin.
FUCINI_REMAP_002Bir yüklemenin eşleşmemiş bıraktığı yollar için bir pathRemap kuralı önerildi, kaçını açıkladığıyla — ya da hiçbiri çıkarılamadı, ya da çıkarılan kural zaten ayarda ve onları çözmedi.
FUCINI_REMAP_003Önerilen kural Apply Suggested Remap tarafından fuciniCoverage.pathRemap’e eklendi ve kapsam yeniden yükleniyor.
FUCINI_GITDIFF_001Git uzantısı kullanılamıyor; diff kapsamı atlanır ve çalıştırmanın tamamı gösterilir.
FUCINI_GITDIFF_002gitDiff.baseRef - ile başlıyor; hiçbir git referansı bununla başlayamaz (git bunu bir seçenek olarak okurdu); diff kapsamı atlanır ve çalıştırmanın tamamı gösterilir.
FUCINI_IGNOREfuciniCoverage.ignore’un çalıştırmanın dışında bıraktığı dosya sayısı ve hangileri olduğu.
FUCINI_UNMEASURED_001Çalıştırmanın türünden olup hiçbir testin yüklemediği dosyalar, her satırda bir tane.
FUCINI_UNMEASURED_002Çalıştırmanın uzantılarından biriyle 5.000’den fazla çalışma alanı dosyası eşleşti; Ölçülmemiş listesi için yalnızca ilk 5.000’i değerlendirildi.
FUCINI_UNMEASURED_003count kipinde bazı ölçülmemiş dosyalar listeleniyor ama sayılmıyor: okuma sınırına (yükleme başına 2.000 dosya ya da 50 MB) ulaşıldı.
FUCINI_UNMEASURED_004Ölçülmemiş bir dosya okunamadı; listeleniyor ama sayılmıyor.
FUCINI_TESTCOVERAGEVS Code’un Test Coverage görünümüne kaç dosyanın yayımlandığı.
FUCINI_BADGERozet yazıldı; yolu, etiketi ve değeriyle.
FUCINI_BADGE_001Rozet yazılamadı; nedeniyle.
FUCINI_WORKSPACEÇalışma alanına bir klasör eklendi ya da ondan çıkarıldı; kapsam yeniden keşfediliyor.
FUCINI_VARIABLESYol ayarlarındaki her ${command:…} ifadesinin ne yanıt verdiği ya da neden yazıldığı gibi bırakıldığı: komut başarısız oldu, kullanılabilir bir şey döndürmedi veya çalışma alanı güvenilir değil.
FUCINI_WATCHİzleyicinin ne yaptığı: izlenen yollar, beliren yapılandırılmış bir dosya, watch.reloadAfterTasks içinde adı geçen ve bitip (çıkış koduyla) bir yeniden yükleme tetikleyen bir görev ya da files.watcherExclude altında olduğu için bunun yerine yoklanan bir yol.

18. Gizlilik

Telemetri, window kapsamlı telemetry.enabled ayarıyla denetlenir. Varsayılan olarak kapalıdır. Günlük özet ve kaldırma bildirimi ayrıca VS Code'un genel telemetry.telemetryLevel ayarının telemetriye izin vermesini gerektirir; kurulum bildirimi ve birkaç küçük olay her durumda gönderilir, deneme sürümündeki ya da ücretsiz Community seviyesindeki bir kurulumun kullanım defteri kaydı da öyle. Community'de Unlock Full Features, bu telemetriyi MC/DC dahil tüm Pro özellikleriyle 30 günlüğüne, makine başına bir kez takas eder — yeniden kapatırsanız standart Community kümesi geçerli olur; ücretli lisans her iki durumda da etkilenmez. Nelerin gönderildiği için gizlilik politikasına bakın.

Üzerinde işlem yapabileceğiniz için bilinmeye değer iki şey var. Birincisi kullanım defteri kimliğiniz: denemede ve Community'de eklenti bunu Show License / Activation altında ve What Community Includes bölümünün sonunda gösterir; oradaki satırı seçmek kimliği kopyalar ve politikayı açar. Defter makinenizi yalnızca bir özetle (hash) tanır, başka hiçbir şeyle tanımaz; dolayısıyla defterin sizin için ne tuttuğunu sormanın, silinmesini istemenin ya da buna itiraz etmenin tek yolu bu kimliktir — onu bize bildirirseniz satırınızı bulabiliriz, bildirmezseniz bulamayız. İkincisi kurulum kaydı: bir kurulum ilk kez bildirimde bulunduğunda yazılan ve 90 gün sonra silinmek yerine saklanan tek bir satır; kurulum tanımlayıcısını, günü, adresinin çözümlendiği yeri, sürümleri ve işletim sistemini içerir — adresin kendisini değil, kodunuza dair hiçbir şeyi de değil. Yıllar içinde kaç kurulum olduğunu söyleyebilmemizi sağlayan şey budur. İkisi de gizlilik politikasında tüm ayrıntılarıyla anlatılır ve isterseniz ikisi de silinir.

The bottom of What Community Includes: the ways to lift the caps, and How these are counted — the row that copies your usage ledger ID and opens the privacy policy
What Community Includes bölümünün sonu: sınırların nasıl sayıldığı ve defter kimliğinizi size veren satır.

19. Değerlendirme ve etkinleştirme

Fucini Coverage Studio bir değerlendirme ön sürümü olarak dağıtılır. İlk çalıştırmada değerlendirmeyi kabul etmeniz istenir ve deneme başlar — tüm özellikler, o kurulumda ilk kullanımdan itibaren sayılan 14 günlük deneme boyunca kullanılabilir. Sonrasında bir şeyin durduğu sabit bir tarih yoktur.

2.2026.2 sürümünden itibaren yeni bir kurulumun deneme süresi, uzantı lisans sunucusuna bir kez ulaştığı anda başlar; o zamana kadar Community katmanında çalışır ve bunu bildirir. Bir geliştirme kapsayıcısında veya Codespace’te deneme başlamaz — orada tam seti bir abonelik kodu, bir anahtar veya 7 günlük geçiş açar.

Deneme bittiğinde hiçbir şey kilitlenmez: eklenti ücretsiz Community seviyesine geçer. Tam kümeyi geri almak için etkinleştirin — etkinleştirme lisans sunucusuna bağlanır ve dönen anahtarı otomatik olarak uygular; e-posta yok, elle kopyalanacak anahtar yok:

Show License / Activation: the trial state, and the buttons to enter a subscription code, see the plans or request a licenceScreenshot pending — add assets/img/licence-dialog.png (see SCREENSHOTS.md).
  1. Fucini Coverage: Show License / Activation komutunu çalıştırın (deneme veya anahtar süresi dolduğunda durum çubuğundan da erişilebilir) ve Request License… (daha önce etkinleştirdiyseniz Request Renewed Key…) seçeneğine tıklayın.
  2. İsteği onaylayın. Anahtar otomatik olarak verilir ve önceki bir istekteki iletişim bilgileriniz yeniden sorulmak yerine tekrar kullanılır.
  3. Hepsi bu. Etkinleştirme anahtarı oluşturulup otomatik olarak fuciniCoverage.license.key içine yazılır. Durum çubuğu kısa sürede denemeden etkin lisansa geçer.

Elle yapılan yol tek bir görüntüde: lisans panelini açın, Enter Key seçin, e-postanızdaki anahtarı yapıştırın; başlık “Activated” olur.

Activating by hand: the licence panel, the activation dialog, Enter Key, the pasted key, and the banner turning to ActivatedScreenshot pending — add assets/img/activate-key.gif (see SCREENSHOTS.md).

Otomatik istek bir şekilde başarısız olursa (bağlantı yok, sunucu sorunu): Fucini Coverage: Copy Activation Request Code komutunu çalıştırın, kodu iletişim sayfası veya info@fucini.consulting üzerinden gönderin ve geri aldığınız FCK1.… anahtarını Fucini Coverage: Enter Activation Key ile (veya doğrudan settings.json içine) yapıştırın:

{ "fuciniCoverage.license.key": "FCK1.…paste the whole key…" }

Ayar adı fuciniCoverage.license.key'dır (kullanıcı/genel kapsam). Anahtar, makinenize ve işletim sistemi kullanıcınıza bağlıdır, bir son kullanma tarihi taşıyabilir ve tek tek özellikleri etkinleştirebilir veya sınırlayabilir ve günlük kapsam yüklemelerini sınırlayabilir. "invalid for this machine" gösteriyorsa, bu kurulumdan yeni bir anahtar isteyin — başka bir makine için verilmiş bir anahtar burada asla doğrulanmaz.

Visual Studio'da. Visual Studio sürümünde ücretsiz katman yoktur: abonelik olmadan hiçbir şey okunmaz. Abonelik varken plan, VS Code'da neyi belirliyorsa orada da onu belirler — planın içermediği bir özellik kullanıma kapalıdır ve komutu çalışmak yerine bunu söyler. Lisans sunucusunun hâlâ desteklediği en eski sürüm sınırı orada da geçerlidir: bunun altındaki bir derlemeye günde bir kez, çalışmayı bırakacağı tarihle birlikte haber verilir ve derleme o tarihe kadar çalışmayı sürdürür. Çevrimdışı olmak bir derlemeyi asla durdurmaz.

Ücretsiz Community katmanı: haftalık kullanım hakkı

Community kapsamı göstermeyi hiçbir zaman bırakmaz. Kenar boşlukları, genel bakış cetveli, üzerine gelince açılan ipuçları, CodeLens, Coverage görünümü, izleme modu, diff kapsamı ve geçmiş hiç sayılmaz; komutla bir tracefile yüklemek ise yalnızca günde 25 ile sınırlıdır. Ölçülen şey çıktıdır: HTML raporunu açma, dışa aktarma, iki çalıştırmayı karşılaştırma, eşikleri denetleme ve açıklamalı kaynağı yerinde görüntüleme için her biri haftada beş.

Hafta takvimin değil, sizindir: ilk kullanımla başlar ve yedi gün sonra biter. Bir kullanım hakkı tükendiğinde ileti, eylemin adını ve hakkın geri geleceği günü belirtir; bu tek iletiden sonra konuyu yalnızca durum çubuğu hatırlatır. Fucini Coverage: What Community Includes, siz daha herhangi birine ulaşmadan önce, her kullanım hakkını ne kadarının kullanıldığı ve ne zaman sıfırlanacağı bilgisiyle listeler.

The weekly allowance: five uses of Open HTML Report across three days, a sixth refused with the day the count resets, and the week ending seven days after the first use; gutters, hovers, CodeLens and the Coverage view are never countedScreenshot pending — add assets/img/weekly-allowance.png (see SCREENSHOTS.md).
The message at a Community limit: Checking coverage thresholds, all 5 used, the day it resets, and the buttons Subscribe, 7-Day Pass and What Community IncludesScreenshot pending — add assets/img/community-limit-prompt.png (see SCREENSHOTS.md).
What Community Includes: each allowance with how much is used and the day it resets, then the features that are not includedScreenshot pending — add assets/img/community-includes-weekly.png (see SCREENSHOTS.md).

Üç ayrıntı ücretli planlara aittir, bulguların kendisi ise ücretsiz kalır: Community, hayatta kalan mutantları olan her satırı işaretler ve kaç tane olduğunu söyler, ancak her mutantın neyi değiştirdiğini söylemez; bir satırı kaç testin çalıştırdığını söyler, ancak adlarını söylemez; bir çalıştırmanın Max CRAP değerini gösterir, ancak sıralı Riskiest Methods listesini göstermez.

A mutant hover in Community: 2 mutants survived and 2 more detected on the line; what each mutant changed is part of the paid plansScreenshot pending — add assets/img/mutant-hover-community.png (see SCREENSHOTS.md).

Haftalık kullanım hakkı geldiğinde (0.2026.83) Community'yi zaten kullanıyorduysanız, önceki sınırlarınız 30 gün boyunca geçerli kalır; bu size tarihiyle birlikte bir kez bildirilir. Sayaçlar bilgisayarınızda tutulur — VS Code'un kendi depolama alanında ve ~/.fucini-coverage/ içinde, böylece yeni bir VS Code profili aynı haftayı sürdürür — ve hiçbir yere gönderilmez.

7 günlük geçiş

Aboneliğe hazır değil misiniz? 7 günlük geçiş, Pro'daki her şeyin bir haftalığına, tek seferlik ödemeyle sunulmasıdır: yenilenen bir şey yoktur ve iptal edilecek bir şey yoktur. Fiyatlandırma sayfasından satın alın (Community sınırında çıkan iletide bunun için bir düğme vardır); etkinleştirme kodu e-postayla gelir.

The 7-day pass on the pricing page: everything in Pro for one week, paid once, with the Get a 7-day pass buttonScreenshot pending — add assets/img/pricing-week-pass.png (see SCREENSHOTS.md).
  1. Fucini Coverage: Enter Subscription Code komutunu çalıştırın — hem Community sürümünde hem de Pro'da bulunur.
  2. Pro seçeneğini seçin ve e-postadaki FCB1-… kodunu yapıştırın.
  3. Hepsi bu. Anahtar sizin için oluşturulur ve uygulanır, çevrimdışı da çalışır. Hafta ödemeden itibaren işler, bu yüzden satın aldığınızda etkinleştirin. Süre dolduğunda uzantı kendiliğinden Community'ye döner ve kapsamı göstermeye devam eder.
Enter Subscription Code, step 1: choose Pro from the list of plansScreenshot pending — add assets/img/pass-step-plan.png (see SCREENSHOTS.md).
Enter Subscription Code, step 2: paste the FCB1 code from the purchase email and press EnterScreenshot pending — add assets/img/pass-step-code.png (see SCREENSHOTS.md).

Visual Studio’da. Aynı kod Visual Studio için Fucini Coverage Studio’yu, 2022 ve 2026, etkinleştirir: Tools → Coverage Studio → Licence…’ı açın, kodu yapıştırın, ait olduğu planı seçin ve Activate’e basın. Coverage penceresi ardından ağacın üstünde Activated der; okuyla açıldığında satır, anahtarın hangi tarihe kadar geçerli olduğunu ve hesabınıza giden bir düğmeyi gösterir. Bir makine bir koltuktur: VS Code’u ya da Visual Studio’yu etkinleştirin, aynı makinedeki diğer düzenleyici kendiliğinden izler — Visual Studio VS Code’un anahtarını, VS Code da Visual Studio’nunkini okur — böylece hiçbir şey iki kez girilmez ve ikinci bir koltuk alınmaz. İkisi de anahtarı aynı şekilde canlı tutar: Pro Plus, Business ve Enterprise günde iki kez bildirim yapar, Pro anahtarı ise dolmasından önceki hafta yenilenir.

Visual Studio: the Coverage window says no subscription covers this machine, and the Licence dialog takes the subscription code
Visual Studio: the Coverage window after an activation — Activated, valid until a date, and a button to the account

Yeni bir bilgisayara geçmek ve koltukları yönetmek

Anahtar tek bir makineye bağlıdır, dolayısıyla yeni bir bilgisayar yeni bir anahtar ister — ve aboneliğiniz yalnızca belirttiği kadar makineyi karşılar. Eskisini kendiniz serbest bırakın: aboneliğinizi yönetin sayfasında oturum açın, artık kullanmadığınız koltuğu bulun, Free up seçin ve yeni makineyi aynı kodla etkinleştirin. Pro satın almak size parola göndermez — hesabınız vardır, yalnızca henüz parolası yoktur; bu yüzden ilk seferinde abone olduğunuz adresle parolanızı belirleyin veya sıfırlayın.

Business ve Enterprise planlarında her iş arkadaşınızı aynı sayfadan e-postayla davet edersiniz. Herkes yalnızca kendisine ait bir etkinleştirme kodu alır ve kodu kullandığı anda adresi koltuğunun yanında görünür — biri ayrıldığında hangi koltuğun onunki olduğunu görür ve bir sonraki kişi için serbest bırakırsınız. Bir davet, gönderdiğiniz andan itibaren bir koltuğu tutar ve kullanılmazsa 14 gün sonra sona erer; koltuğu hemen geri almak için daveti geri çekin.

Ön sürümleri test etmek

Yenilikler Marketplace'e ulaşmadan önce fucini.software adresine ulaşır ve bunların size sunulmasını isteyebilirsiniz. Coverage görünümünü açın, lisans panelini genişletin ve Ön sürümleri test et… düğmesine basın — ya da fuciniCoverage.update.preRelease ayarını açın. O andan itibaren uzantı, olağan akışın yanı sıra burada ayrı bir ön sürüm akışını da denetler ve ikisinden hangisi yeniyse onu sunar.

The licence panel in the Coverage view, expanded: a Pro licence valid until 2027-03-19, and the button labelled Test pre-release buildsScreenshot pending — add assets/img/licence-prerelease.png (see SCREENSHOTS.md).

Ön sürümler test edilmiştir, ama en az emin olduğumuz yapılardır — gözden kaçırdıklarımızı bulmak için gönüllü oluyor olursunuz. Katılmanız, bu kurulumun kanalda olduğunu bize bildirir; böylece kaç kişinin test ettiğini bilir ve neyin değiştiğini anlatabiliriz. Ayrılırsanız bir sonraki kararlı sürüm sizi olağan yola geri koyar. Her zaman bir ön sürüm bulunmaz ve yokken katılmanın hiçbir maliyeti olmaz: uzantı boş bir akış bulur, bu konuda hiçbir şey söylemez ve biri yayımlanana dek kararlı sürümleri sunmayı sürdürür.

The same panel once the install has joined: an update bar offering 0.2026.84 while 0.2026.83 is running, the button now reading Leave the pre-release channel, and a line saying the install is on the channelScreenshot pending — add assets/img/licence-prerelease-joined.png (see SCREENSHOTS.md).

20. İletişim ve lisans

Sorular, hata bildirimleri veya alternatif lisans koşulları için — iletişim sayfasına bakın veya info@fucini.consulting adresine e-posta gönderin. Sürüm notlarında atıf koşulu içeren MIT lisansı altındadır; ayrıca Notice'a da bakın.

21. Komut satırında

Okuyucu düzenleyici olmadan da çalışır: npm install -g fucini-coverage, ücretsiz, Windows, Linux, WSL ve macOS'te. fucini-coverage check coverage/lcov.info --lines 80, bir işlem hattının başarısız olduğu kapıdır; summary, export, report, badge ve compare, düzenleyicilerin aynı adlı komutlarının yaptığını yapar ve mcp yukarıdaki bölümün altı aracını bir sunucu üzerinden bir ajana sunar. Visual Studio sürümünün okuduğu ayar dosyası olan fucini-coverage.json dosyasını okur, böylece eşikler bir kez belirlenir. fucini-coverage help <command> her birini açıklar; tam sayfa npm'de fucini-coverage.

The command line on the demo: --help, summary, check with two gates passing, export as Markdown, compare against a baseline, badge, report and the MCP server's helpScreenshot pending — add assets/img/cli-demo.gif (see SCREENSHOTS.md).