C# ve MSTest kullanmaya başlama

Bu öğretici, birim testi kavramlarını öğrenmek için adım adım örnek bir çözüm oluştururken sizi etkileşimli bir deneyime götürür. Öğreticiyi önceden oluşturulmuş bir çözüm kullanarak izlemeyi tercih ediyorsanız, başlamadan önce örnek kodu görüntüleyin veya indirin. İndirme yönergeleri için bkz. Örnekler ve Öğreticiler.

Bu makale bir .NET Core projelerini test etme hakkındadır. bir ASP.NET Core projesini test ediyorsanız bkz. ASP.NET CoreTümleştirme testleri.

Önkoşullar

Kaynak projeyi oluşturma

Bir kabuk penceresi açın. Çözümü tutmak için unit-testing-using-mstest adlı bir dizin oluşturun. Bu yeni dizinin içinde dotnet new sln çalıştırarak sınıf kitaplığı ve test projesi için yeni bir çözüm dosyası oluşturun. PrimeService dizini oluşturun. Aşağıdaki ana hat, şu ana kadarki dizin ve dosya yapısını gösterir:

/unit-testing-using-mstest
    unit-testing-using-mstest.sln
    /PrimeService

PrimeService'i geçerli dizin yapın ve kaynak projeyi oluşturmak için dotnet new classlib çalıştırın.

Dizini yeniden unit-testing-using-mstest dizinine geri değiştirin. Çözüme sınıf kitaplığı projesini eklemek için dotnet sln add çalıştırın:

dotnet sln add PrimeService/PrimeService.csproj

Class1.cs dizinindeki PrimeService.cs öğesini PrimeService olarak yeniden adlandırın. PrimeService sınıfının başarısız bir uygulamasını oluşturmak için dosyadaki kodu aşağıdaki kodla değiştirin:

using System;

namespace Prime.Services
{
    public class PrimeService
    {
        public bool IsPrime(int candidate)
        {
            throw new NotImplementedException("Please create a test first.");
        }
    }
}

Test projesini oluşturma

PrimeService.Tests dizinini oluşturun. Aşağıdaki ana hat dizin yapısını gösterir:

/unit-testing-using-mstest
    unit-testing-using-mstest.sln
    /PrimeService
        Source Files
        PrimeService.csproj
    /PrimeService.Tests

PrimeService.Tests dizinini geçerli dizin yapın ve dotnet new mstestkullanarak yeni bir proje oluşturun. dotnet new komutu, test kitaplığı olarak MSTest kullanan bir test projesi oluşturur. Şablon, test çalıştırıcısını PrimeServiceTests.csproj dosyasında yapılandırıyor:

<ItemGroup>
  <PackageReference Include="MSTest" Version="4.1.0" />
</ItemGroup>

Note

Gösterilen paket sürümleri örnek olarak verilmiştir. dotnet new mstest tarafından oluşturulan sürümler .NET SDK'nıza bağlıdır. Şablonlar ve indirilen örnekler en son NuGet paketi sürümlerini kullanmayabilir.

Testlerinizi oluşturduktan ve çalıştırdıktan sonra güncelleştirmeleri denetlemek için test projesi dizininden dotnet package list --outdated komutunu çalıştırın. dotnet package add <PACKAGE_NAME> bir paket başvurusunu en son uyumlu kararlı sürüme güncelleştirmek için kullanın. Güncelleştirmeden önce uyumluluğu bozan değişiklikler için sürüm notlarını gözden geçirin ve daha sonra dotnet test öğesini yeniden çalıştırın.

.NET 9 SDK veya önceki bir sürüm kullanıyorsanız, bunun yerine dotnet list package --outdated ve dotnet add package <PACKAGE_NAME> kullanın.

Test projesi, birim testleri oluşturmak ve çalıştırmak için başka paketler gerektirir. Önceki adım olan dotnet new, kod kapsamı raporlaması için gerekli MSTest paketlerini ve araçlarını ekledi.

PrimeService sınıf kitaplığını projeye başka bir bağımlılık olarak ekleyin. dotnet reference add komutunu kullanın:

dotnet reference add ../PrimeService/PrimeService.csproj

Dosyanın tamamını GitHub'daki örnekleri deposunda görebilirsiniz.

Aşağıdaki ana hat, son çözüm düzenini gösterir:

