Alıştırma - Uygulamanıza birim testleri ekleme
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.
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:
- GitHub deposundan birim testlerini içeren bir dal getirin.
- Geçtiklerini doğrulamak için testleri yerel olarak çalıştırın.
- Testleri çalıştırmak ve sonuçları toplamak için işlem hattı yapılandırmanıza görevler ekleyin.
- Dalını GitHub deponuza gönderin.
- 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.
Visual Studio Code'da tümleşik terminali açın.
Microsoft deposundan adlı
unit-tests
bir dalı getirmek için aşağıdakigit
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
upstream
Microsoft GitHub deposundan başlangıç kodunu almanıza olanak tanır. Kısa bir süre sonra bu dalı Olarakorigin
bilinen GitHub deponuza göndereceksiniz.İ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.
Visual Studio Code'da tümleşik terminali açın.
Çözümdeki her projeyi oluşturmak için komutunu çalıştırın
dotnet build
.dotnet build --configuration Release
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,
FetchOnlyRequestedGameRegion
bu test, satır içi verilerdeTestCase
belirtildiği gibi her oyun haritası için bir kez olmak üzere beş kez çalıştırılır.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ış.
İ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.
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ızpublishTestResults
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.
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.
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.
İşlem hattı özetine geri dönün.
Testler sekmesine gidin.
Test çalıştırmasının özetini görürsünüz. Beş test de geçti.
Azure DevOps'ta Test Planları'nın ardından Çalıştırmalar'ı seçin.
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.
En son test çalıştırmasına çift tıklayın.
Sonuçların özetini görürsünüz.
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
main
ile birleştirebilirsiniz, ancak kısa olması açısından şimdilik bu işlemi atlayacağız.