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ı.
Screenshot 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):
- İstediğiniz yere açın, ardından VS Code'da
coverage-studio-demo.code-workspacedosyasını açın (File → Open Workspace from File…). - Henüz yapmadıysanız Fucini Coverage Studio'yu yükleyin (yukarıdaki §2'ye bakın).
- Çalışma alanının kendi
.vscode/settings.jsondosyası zaten paket içindekicoverage/lcov.info'ya işaret eder, bu yüzden uzantı etkinleştirilir etkinleştirilmez oluklar ve Covered Files görünümü belirir —Load Coverageadımına gerek yoktur. - İzleme dosyasını kendiniz yeniden oluşturmak mı istiyorsunuz (ör. farklı bir derleyiciyle)?
scripts/gen-coverage.shdosyasını çalıştırın (Windows'ta.ps1) — kullanılabilir derleyici hedefleri için çalışma alanının kendiREADME.mddosyası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.
- Normal test iş akışınızla bir kapsam iz dosyası oluşturun.
- Komut Paleti (
Ctrl+Shift+P) →Fucini Coverage: Load Coverage.watch.enabledaçıkken (varsayılan), eşleşen bir dosya otomatik olarak yüklenir. - 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
×Nsayıları bir ayar ötededir (editorGutter.mode,hitCounts.inline).
Screenshot 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çim | Tipik dosya | Ek ölçütler |
|---|---|---|
| LCOV | lcov.info | satırlar, dallar, işlevler |
| llvm-cov JSON | coverage.json | + bölgeler, MC/DC, örneklemeler |
| Cobertura XML | coverage.xml | satırlar, dallar |
| JaCoCo XML | jacoco.xml | satırlar, dallar, işlevler |
| Istanbul / nyc | coverage-final.json | deyimler, dallar, işlevler |
| SimpleCov | .resultset.json | satırlar |
| Clover XML | clover.xml | satırlar, dallar, işlevler |
| OpenCover XML | coverage.opencover.xml | satırlar, dallar, işlevler |
| coverage.py JSON | coverage.json | satırlar, dallar |
| gcov / gcovr JSON | coverage.json | satırlar, dallar, işlevler |
| Go coverage profile | coverage.out | satırlar |
| SonarQube generic | coverage.xml | satırlar, dallar |
| GNATcoverage XML (Ada) | *.xml | satırlar, dallar, MC/DC |
| BullseyeCoverage XML | coverage.xml | satırlar, koşul/karar |
| Visual Studio | *.coveragexml | satırlar, dallar |
| Coveralls JSON | coveralls.json | satırlar, dallar |
| Xcode xccov JSON | coverage.json | işlevler ve dosya toplamları — satır başına veri yok |
| gcov plain text | *.gcov | satırlar, dallar, işlev çağrıları |
| VectorCAST | coverage.xml | satırlar, dallar, MC/DC çiftleri, işlevler, işlev çağrıları |
| Testwell CTC++ | *.txt | satırlar, koşul/karar |
| Lauterbach TRACE32 | *.xml | deyimler, kararlar, koşullar, MC/DC, işlevler, çağrılar, nesne kodu |
| EMMA XML (Java) | coverage.xml | satırlar |
| UCIS / Aldec UCDB | *.xml | deyimler, karar dalları |
| NCover XML | Coverage.xml | satırlar, işlevler |
| dotCover DetailedXML | dotCover.xml | satırlar, işlevler |
| PIT (mutation) | mutations.xml | mutasyon puanı — kapsam yok |
| Stryker (mutation) | mutation-report.json | mutasyon 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ü.
Screenshot pending — add assets/img/vs-native-run.gif (see SCREENSHOTS.md).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
pathsgirdisidefaultLocation'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.pathsboş olduğunda, uzantı öncecoverage.json'ı, ardındanlcov.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: valuebaşlıkları ekler,remote.refreshMinutesbir zamanlayıcıyla yeniden indirir ve URL’nin kendisi bir dosya adıyla bitmediğinde bir#lcov.infoparçası biçimi adlandırır. - Yoksayma glob’ları —
fuciniCoverage.ignorebü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,.gitignoregibi, 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.*veremote.*klasör başına okunur; böylece bir klasörün kendi.vscode/settings.json’ı ya da.code-workspacegirdisi 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.enabledaçık olsun olmasın bitişi kapsamı yeniden yükleyen görevleri (tasks.json’daki birlabelya da Run Task listesinin gösterdiği biçimiylesource: name) adlandırır — izleyicinin takip edemediği derlemeler için. Çalışma alanı dışındaki mutlak birpathsgirdisi 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
}
Screenshot 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.
Screenshot 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).
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.
Screenshot pending — add assets/img/coverage-view-editor.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/coverage-view-columns.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/workspace-overview.gif (see SCREENSHOTS.md).
Screenshot pending — add assets/img/vs-workspace-overview.gif (see SCREENSHOTS.md).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.jsondosyası MC/DC taşır, aynı derlemenin GCCgcov.infodosyası ise yalnızca satırları ve dalları:coverage.jsondosyası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.

