Alıştırma - Uygulamanıza birim testleri ekleme

Tamamlandı

Bu ünitede, Microsoft Azure Pipelines ile oluşturduğumuz otomatik derlemeye birim testleri ekleyeceğiz. Regresyon hataları ekibinizin koduna giriyor ve puan tablosunun filtreleme işlevselliğini bozuyor. Özellikle, yanlış oyun modu görünmeye devam ediyor.

Aşağıdaki görüntüde sorun gösterilmektedir. Bir kullanıcı yalnızca bu oyun haritasındaki puanları göstermek için "Samanyolu" seçeneğini seçtiğinde, Andromeda gibi diğer oyun haritalarından sonuçlar alır.

A screenshot of the leaderboard showing incorrect results: Andromeda galaxy scores show in the Milky Way galaxy listing.

Ekip, test edenlere ulaşmadan önce hatayı yakalamak istiyor. Birim testleri, regresyon hatalarını otomatik olarak test etmenin harika bir yoludur.

Sürecin bu noktasındaki birim testlerinin eklenmesi, Space Game web uygulamasını geliştirirken takıma bir başlangıç yapacaktır. Uygulama, yüksek puanları ve oyuncu profillerini depolamak için bir belge veritabanı kullanır. Şu anda yerel test verilerini kullanıyor. Daha sonra uygulamayı canlı veritabanına bağlamayı planlıyorlar.

C# uygulamaları için birçok birim testi çerçevesi mevcuttur. Topluluk tarafından popüler olduğu için NUnit kullanacağız.

Üzerinde çalıştığınız birim testi şu şekildedir:

[TestCase("Milky Way")]
[TestCase("Andromeda")]
[TestCase("Pinwheel")]
[TestCase("NGC 1300")]
[TestCase("Messier 82")]
public void FetchOnlyRequestedGameRegion(string gameRegion)
{
    const int PAGE = 0; // take the first page of results
    const int MAX_RESULTS = 10; // sample up to 10 results

    // Form the query predicate.
    // This expression selects all scores for the provided game region.
    Expression<Func<Score, bool>> queryPredicate = score => (score.GameRegion == gameRegion);

    // Fetch the scores.
    Task<IEnumerable<Score>> scoresTask = _scoreRepository.GetItemsAsync(
        queryPredicate, // the predicate defined above
        score => 1, // we don't care about the order
        PAGE,
        MAX_RESULTS
    );
    IEnumerable<Score> scores = scoresTask.Result;

    // Verify that each score's game region matches the provided game region.
    Assert.That(scores, Is.All.Matches<Score>(score => score.GameRegion == gameRegion));
}

Puan tablosunu oyun türü ve oyun haritasının herhangi bir bileşimine göre filtreleyebilirsiniz.

Bu test, puan tablosunu yüksek puanlar için sorgular ve her sonucun sağlanan oyun haritasıyla eşleşip eşleşmediğini doğrular.

NUnit test yönteminde, TestCase bu yöntemi test etmek için kullanılacak satır içi veriler sağlar. Burada, NUnit birim test yöntemini aşağıdaki gibi çağırır FetchOnlyRequestedGameRegion :

FetchOnlyRequestedGameRegion("Milky Way");
FetchOnlyRequestedGameRegion("Andromeda");
FetchOnlyRequestedGameRegion("Pinwheel");
FetchOnlyRequestedGameRegion("NGC 1300");
FetchOnlyRequestedGameRegion("Messier 82");

Testin sonunda yöntemine Assert.That yapılan çağrıya dikkat edin. Onay , true olarak bildirdiğiniz bir koşul veya deyimdir. Koşul false olarak sonuçlanırsa bu, kodunuzda bir hata olduğunu gösterebilir. NUnit, belirttiğiniz satır içi verileri kullanarak her test yöntemini çalıştırır ve sonucu başarılı veya başarısız bir test olarak kaydeder.

Birçok birim testi çerçevesi, doğal dile benzeyen doğrulama yöntemleri sağlar. Bu yöntemler, testlerin okunmasını kolaylaştırmaya ve testleri uygulamanın gereksinimlerine eşlemenize yardımcı olur.

Bu örnekte yapılan onaylamayı göz önünde bulundurun:

Assert.That(scores, Is.All.Matches<Score>(score => score.GameRegion == gameRegion));

Bu satırı şu şekilde okuyabilirsiniz:

Döndürülen her puanın oyun bölgesinin sağlanan oyun bölgesiyle eşleşdiğini onaylar.