/unit-testing-using-mstest
    unit-testing-using-mstest.sln
    /PrimeService
        Source Files
        PrimeService.csproj
    /PrimeService.Tests
        Test Source Files
        PrimeServiceTests.csproj

unit-testing-using-mstest dizinine gidin ve dotnet sln addkomutunu çalıştırın:

dotnet sln add ./PrimeService.Tests/PrimeService.Tests.csproj

İlk testi oluşturma

Başarısız bir test yazın, geçirmesini sağlayın ve işlemi tekrarlayın. PrimeService.Tests dizininden UnitTest1.cs kaldırın ve aşağıdaki içeriğe sahip PrimeService_IsPrimeShould.cs adlı yeni bir C# dosyası oluşturun:

using Microsoft.VisualStudio.TestTools.UnitTesting;
using Prime.Services;

namespace Prime.UnitTests.Services
{
    [TestClass]
    public class PrimeService_IsPrimeShould
    {
        private readonly PrimeService _primeService;

        public PrimeService_IsPrimeShould()
        {
            _primeService = new PrimeService();
        }

        [TestMethod]
        public void IsPrime_InputIs1_ReturnFalse()
        {
            bool result = _primeService.IsPrime(1);

            Assert.IsFalse(result, "1 shouldn't be prime");
        }
    }
}

TestClass özniteliği birim testleri içeren bir sınıfı belirtir. TestMethod özniteliği bir yöntemin bir test yöntemi olduğunu gösterir.

MSTest, her test için test sınıfının yeni bir örneğini oluşturur, bu nedenle oluşturucu her test için ayrı bir PrimeService oluşturur. Oluşturucu yalnızca bu sınıftaki her test için gereken kurulumu içerir. Testlerinizin farklı bir kuruluma ihtiyacı varsa, test yöntemlerinde nesneler oluşturun veya bu yöntemlerden yardımcı yöntemleri çağırın. Yönergeler için bkz. Kurulum ve Teardown yerine yardımcı yöntemleri kullanma.

Bu dosyayı kaydedin ve testleri ve sınıf kitaplığını oluşturmak için dotnet test yürüterek testleri çalıştırın. MSTest test çalıştırıcısı, testlerinizi çalıştırmak için program giriş noktasını içerir. dotnet test oluşturduğunuz birim testi projesini kullanarak test çalıştırıcısını başlatır.

Uygulamayı henüz oluşturmadığınız için testiniz başarısız oluyor. Çalışan PrimeService sınıfında en basit kodu yazarak bu testi geçirin:

public bool IsPrime(int candidate)
{
    if (candidate == 1)
    {
        return false;
    }
    throw new NotImplementedException("Please create a test first.");
}

unit-testing-using-mstest dizininde dotnet test yeniden çalıştırın. dotnet test komutu, PrimeService projesi ve ardından PrimeService.Tests projesi için bir derleme çalıştırır. Her iki projeyi de derledikten sonra bu tek testi çalıştırır. Geçiyor.

Daha fazla özellik ekleme

Bir test geçişi yaptığınıza göre, şimdi daha fazla yazmaya başlamanın zamanı geldi. Asal sayılar için birkaç basit durum daha vardır: 0, -1. TestMethod özniteliğiyle yeni testler ekleyebilirsiniz, ancak bu hızlı bir şekilde sıkıcı hale gelir. Benzer testlerden oluşan bir paket yazmanızı sağlayan başka MSTest öznitelikleri de vardır. Bir test yöntemi aynı kodu yürütebilir, ancak farklı giriş bağımsız değişkenlerine sahiptir. DataRow özniteliğini kullanarak bu girişlerin değerlerini belirtebilirsiniz.

Yeni testler oluşturmak yerine, tek bir veri temelli test oluşturmak için bu iki özniteliği uygulayın. Veri temelli test, en düşük asal sayı olan ikiden küçük birkaç değeri test eden bir yöntemdir. PrimeService_IsPrimeShould.csiçine yeni bir test yöntemi ekleyin:

[TestMethod]
[DataRow(-1)]
[DataRow(0)]
[DataRow(1)]
public void IsPrime_ValuesLessThan2_ReturnFalse(int value)
{
    bool result = _primeService.IsPrime(value);

    Assert.IsFalse(result, $"{value} should not be prime");
}

dotnet testçalıştırın ve bu testlerden ikisi başarısız olur. Tüm testlerin geçmesini sağlamak için, if dosyasındaki IsPrime yönteminin başındaki yan tümcesini değiştirin:

