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:

    Not

    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 runReportGenerator 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 sağ tıklayın ve ardından Dosya Gezgini Göster (macOS'ta Bulucu'da Göster veya Linux'ta Kapsanan Klasörü Aç) seçeneğini belirleyin.

  8. Windows Gezgini'nde (macOS'ta Bulucu) index.htm çift tıklayarak web tarayıcısında açın.

    Kapsam raporu özetini görürsünüz.

    Yüzde 7,7 satır kapsamını gösteren yerel kod kapsamı rapor özetinin ekran görüntüsü.

  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.

    Tailspin.SpaceGame.Web kodunda bulunan sınıflar genelinde kapsam istatistiklerini gösteren yerel kapsam raporu sınıf özetinin ekran görüntüsü.

  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.

    Biri tüm kod çizgileri yeşil (kapsanan) ve biri kırmızı (kapsanmayan) olmak üzere iki C# yöntemi için birim testi kapsamının görsel gösterimini içeren yerel sınıf kapsamı ayrıntılarının ekran görüntüsü.

    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çin DocumentDBRepository_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ı code-coverage temel alan adlı unit-testsbir 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 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 Görünen ad Açıklama
    DotNetCoreCLI@2 Yerel bildirimden .NET araçlarını yükleme Bildirim dosyasında listelenen araçları yükler dotnet-tools.json
    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 coverlet.msbuild 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. Araç bildirim dosyasını ekleyin ve işleyin dotnet-tools.json:

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

    Kod Kapsamı sekmesini gösteren ve yüzde 7,7 satır kapsamını gösteren kod kapsamı rapor özetiyle birlikte Azure Pipelines'ın ekran görüntüsü.

    İ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ış>gidin.

  9. Düzenle'yi seçin.

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

    Kod Kapsamı pencere öğesi kartını gösteren Visual Studio Market'in ekran görüntüsü.

  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.

    Örnek projenin yüzde 8 kapsamını gösteren Azure DevOps Kod Kapsamı pencere öğesinin ekran görüntüsü.

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/