İzlenmesi gereken süreç şu şekildedir:

  1. GitHub deposundan birim testlerini içeren bir dal getirin.
  2. Geçtiklerini doğrulamak için testleri yerel olarak çalıştırın.
  3. Testleri çalıştırmak ve sonuçları toplamak için işlem hattı yapılandırmanıza görevler ekleyin.
  4. Dalını GitHub deponuza gönderin.
  5. Azure Pipelines projenizin uygulamayı otomatik olarak derlemesini ve testleri çalıştırmasını izleyin.

GitHub'dan dalı getirme

Burada gitHub'dan dalı unit-tests getirecek ve bu dala göz atacak veya bu dala geçeceksiniz.

Bu dal, önceki modüllerde birlikte çalıştığınız Space Game projesini ve başlangıç olarak bir Azure Pipelines yapılandırmasını içerir.

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

  2. Microsoft deposundan adlı unit-tests bir dalı getirmek için aşağıdaki git komutları çalıştırın ve ardından bu dala geçin.

    git fetch upstream unit-tests
    git checkout -B unit-tests upstream/unit-tests
    

    Bu komutun biçimi, Olarak bilinen upstreamMicrosoft GitHub deposundan başlangıç kodunu almanıza olanak tanır. Kısa bir süre sonra bu dalı Olarak originbilinen GitHub deponuza göndereceksiniz.

  3. İsteğe bağlı bir adım olarak Visual Studio Code'da azure-pipelines.yml dosyasını açın ve ilk yapılandırmayı öğrenin. Yapılandırma, Azure Pipelines ile derleme işlem hattı oluşturma modülünde oluşturduğunuz temel yapılandırmaya benzer. Yalnızca uygulamanın Sürüm yapılandırmasını derler.

Testleri yerel olarak çalıştırma

İşlem hattına herhangi bir test göndermeden önce tüm testleri yerel olarak çalıştırmak iyi bir fikirdir. Burada bunu yapacaksınız.

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

  2. Çözümdeki her projeyi oluşturmak için komutunu çalıştırın dotnet build .

    dotnet build --configuration Release
    
  3. Birim testlerini çalıştırmak için aşağıdaki dotnet test komutu çalıştırın:

    dotnet test --configuration Release --no-build
    

    --no-build bayrağı, projeyi çalıştırmadan önce derlememenizi belirtir. Projeyi önceki adımda oluşturduğunuz için oluşturmanız gerekmez.

    Beş testin de geçtiğini görmelisiniz.

    Starting test execution, please wait...
    A total of 1 test files matched the specified pattern.
    
    Passed!  - Failed:     0, Passed:     5, Skipped:     0, Total:     5, Duration: 57 ms
    

    Bu örnekte, testlerin çalıştırılması bir saniyeden az sürdü.

    Toplam beş test olduğuna dikkat edin. Yalnızca bir test yöntemi tanımlamış olsak da, FetchOnlyRequestedGameRegionbu test, satır içi verilerde TestCase belirtildiği gibi her oyun haritası için bir kez olmak üzere beş kez çalıştırılır.

  4. Testleri ikinci kez çalıştırın. Bu kez sonuçları bir günlük dosyasına yazma seçeneğini belirtin --logger .

    dotnet test Tailspin.SpaceGame.Web.Tests --configuration Release --no-build --logger trx
    

    Çıkışta TestResults dizininde bir TRX dosyasının oluşturulduğunu görürsünüz.

    TRX dosyası, test çalıştırmasının sonuçlarını içeren bir XML belgesidir. Visual Studio ve diğer araçlar sonuçları görselleştirmenize yardımcı olabileceğinden, test sonuçları için popüler bir biçimdir.

    Daha sonra Azure Pipelines'ın işlem hattında çalıştırılırken test sonuçlarınızı görselleştirmenize ve izlemenize nasıl yardımcı olabileceğini göreceksiniz.

    Dekont

    TRX dosyalarının kaynak denetimine dahil edilmesi amaçlanmamıştır. .gitignore dosyası, Git'in yoksaymasını istediğiniz geçici dosyaları ve diğer dosyaları belirtmenize olanak tanır. Projenin .gitignore dosyası Zaten TestResults dizinindeki herhangi bir şeyi yoksayacak şekilde ayarlanmış.

  5. İsteğe bağlı bir adım olarak, Visual Studio Code'da Tailspin.SpaceGame.Web.Tests klasöründen DocumentDBRepository_GetItemsAsyncShould.cs dosyasını açın ve test kodunu inceleyin. Özel olarak .NET uygulamaları oluşturmakla ilgilenmeseniz bile, diğer birim test çerçevelerinde görebileceğiniz koda benzediğinden test kodunu yararlı bulabilirsiniz.

İşlem hattı yapılandırmanıza görev ekleme