bits.c üzerinde Choose Coverage Source... — clang raporu, GCC raporu ya da ikisi birleştirilmiş.


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 satırlarının 100%'üne ulaşır — derlemelerin ayrıştığı satırlar ise turkuaz kalı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.modeyalnı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.enabledile 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.enabledile 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.enabledile 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×12yazar,×0dâ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) veuncoveredAndPartialolarak 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.enabledarkası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 (uncoveredya da çalışmış satırlar için deheatmap). 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 daoff. - 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.
Screenshot pending — add assets/img/codelens-hover.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/codelens-crap.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/jump-between-gaps.gif (see SCREENSHOTS.md).
Screenshot pending — add assets/img/explorer-badges.png (see SCREENSHOTS.md).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
}
Screenshot pending — add assets/img/gutters.png (see SCREENSHOTS.md).
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 — heatmap, off, uncovered ve yeniden coverage.
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
}
Screenshot pending — add assets/img/heatmap-dark.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/heatmap-light.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/heatmap.gif (see SCREENSHOTS.md).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"]
}


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.
Screenshot 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
Screenshot pending — add assets/img/tests-per-line.gif (see SCREENSHOTS.md).
Screenshot pending — add assets/img/tests-for-line.gif (see SCREENSHOTS.md).
Quote.cs 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"]
}
Screenshot pending — add assets/img/pass-fail.gif (see SCREENSHOTS.md).
Screenshot pending — add assets/img/vs-pass-fail.gif (see SCREENSHOTS.md).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.
Screenshot pending — add assets/img/test-impact.gif (see SCREENSHOTS.md).
Screenshot pending — add assets/img/vs-test-impact.gif (see SCREENSHOTS.md).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.
Screenshot pending — add assets/img/minimal-test-set.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/vs-minimal-test-set.png (see SCREENSHOTS.md).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.
Screenshot pending — add assets/img/run-this-test.gif (see SCREENSHOTS.md).
[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
}
Screenshot pending — add assets/img/coverage-on-save.gif (see SCREENSHOTS.md).
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.
Screenshot pending — add assets/img/run-app.gif (see SCREENSHOTS.md).
Screenshot pending — add assets/img/vs-run-app.gif (see SCREENSHOTS.md).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.
Screenshot 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.
Screenshot 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.
Screenshot pending — add assets/img/mutation-here.gif (see SCREENSHOTS.md).
Screenshot pending — add assets/img/vs-mutation-here.gif (see SCREENSHOTS.md).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.
Screenshot 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"
}
Screenshot 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"
}
Screenshot 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"
}
Screenshot pending — add assets/img/new-code-gate.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/vs-new-code-gate.png (see SCREENSHOTS.md).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"
}
Screenshot 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.
Screenshot pending — add assets/img/indirect-changes.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/vs-indirect-changes.png (see SCREENSHOTS.md).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çüt | Ağırlık | Gerekçe |
|---|---|---|
| MC/DC | 4 | IEC 61508 SIL 3–4 / ISO 26262 ASIL C–D / DO-178C DAL A–B. |
| Dallar | 2 | IEC 61508 SIL 2+ / ISO 26262 ASIL B+. |
| Koşullar | 3 | Dallar ile MC/DC arasında (DO-178C, ISO 26262). |
| Bölgeler | 1.5 | Deyim içi yollar (ör. kısmi kısa devre). |
| Satırlar | 1 | IEC 61508 SIL 1+ / ISO 26262 ASIL A+. |
| İşlevler | 1 | Ölü kod denetimi. |
| Örneklemeler | 0.5 | C++ şablon kapsamı; en dar kapsam. |
| İşlev çağrıları | 1 | Yürütülmüş olan çağrı noktaları (gcov, VectorCAST, Testwell CTC++, TRACE32). |
| Nesne kodu | 0 | Ona bir ağırlık vermediğiniz sürece kapalıdır: deyim kapsamını zaten içerir. |
| Mutasyon puanı | 0 | Ona 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.
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).
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.
Screenshot 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.
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.
Screenshot 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.
Screenshot pending — add assets/img/vs-hotspots.png (see SCREENSHOTS.md).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.
Screenshot pending — add assets/img/namespace-perspective.png (see SCREENSHOTS.md).
Ağaçta arama
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.
Screenshot pending — add assets/img/tree-search.gif (see SCREENSHOTS.md).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.
Screenshot pending — add assets/img/follow-editor.gif (see SCREENSHOTS.md).
Screenshot pending — add assets/img/vs-follow-editor.gif (see SCREENSHOTS.md).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:
Screenshot pending — add assets/img/statusbar.png (see SCREENSHOTS.md).| Mod | COMPLIANT olduğunda… |
|---|---|
strict (default) | ayrı ayrı denetlenen her ölçüt kendi eşiğini karşılar — ödün yok. |
whm | tek ağırlıklı bileşik puan threshold.weighted değerini karşılar. |
both | hem ağırlıklı denetim HEM DE ölçüt bazlı katı denetim karşılanır. |
either | ağı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.
Screenshot pending — add assets/img/vs-error-list.png (see SCREENSHOTS.md).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çüt | standard | safety |
|---|---|---|
| Satırlar | 80 | 100 |
| İşlevler | 80 | 100 |
| Bölgeler | 75 | 100 |
| Dallar | 70 | 100 |
| Bileşik puan | 75 | 100 |
| MC/DC, örneklemeler, işlev çağrıları, nesne kodu | kapı yok | 100 |
| Koşullar | kapı yok | 100 |
| Mutasyon puanı | kapı yok | kapı 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
}
Screenshot pending — add assets/img/threshold-profile.png (see SCREENSHOTS.md).
Screenshot 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.
Screenshot 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.
- Hedef üzerinde çalışan, enstrümante bir derleme. GCC çapraz derleyicileri
-fprofile-arcs -ftest-coveragekabul eder, dolayısıyla iş istasyonunda işleyen enstrümantasyon hedefte de işler — şu farkla ki çıplak donanım sisteminde.gcdasayaçlarını yazacak bir dosya sistemi, çoğu zaman da onları yazacağı birexit()yoktur. Sayaçlar zaten RAM'dedir; çözüm o belleği dökmek ve dosyaları hedef dışında yeniden kurmaktır. NASA JPL'inembedded-gcovprojesi (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.gcovlistesi olarak yükleyin. - 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.
- 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.
Screenshot pending — add assets/img/exclude-from-tree.gif (see SCREENSHOTS.md).
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.
Screenshot pending — add assets/img/exclude-selection.gif (see SCREENSHOTS.md).
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
Screenshot 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.
Screenshot pending — add assets/img/justified-exclusions.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/vs-justified-exclusions.png (see SCREENSHOTS.md).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; vefuciniCoverage.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ş birllvm-cov show --format=htmldizinine 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.
Screenshot pending — add assets/img/vs-annotated-source.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/report.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/report-directory-summary.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/report-file-summary.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/report-coverage-gaps.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/report-mcdc-detail.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/export-picker.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/annotated-source.png (see SCREENSHOTS.md).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:

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.
Screenshot pending — add assets/img/history-compare.png (see SCREENSHOTS.md).
Screenshot 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.
Screenshot pending — add assets/img/trend-chart.png (see SCREENSHOTS.md).
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.
Screenshot pending — add assets/img/coverage-session.gif (see SCREENSHOTS.md).
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:
- CI'ın sunduğu bir URL. GitLab bir dalın son iş yapıtlarını sabit bir adreste tutar; belirteç,
remote.headersiç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}ilehttps://tc.example.com/repository/download/App_Main/.lastSuccessful/coverage/lcov.info. URL, bircoverageFile.pathsURL'siyle tıpatıp aynı biçimde alınır ve önbelleğe alınır (ETag,remote.refreshMinutes). - İş hattının bir paylaşıma kopyaladığı bir dosya —
\\build\drops\app\main\coverage.cobertura.xmlgibi mutlak bir yol. - İndirilmiş bir yapıt, klasörün altında tutulan, diyelim
ci/main.lcov.info(klasörü.gitignoreiç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.
Screenshot pending — add assets/img/ci-baseline.gif (see SCREENSHOTS.md).main karşısında değişen dosyalar.
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_gaps | Bir 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_line | Raporun bunu söylediği yerde — test başına bir çalıştırmada — bir satırı hangi testlerin çalıştırdığı. |
patch_coverage | Bir 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_delta | Bir önceki çalıştırmadan beri değişenler: toplamlar ve kapsam kazanan ya da kaybeden dosyalar. |
test_run_command | Bu ç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.
Screenshot pending — add assets/img/mcp-config.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/vs-mcp-config.png (see SCREENSHOTS.md).{
"servers": {
"fucini-coverage": {
"type": "http",
"url": "http://127.0.0.1:39217/mcp",
"headers": { "Authorization": "Bearer …" }
}
}
}
- 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
Originbaş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ı.







Screenshot pending — add assets/img/statusbar-and-toolbar.gif (see SCREENSHOTS.md).
Screenshot pending — add assets/img/statusbar-menu.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/worst-functions.png (see SCREENSHOTS.md).| Komut | Ne 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 Files | Etkin ç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 Coverage | Test ç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 Line | Raporun 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 Coverage | Açı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 Coverage | Hariç 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 Session | Bir 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 Uncovered | Kapsanmayan 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 Mode | off, 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 Counts | Her 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 View | Etkin çalıştırmayı VS Code’un kendi Test Coverage paneline yayımla (testCoverage.publish kapalıyken bile) ve paneli aç. |
| Suggest Path Remap Rule | Etkin ç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 Report | Oluşturulan statik raporu aç. |
| Generate Full HTML Report | Çok sayfalı raporu oluştur. |
| Open Annotated Source / …to the Side | Bir dosya için açıklamalı kapsam görünümü. |
| Toggle Annotated Source | Kaynak 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 / Functions | En düşükten sıralanmış Quick Pick. |
| Copy Uncovered Lines | Kapsanmayan her aralığın Markdown özeti. |
| Compare Two History Runs / with Last Run | Dosya 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 Baseline | Yü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 Thresholds | Uyumluluk denetimlerini değerlendir. |
| Export Fucini JSON | Geç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 Badge | Etkin çalıştırmanın SVG rozetini, badge.metric’i göstererek badge.outputPath’e yaz ve açmayı öner. |
| Copy MCP Server Configuration | Bir 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 Menu | Hı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.
| Kod | Anlamı |
|---|---|
FUCINI_PARSE_001 | Desteklenmeyen/tanınmayan kapsam biçimi — dosyayla eşleşen bir ayrıştırıcı yok. |
FUCINI_PARSE_010 | lcov dosyasında SF kaydı yoktu. |
FUCINI_PARSE_020 | llvm-cov JSON geçersiz, data[] eksik ya da dosya içermiyordu. |
FUCINI_PARSE_030 | Cobertura kökü <coverage> yok ya da XML geçersiz. |
FUCINI_PARSE_040 | JaCoCo kökü <report> yok ya da kaynak dosya yok. |
FUCINI_PARSE_050 | Istanbul/SimpleCov JSON geçersiz ya da dosya içermiyordu. |
FUCINI_PARSE_060 | SimpleCov JSON geçersiz ya da üst düzey files dizisi yok. |
FUCINI_PARSE_070 | mode: başlığı olmayan ya da kapsam bloğu içermeyen Go profili. |
FUCINI_PARSE_080 | Clover kökü <coverage> ya da <project> yok veya içinde dosya yok. |
FUCINI_PARSE_090 | OpenCover kökü <CoverageSession> yok veya içinde dosya yok. |
FUCINI_PARSE_100 | coverage.py JSON'u geçersiz ya da üst düzey files nesnesi eksik. |
FUCINI_PARSE_110 | gcov/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_150 | Xcode kapsam JSON’u geçersiz veya üst düzey targets dizisi yok. |
FUCINI_PARSE_160 | SonarQube <coverage> kök ögesi yok ya da içinde <file> ögesi yok. |
FUCINI_PARSE_170 | Coveralls JSON’u geçersiz veya üst düzey source_files dizisi yok. |
FUCINI_LOAD | Bir yükleme ilerleme bildiriminden iptal edildi; varsa önceki çalıştırma yüklü kalır. |
FUCINI_REMOTE_001 | Bir 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_002 | Bir 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_003 | Bir 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_002 | Bir 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_001 | Git uzantısı kullanılamıyor; diff kapsamı atlanır ve çalıştırmanın tamamı gösterilir. |
FUCINI_GITDIFF_002 | gitDiff.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_IGNORE | fuciniCoverage.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_003 | count 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_TESTCOVERAGE | VS Code’un Test Coverage görünümüne kaç dosyanın yayımlandığı. |
FUCINI_BADGE | Rozet yazıldı; yolu, etiketi ve değeriyle. |
FUCINI_BADGE_001 | Rozet yazılamadı; nedeniyle. |
FUCINI_WORKSPACE | Çalışma alanına bir klasör eklendi ya da ondan çıkarıldı; kapsam yeniden keşfediliyor. |
FUCINI_VARIABLES | Yol 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.

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:
Screenshot pending — add assets/img/licence-dialog.png (see SCREENSHOTS.md).Fucini Coverage: Show License / Activationkomutunu ç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.- İsteği onaylayın. Anahtar otomatik olarak verilir ve önceki bir istekteki iletişim bilgileriniz yeniden sorulmak yerine tekrar kullanılır.
- Hepsi bu. Etkinleştirme anahtarı oluşturulup otomatik olarak
fuciniCoverage.license.keyiç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.
Screenshot 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.
Screenshot pending — add assets/img/weekly-allowance.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/community-limit-prompt.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/community-includes-weekly.png (see SCREENSHOTS.md).Üç 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.
Screenshot 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.
Screenshot pending — add assets/img/pricing-week-pass.png (see SCREENSHOTS.md).Fucini Coverage: Enter Subscription Codekomutunu çalıştırın — hem Community sürümünde hem de Pro'da bulunur.- Pro seçeneğini seçin ve e-postadaki
FCB1-…kodunu yapıştırın. - 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.
Screenshot pending — add assets/img/pass-step-plan.png (see SCREENSHOTS.md).
Screenshot 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.


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.
Screenshot 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.
Screenshot 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.
Screenshot pending — add assets/img/cli-demo.gif (see SCREENSHOTS.md).