if (candidate < 2)

Ana kitaplığa daha fazla test, daha fazla teori ve daha fazla kod ekleyerek yinelemeye devam edin. testlerin tamamlanmış sürümüne vekitaplığının tam uygulamasına sahipsiniz.

Küçük bir kitaplık ve bu kitaplık için birim testleri kümesi oluşturdunuz. Çözümü, yeni paketlerin ve testlerin eklenmesinin normal iş akışının bir parçası olması için yapılandırmışsınız. Zamanınızın ve çabanızın çoğunu uygulamanın hedeflerini çözmeye yoğunlaştırmıştınız.

testleri Azure Pipelines'da çalıştırma

Değişiklikleri gönderdiğinizde testlerinizi otomatik olarak çalıştırmak için, tamamlanmış çözümünüzü içeren depoya bir Azure Pipelines yapılandırması ekleyin. Bir Azure DevOps projesine ve Microsoft tarafından barındırılan bir aracıya erişmeniz gerekir. Önkoşullar için bkz. İlk pipeline'ınızı oluşturma.

  1. Reponuzun kök dizininde, aşağıdaki içeriğe sahip bir azure-pipelines.yml dosyası oluşturun. Örnek, PrimeService.Tests ve PrimeService dizinlerinin depo kökünde olduğunu ve her iki projenin de .NET 10'u hedeflediğini varsayar.

    trigger:
    - main
    
    pool:
      vmImage: ubuntu-latest
    
    steps:
    - task: UseDotNet@2
      displayName: Install .NET SDK
      inputs:
        packageType: sdk
        version: 10.0.x
    
    - task: DotNetCoreCLI@2
      displayName: Run MSTest tests
      inputs:
        command: test
        projects: PrimeService.Tests/PrimeService.Tests.csproj
        arguments: --configuration Release
        publishTestResults: true
    
  2. Yapılandırmayı deponuzla eşleşecek şekilde ayarlayın:

    • Dalınızın farklı bir adı varsa, main içindeki trigger öğesini bu dal adıyla değiştirin.
    • Çözümünüz bir alt dizindeyse, projects öğesini depo köküne göre test projesinin yoluyla güncelleştirin.
    • Projeleriniz farklı bir .NET sürümünü hedefliyorsa, version görevindeki UseDotNet@2 öğesini eşleşecek şekilde değiştirin. Örneğin, 8.0.x hedefleyen projeler için net8.0 kullanın. Deponuz bir global.json dosya içeriyorsa, yüklü SDK'nın sürüm gereksinimlerini karşıladığından emin olun.
  3. Çözümünüzü ve azure-pipelines.yml dosyanızı commit edip Git deponuza gönderin.

  4. Azure DevOps projenizde İşlem Hatları>Yeni işlem hattı seçeneğini veya bu ilk işlem hattınızsa İşlem hattı oluştur seçin. Depo sağlayıcınızı ve deponuzu seçin.

  5. İşlem hattınızı yapılandırın sayfasında Var olan Azure Pipelines YAML dosyası'nı seçin, dalı ve /azure-pipelines.yml öğesini seçin ve ardından Devam'ı seçin. Yapılandırmayı gözden geçirin ve Run seçin.

UseDotNet@2görevi .NET SDK'sını yükler. DotNetCoreCLI@2 görev, dotnet test komutunu çalıştırır; bu komut bağımlılıkları geri yükler, test projesini ve başvurulan kitaplığı oluşturur ve testleri Yayın yapılandırmasında çalıştırır.

publishTestResults: true ile görev, bir TRX sonuç dosyası oluşturur ve bir test başarısız olsa bile sonuçları yayımlar. Çalıştırmadan sonra, geçirilen ve başarısız testleri gözden geçirmek için işlem hattı çalıştırmasının Testler sekmesini açın. Başarısız bir test, test görevinin ve işlem hattının başarısız olmasına da neden olur.

Note

Bu örnek, .NET 10 SDK ile dotnet new mstest içindeki varsayılan VSTest yapılandırmasını kullanır. Microsoft.Testing.Platform (MTP)'yi etkinleştirirseniz, gerekli çalıştırıcı yapılandırması için MTP testlerini sürekli tümleştirmede çalıştırma bölümüne bakın.

Ayrıca bkz.