Burada derleme işlem hattını birim testlerinizi çalıştıracak ve sonuçları toplayacak şekilde yapılandıracaksınız.

  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: 'Run unit tests - $(buildConfiguration)'
      inputs:
        command: 'test'
        arguments: '--no-build --configuration $(buildConfiguration)'
        publishTestResults: true
        projects: '**/*.Tests.csproj'
    
    - 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 bu DotNetCoreCLI@2 derleme görevini tanıtır.

    - task: DotNetCoreCLI@2
      displayName: 'Run unit tests - $(buildConfiguration)'
      inputs:
        command: 'test'
        arguments: '--no-build --configuration $(buildConfiguration)'
        publishTestResults: true
        projects: '**/*.Tests.csproj'
    

    Bu derleme görevi komutunu çalıştırır dotnet test .

    Bu görevin testleri el ile çalıştırdığınızda --logger trx kullandığınız bağımsız değişkeni belirtmediğini görebilirsiniz. bağımsız publishTestResults değişkeni bunu sizin için ekler. Bu bağımsız değişken işlem hattına, yerleşik değişken aracılığıyla erişilebilen geçici bir dizine TRX dosyası oluşturmasını $(Agent.TempDirectory) söyler. Ayrıca görev sonuçlarını işlem hattında yayımlar.

    projects bağımsız değişkeni , "**/* ile eşleşen tüm C# projelerini belirtir. Tests.csproj." "**" bölümü tüm dizinlerle ve "*. Tests.csproj" bölümü, dosya adı ". Tests.csproj." Dal, unit-tests Tailspin.SpaceGame.Web.Tests.csproj adlı tek bir birim testi projesi içerir. Bir desen belirterek, derleme yapılandırmanızı değiştirmenize gerek kalmadan daha fazla test projesi çalıştırabilirsiniz.

Dalı GitHub'a gönderme

Burada değişikliklerinizi GitHub'a gönderecek ve işlem hattının çalıştığını göreceksiniz. Şu anda unit-tests dalında olduğunuzu hatırlayın.

  1. Tümleşik terminalde azure-pipelines.yml dosyasını dizine ekleyin, değişiklikleri işleyin ve dalı GitHub'a gönderin.

    git add azure-pipelines.yml
    git commit -m "Run and publish unit tests"
    git push origin unit-tests
    

Azure Pipelines'ın testleri çalıştırmasını izleyin

Burada testlerin işlem hattında çalıştığını ve ardından Microsoft Azure Test Planlarının sonuçlarını görselleştirdiğini görürsünüz. Azure Test Planları, uygulamalarınızı başarıyla test etmek için ihtiyacınız olan tüm araçları sağlar. El ile test planları oluşturup çalıştırabilir, otomatik testler oluşturabilir ve paydaşlardan geri bildirim toplayabilirsiniz.

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

    Birim testlerini çalıştır - Yayın görevinin, komut satırından el ile yaptığınız gibi birim testlerini çalıştırdığını görürsünüz.

    A screenshot of Azure Pipelines showing console output from running unit tests.

  2. İşlem hattı özetine geri dönün.

  3. Testler sekmesine gidin.

    Test çalıştırmasının özetini görürsünüz. Beş test de geçti.

    A screenshot of Azure Pipelines showing the Tests tab with 5 total tests run and 100 percent passing.

  4. Azure DevOps'ta Test Planları'nın ardından Çalıştırmalar'ı seçin.

    A screenshot of Azure DevOps navigation menu with Test Plans section and Runs tab highlighted.

    Az önce çalıştırdığınız test çalıştırmaları da dahil olmak üzere en son test çalıştırmalarını görürsünüz.

  5. En son test çalıştırmasına çift tıklayın.

    Sonuçların özetini görürsünüz.

    A screenshot of Azure DevOps test run results summary showing 5 passed tests.

    Bu örnekte, beş testin tümü başarılı oldu. Herhangi bir test başarısız olursa, daha fazla ayrıntı almak için derleme görevine gidebilirsiniz.

    Ayrıca, VISUAL Studio veya başka bir görselleştirme aracı aracılığıyla incelemek için TRX dosyasını indirebilirsiniz.

Yalnızca bir test eklemiş olmanıza rağmen, bu iyi bir başlangıçtır ve anında sorunu çözer. Artık ekibin daha fazla test ekleyip sürecini iyileştirdikçe bunları çalıştıracak bir yeri vardır.

Dalınızı main ile birleştirme

Gerçek dünyadaki bir senaryoda, sonuçlardan memnun kaldıysanız dalını unit-tests mainile birleştirebilirsiniz, ancak kısa olması açısından şimdilik bu işlemi atlayacağız.