MSTest ve .NET ile C# birim testi

Bu öğreticide, birim testi kavramlarını öğrenmek için adım adım örnek bir çözüm oluşturma etkileşimli bir deneyime geçilir. Önceden oluşturulmuş bir çözüm kullanarak öğreticiyi 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. ASP.NET Core projesini test ediyorsanız bkz . ASP.NET Core'da tü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 komutunu çalıştırarak dotnet new sln 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 komutunu çalıştırındotnet new classlib. Class1.cs PrimeService.cs olarak yeniden adlandırın. sınıfının başarısız bir uygulamasını PrimeService oluşturmak için dosyasındaki 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.");
        }
    }
}

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

dotnet sln add PrimeService/PrimeService.csproj

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 kullanarak dotnet new mstestyeni bir proje oluşturun. dotnet new komutu, test kitaplığı olarak MSTest kullanan bir test projesi oluşturur. Şablon, PrimeServiceTests.csproj dosyasında test çalıştırıcısını yapılandırıyor:

<ItemGroup>
  <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.7.1" />
  <PackageReference Include="MSTest.TestAdapter" Version="2.1.1" />
  <PackageReference Include="MSTest.TestFramework" Version="2.1.1" />
  <PackageReference Include="coverlet.collector" Version="1.3.0" />
</ItemGroup>

Test projesi, birim testleri oluşturmak ve çalıştırmak için başka paketler gerektirir. dotnet new önceki adımda MSTest SDK'sı, MSTest test çerçevesi, MSTest çalıştırıcısı ve kod kapsamı raporlaması için kapak eklendi.

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

dotnet add reference ../PrimeService/PrimeService.csproj

Dosyanın tamamını GitHub'daki örnek 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 geçin ve komutunu çalıştırındotnet sln add:

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

Bu dosyayı kaydedin ve testleri ve sınıf kitaplığını derlemek için yürüterek dotnet test 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.

Testiniz başarısız oluyor. Uygulamayı henüz oluşturmadınız. Sınıfında çalışan en basit kodu PrimeService 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 yeniden çalıştırındotnet test. komutu, dotnet test proje için PrimeService ve ardından proje için PrimeService.Tests bir derleme çalıştırır. Her iki projeyi de derledikten sonra bu tek testi çalıştırır. Geçti.

Daha fazla özellik ekleyin

Artık bir test geçişi yaptığınıza göre, daha fazla yazmanı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 yorucu 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. Bu girişlerin değerlerini belirtmek için DataRow özniteliğini kullanabilirsiniz.

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.cs yeni bir test yöntemi ekleyin:

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

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

komutunu çalıştırın dotnet testve bu testlerden ikisi başarısız olur. Tüm testlerin geçmesini sağlamak için PrimeService.cs dosyasında yöntemin IsPrime başındaki yan tümcesini değiştirinif:

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 ve kitaplığın tam uygulamasına sahipsiniz.

Bu kitaplık için küçük bir kitaplık ve bir dizi birim testi oluşturdunuz. Çözümü, yeni paket ve test ekleme işleminin normal iş akışının bir parçası olacak şekilde yapılandırdıysanız. Zamanınızın ve çabanızın çoğunu uygulamanın hedeflerini çözmeye yoğunlaştırmışsınız.

Ayrıca bkz.