Alıştırma - Kod kapsamı testi gerçekleştirme

Tamamlandı

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.

  1. Visual Studio Code'da tümleşik terminali açın.

  2. 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.

  3. 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.

  4. Aşağıdaki dotnet add package komutu çalıştırarak coverlet.msbuild paketi Tailspin.SpaceGame.Web.Tests projesine ekleyin:

    dotnet add Tailspin.SpaceGame.Web.Tests package coverlet.msbuild
    
  5. 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.

  6. 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.

  7. 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.

  8. 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.

    A screenshot of the local code coverage report summary showing 7.7 percent line coverage.

  9. 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.

    A screenshot of local coverage report class summary showing coverage stats across classes found in the Tailspin.SpaceGame.Web code.

  10. 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öntemin CountItemsAsync kapsamı olmadığına dikkat edin.

    A screenshot of local class coverage detail with a visual representation of unit test coverage for two C# methods, one with all code lines green (covered) and one with all lines red (not covered).

    Bu mantıklıdır çünkü FetchOnlyRequestedGameRegion test yöntemi yöntemini çağırır GetItemsAsync , ancak yöntemini çağırmaz CountItemsAsync . (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-coveragebir dal oluşturacaksınız. Pratikte bu dalı normalde daldan main oluşturursunuz.

  1. Visual Studio Code'da tümleşik terminali açın.

  2. Terminalde aşağıdaki git checkout komutu çalıştırarak adlı code-coveragebir 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.

  1. 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.

  1. Visual Studio Code'da terminale gidin.

  2. 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"
    
  3. dotnet-tools.json araç bildirim dosyasını ekleyin ve işleyin:

    git add .config/dotnet-tools.json
    git commit -m "Add code coverage"
    
  4. 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"
    
  5. 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.

  1. Azure Pipelines'da, adımların her biri aracılığıyla derlemeyi izleyin.

  2. 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.

    A screenshot of Azure Pipelines showing the Code Coverage tab, with code coverage report summary showing 7.7 percent line coverage.

    İ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.

  1. Yeni bir tarayıcı sekmesinde marketplace.visualstudio.com gidin.

  2. Azure DevOps sekmesinde kod kapsamını arayın.

  3. Kod Kapsamı Pencere Öğeleri'ne tıklayın (Shane Davis tarafından yayımlandı).

  4. Ücretsiz edinin'i seçin.

  5. Açılan listede Azure DevOps kuruluşunuzu seçin.

  6. Yükle'yi seçin.

  7. Azure DevOps'a geri dönün.

  8. Genel Bakış>Panoları'na gidin.

  9. Düzenle'yi seçin.

  10. Kod Kapsamı'na gidin ve Kod Kapsamı'na tıklayın.

    A screenshot of Visual Studio Marketplace showing the Code Coverage widget card.

  11. Kod Kapsamı'nı tuvale sürükleyin.

  12. Pencere öğesini yapılandırmak için Dişli simgesini seçin.

  13. 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
  14. Kaydet'i seçin.

  15. Düzenleme Bitti'yi seçin.

    Pencere öğesi, birim testlerinizin kapsay olduğu kodun yüzdesini gösterir.

    A screenshot of Azure DevOps Code Coverage widget showing 8 percent coverage of the sample project.

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/