Alıştırma - Kod kapsamı testi gerçekleştirme
Birim testi için kullandığınız araç gibi, kod kapsamı için kullandığınız araç da programlama diline ve uygulama çerçevesine bağlıdır.
Linux üzerinde çalıştırılacak .NET uygulamalarını hedeflediğinizde, kapak popüler bir seçenektir. Coverlet, .NET için platformlar arası bir kod kapsamı kitaplığıdır.
.NET'te kod kapsamı nasıl yapılır?
Kod kapsamını toplama yönteminiz, kullandığınız programlama diline ve çerçevelere ve hangi kod kapsamı araçlarının kullanılabilir olduğuna bağlıdır.
Tailspin senaryomuzda şunları buluyoruz:
Windows üzerinde Visual Studio, kod kapsamı gerçekleştirmek için bir yol sağlar.
Ancak Linux üzerinde derleme yaptığımız için .NET için platformlar arası kod kapsamı kitaplığı olan coverlet'i kullanabiliriz.
Birim testi projesi coverlet.msbuild NuGet paketini gerektirir.
Kod kapsamı sonuçları, başka bir araç tarafından işlenebilmeleri için bir XML dosyasına yazılır. Azure Pipelines, Cobertura ve JaCoCo kapsam sonuç biçimlerini destekler.
Bu modülde Cobertura'yı kullanıyoruz.
Cobertura kapsam sonuçlarını insan tarafından okunabilir bir biçime dönüştürmek için ReportGenerator adlı bir araç kullanabiliriz.
ReportGenerator, HTML de dahil olmak üzere birçok biçim sağlar. HTML biçimleri bir .NET projesindeki her sınıf için ayrıntılı raporlar oluşturur.
Özellikle, Azure Pipelines ile eşleşen bir görsel görünüm sağlayan HtmlInline_AzurePipelines adlı bir HTML biçimi vardır.
.NET araçlarını nasıl yönetebilirim?
gibi ReportGenerator
bir .NET aracı, konsol uygulaması içeren özel bir NuGet paketidir. .NET aracını genel bir araç veya yerel bir araç olarak yönetebilirsiniz.
Genel bir araç merkezi bir konuma yüklenir ve herhangi bir dizinden çağrılabilir. Makinedeki tüm dizinler için genel bir aracın bir sürümü kullanılır.
Yerel araç, kapsamı belirli bir dizine göre belirlenmiş bir .NET aracının daha yalıtılmış bir kopyasıdır. Kapsam, farklı dizinlerin aynı aracın farklı sürümlerini içermesini sağlar.
Belirli bir dizin için yerel araçları yönetmek için bir bildirim dosyası kullanırsınız. Bu dosya JSON biçimindedir ve genellikle dotnet-tools.json olarak adlandırılır. Bildirim dosyası, uygulamanızı derlemek veya çalıştırmak için ihtiyacınız olan belirli araç sürümlerini açıklamanıza olanak tanır.
Bildirim dosyasını kaynak denetimine ve uygulama kaynaklarınıza eklediğinizde, geliştiriciler ve derleme sistemleri bildirim dosyasında listelenen tüm araçları yüklemek için komutunu çalıştırabilir dotnet tool restore
. Yerel aracın daha yeni bir sürümüne ihtiyacınız olduğunda, bildirim dosyasındaki sürümü güncelleştirmeniz yeterlidir.
İşleri daha yalıtılmış tutmak için bu modüldeki yerel araçlarla çalışacaksınız. Aracı içeren ReportGenerator
bir araç bildirimi oluşturacaksınız. Ayrıca, kod kapsamı sonuçlarını insan tarafından okunabilir bir biçime dönüştürmek için Araç'ı yüklemek ReportGenerator
için derleme işlem hattınızı değiştireceksiniz.
Kod kapsamını yerel olarak çalıştırma
İşlem hattı kodu yazmadan önce işlemi doğrulamak için işlemleri el ile deneyebilirsiniz.
Visual Studio Code'da tümleşik terminali açın.
Yerel araç bildirim dosyası oluşturmak için aşağıdaki
dotnet new
komutu çalıştırın.dotnet new tool-manifest
komutu .config/dotnet-tools.json adlı bir dosya oluşturur.
ReportGenerator'ı yüklemek için aşağıdaki
dotnet tool install
komutu çalıştırın:dotnet tool install dotnet-reportgenerator-globaltool
Bu komut en son sürümünü
ReportGenerator
yükler ve araç bildirim dosyasına bir girdi ekler.Aşağıdaki
dotnet add package
komutu çalıştırarakcoverlet.msbuild
paketi Tailspin.SpaceGame.Web.Tests projesine ekleyin:dotnet add Tailspin.SpaceGame.Web.Tests package coverlet.msbuild
Birim testlerinizi çalıştırmak ve kod kapsamını toplamak için aşağıdaki
dotnet test
komutu çalıştırın:Dekont
Visual Studio'da PowerShell terminalini kullanıyorsanız, satır devamı karakteri bir backtick ()` olduğundan, çok satırlı komutlar için ters eğik çizgi karakteri (\) yerine bu karakteri kullanın.
dotnet test --no-build \ --configuration Release \ /p:CollectCoverage=true \ /p:CoverletOutputFormat=cobertura \ /p:CoverletOutput=./TestResults/Coverage/
Komut başarısız olursa aşağıdaki gibi çalıştırmayı deneyin:
MSYS2_ARG_CONV_EXCL="*" dotnet test --no-build \ --configuration Release \ /p:CollectCoverage=true \ /p:CoverletOutputFormat=cobertura \ /p:CoverletOutput=./TestResults/Coverage/
Bu komut daha önce çalıştırdığınız komuta benzer.
/p:
Bayraklar, hangi kod kapsamı biçiminin kullanılacağını ve sonuçların nereye yerleştirileceğine ilişkin coverlet'e bildirir.Cobertura dosyasını HTML'ye dönüştürmek için aşağıdaki
dotnet tool run
ReportGenerator
komutu çalıştırın:dotnet tool run reportgenerator \ -- -reports:./Tailspin.SpaceGame.Web.Tests/TestResults/Coverage/coverage.cobertura.xml \ -targetdir:./CodeCoverage \ -reporttypes:HtmlInline_AzurePipelines
Projenin kökündeki CodeCoverage klasöründe birçok HTML dosyası görünür.
Visual Studio Code'da CodeCoverage klasörünü genişletin, index.htm'ye sağ tıklayın ve ardından Dosya Gezgini'da Göster (macOS'ta Bulucu'da Göster veya Linux'ta Kapsanan Klasörü Aç)'ı seçin.
Windows Gezgini'nde (macOS'ta Bulucu) index.htm'ye çift tıklayarak web tarayıcısında açın.
Kapsam raporu özetini görürsünüz.
Sınıf türüne göre kapsam dökümünü görmek için sayfanın en altına kaydırın.
Diğer ayrıntıları görüntülemek için bağlantısını
TailSpin.SpaceGame.Web.LocalDocumentDBRepository<T>
seçin.Yöntemin
GetItemsAsync
birim testleri kapsamında olduğuna, ancak yönteminCountItemsAsync
kapsamı olmadığına dikkat edin.Bu mantıklıdır çünkü
FetchOnlyRequestedGameRegion
test yöntemi yöntemini çağırırGetItemsAsync
, ancak yöntemini çağırmazCountItemsAsync
. (Test kodunu gözden geçirmek içinDocumentDBRepository_GetItemsAsyncShould.cs dosyası.)
Dal oluşturma
Artık yerel olarak bir kod kapsamı raporu derleyebileceğinize göre, aynı görevleri gerçekleştiren derleme işlem hattınıza görevler eklemeye hazırsınız.
Bu bölümde, çalışmanızı tutmak için dalını unit-tests
temel alan adlı code-coverage
bir dal oluşturacaksınız. Pratikte bu dalı normalde daldan main
oluşturursunuz.
Visual Studio Code'da tümleşik terminali açın.
Terminalde aşağıdaki
git checkout
komutu çalıştırarak adlıcode-coverage
bir dal oluşturun:git checkout -B code-coverage
Derleme görevleri ekleme
Bu bölümde, derleme işlem hattınıza kod kapsamını ölçen görevler ekleyeceksiniz.
Visual Studio Code'da azure-pipelines.yml dosyasını aşağıdaki gibi değiştirin:
trigger: - '*' pool: vmImage: 'ubuntu-20.04' demands: - npm variables: buildConfiguration: 'Release' wwwrootDir: 'Tailspin.SpaceGame.Web/wwwroot' dotnetSdkVersion: '6.x' steps: - task: UseDotNet@2 displayName: 'Use .NET SDK $(dotnetSdkVersion)' inputs: version: '$(dotnetSdkVersion)' - task: Npm@1 displayName: 'Run npm install' inputs: verbose: false - script: './node_modules/.bin/node-sass $(wwwrootDir) --output $(wwwrootDir)' displayName: 'Compile Sass assets' - task: gulp@1 displayName: 'Run gulp tasks' - script: 'echo "$(Build.DefinitionName), $(Build.BuildId), $(Build.BuildNumber)" > buildinfo.txt' displayName: 'Write build info' workingDirectory: $(wwwrootDir) - task: DotNetCoreCLI@2 displayName: 'Restore project dependencies' inputs: command: 'restore' projects: '**/*.csproj' - task: DotNetCoreCLI@2 displayName: 'Build the project - $(buildConfiguration)' inputs: command: 'build' arguments: '--no-restore --configuration $(buildConfiguration)' projects: '**/*.csproj' - task: DotNetCoreCLI@2 displayName: 'Install .NET tools from local manifest' inputs: command: custom custom: tool arguments: 'restore' - task: DotNetCoreCLI@2 displayName: 'Run unit tests - $(buildConfiguration)' inputs: command: 'test' arguments: '--no-build --configuration $(buildConfiguration) /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura /p:CoverletOutput=$(Build.SourcesDirectory)/TestResults/Coverage/' publishTestResults: true projects: '**/*.Tests.csproj' - task: DotNetCoreCLI@2 displayName: 'Create code coverage report' inputs: command: custom custom: tool arguments: 'run reportgenerator -reports:$(Build.SourcesDirectory)/**/coverage.cobertura.xml -targetdir:$(Build.SourcesDirectory)/CodeCoverage -reporttypes:HtmlInline_AzurePipelines' - task: PublishCodeCoverageResults@1 displayName: 'Publish code coverage report' inputs: codeCoverageTool: 'cobertura' summaryFileLocation: '$(Build.SourcesDirectory)/**/coverage.cobertura.xml' - task: DotNetCoreCLI@2 displayName: 'Publish the project - $(buildConfiguration)' inputs: command: 'publish' projects: '**/*.csproj' publishWebProjects: false arguments: '--no-build --configuration $(buildConfiguration) --output $(Build.ArtifactStagingDirectory)/$(buildConfiguration)' zipAfterPublish: true - task: PublishBuildArtifacts@1 displayName: 'Publish Artifact: drop' condition: succeeded()
Bu sürüm, var olan yapılandırmanızı oluşturur. İşte yeniliklerin özeti:
Azure Pipelines görevi Display name Tanım DotNetCoreCLI@2
Yerel bildirimden .NET araçlarını yükleme dotnet-tools.json bildirim dosyasında listelenen araçları yükler DotNetCoreCLI@2
Birim testleri çalıştırma - $(buildConfiguration) Birim testlerini çalıştırır ve ayrıca Cobertura biçiminde kod kapsamını toplar DotNetCoreCLI@2
Kod kapsamı raporu oluşturma Cobertura çıkışını HTML'ye dönüştürür PublishCodeCoverageResults@1
Kod kapsamı raporunu yayımlama Raporu işlem hattında yayımlar
Değişikliklerinizi işleme ve dalı GitHub'a gönderme
Burada değişikliklerinizi GitHub'a gönderin ve işlem hattı çalıştırmasını görün. Şu anda dalda code-coverage
olduğunuzu hatırlayın.
Gerekli olmasa da, burada her değişikliğin açıklayıcı bir işleme iletisiyle ilişkilendirilebilmesi için her dosyayı ayrı ayrı ekleyip işleyeceksiniz.
Visual Studio Code'da terminale gidin.
Artık pakete bir başvuru
coverlet.msbuild
içeren Tailspin.SpaceGame.Web.Tests.csproj dosyasını ekleyin ve işleyin:git add Tailspin.SpaceGame.Web.Tests/Tailspin.SpaceGame.Web.Tests.csproj git commit -m "Add coverlet.msbuild package"
dotnet-tools.json araç bildirim dosyasını ekleyin ve işleyin:
git add .config/dotnet-tools.json git commit -m "Add code coverage"
Güncelleştirilmiş derleme yapılandırmanızı içeren azure-pipelines.yml dosyasını ekleyin ve işleyin:
git add azure-pipelines.yml git commit -m "Add code coverage"
Dalı
code-coverage
GitHub'a gönderin.git push origin code-coverage
Azure Pipelines'ın testleri çalıştırmasını izleyin
Burada, testlerin işlem hattında çalıştığını ve ardından Azure Test Planlarının sonuçlarını görselleştirdiğini göreceksiniz.
Azure Pipelines'da, adımların her biri aracılığıyla derlemeyi izleyin.
Derleme tamamlandığında Özet sayfasına dönün ve Kod Kapsamı sekmesini seçin.
Testleri yerel olarak çalıştırdığınızda yaptığınız sonuçların aynısını görüntülersiniz.
İsteğe bağlı bir adım olarak Azure Pipelines'ın sonuçlarını inceleyebilirsiniz.
Pano pencere öğesini ekleme
Önceki bölümde, başkalarının zaman içindeki test sonucu eğilimlerini hızla gözden geçirmesini sağlayan Test Sonuçları Eğilimi pencere öğesini panonuza eklediniz.
Burada kod kapsamını özetleyen ikinci bir pencere öğesi ekleyeceksiniz.
Yeni bir tarayıcı sekmesinde marketplace.visualstudio.com gidin.
Azure DevOps sekmesinde kod kapsamını arayın.
Kod Kapsamı Pencere Öğeleri'ne tıklayın (Shane Davis tarafından yayımlandı).
Ücretsiz edinin'i seçin.
Açılan listede Azure DevOps kuruluşunuzu seçin.
Yükle'yi seçin.
Azure DevOps'a geri dönün.
Genel Bakış>Panoları'na gidin.
Düzenle'yi seçin.
Kod Kapsamı'na gidin ve Kod Kapsamı'na tıklayın.
Kod Kapsamı'nı tuvale sürükleyin.
Pencere öğesini yapılandırmak için Dişli simgesini seçin.
Aşağıdakiler dışında tüm varsayılan ayarları koruyun:
- Genişlik: 2 girin
- Derleme tanımı: İşlem hattınızı seçin
- Kapsam ölçümü: Çizgiler'i seçin
Kaydet'i seçin.
Düzenleme Bitti'yi seçin.
Pencere öğesi, birim testlerinizin kapsay olduğu kodun yüzdesini gösterir.
Artık işlem hattınızda ayarlanmış kod kapsamına sahipsiniz. Mevcut kod kapsamınız düşük olsa da, zaman içinde geliştirebileceğiniz bir temeliniz vardır.
Daha sonra, testlerinizin minimum kapsam eşiği sağlayıp sağlamadığını denetlemek için coverlet'i yapılandırabilirsiniz. Gereksinimlerinize bağlı olarak eşiğiniz yüzde 30, yüzde 50 veya yüzde 80 kapsam olabilir. Testleriniz bu miktardan daha azını kapsarsa derleme başarısız olur.
Kod kapsamı dosyalarını kaldırma
Daha önce çalıştırdığınızda Reportgenerator
, projenin kökündeki CodeCoverage klasöründe birçok HTML dosyasının göründüğünü hatırlayın.
Bu HTML dosyalarının kaynak denetimine eklenmesi amaçlanmamıştır ve artık bunlara ihtiyacınız yoktur. Projenin .gitignore dosyası CodeCoverage dizinindeki herhangi bir şeyi yoksayacak şekilde ayarlanmış olsa da, bu dosyaları silip sonraki modüllerde Git deponuza eklenmemeleri iyi bir fikirdir.
Visual Studio Code'da terminal penceresine gidin ve projenizin kök dizininde şu komutu çalıştırın:
rm -rf CodeCoverage/