MSTest ve .NET Ile birim testi C#

Bu öğreticide, birim testi kavramlarını öğrenmek için bir örnek çözüm oluşturma adım adım yönergeler sunarak etkileşimli bir deneyim sağlanır. Ö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 projesini test etmekle ilgilidir. Bir ASP.NET Core projesini test ediyorsanız, ASP.NET Core'daki Tümleştirme testlerinebakın.

Önkoşullar

Kaynak projeyi oluşturma

Bir kabuk penceresi açın. Çözümü tutmak için- Testing-testusing adlı bir dizin oluşturun. Bu yeni dizin içinde, dotnet new sln sınıf kitaplığı ve test projesi için yeni bir çözüm dosyası oluşturmak üzere öğesini çalıştırın. Bir Primeservice dizini oluşturun. Aşağıdaki ana hat, şu ana kadar dizin ve dosya yapısını gösterir:

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

Kaynak projeyi oluşturmak için Primeservice 'i geçerli dizin yapın ve çalıştırın dotnet new classlib . Class1. cs ' i primeservice. cs olarak yeniden adlandırın. Sınıfın hatalı bir uygulamasını oluşturmak için dosyadaki kodu aşağıdaki kodla değiştirin PrimeService :

using System;

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

Dizini Unit-Testing-MSTest dizinine doğru değiştirin. dotnet sln addÇözüm için sınıf kitaplığı projesini eklemek üzere Çalıştır:

dotnet sln add PrimeService/PrimeService.csproj

Test projesi 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. test dizinini geçerli dizini yapın ve kullanarak yeni bir proje oluşturun dotnet new mstest . 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ır:

<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 testlerini oluşturmak ve çalıştırmak için diğer paketlerin kullanılmasını gerektirir. dotnet new önceki adımda, MSTest SDK, MSTest test çerçevesi, MSTest Çalıştırıcısı ve kod kapsamı raporlamaya yönelik kapak Let 'i eklenmiştir.

PrimeServiceSınıf kitaplığını projeye başka bir bağımlılık olarak ekleyin. Şu dotnet add reference komutu kullanın:

dotnet add reference ../PrimeService/PrimeService.csproj

GitHub üzerindeki örnek deposunda dosyanın tamamını görebilirsiniz.

Aşağıdaki ana hat, son çözüm yerleşimini göstermektedir:

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

Birim-test-MSTest dizinine geçin ve şunu çalıştırın dotnet sln add :

dotnet sln add .\PrimeService.Tests\PrimeService.Tests.csproj

İlk testi oluşturma

Başarısız bir test yazın, geçiş yapın ve işlemi tekrarlayın. UnitTest1. cs ' i primeservice. Tests dizininden 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 testlerini içeren bir sınıfı gösterir. TestMethod özniteliği bir yöntemin test yöntemi olduğunu gösterir.

dotnet testTestleri ve sınıf kitaplığını derlemek ve ardından testleri çalıştırmak için bu dosyayı kaydedin ve yürütü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 test projesini kullanarak Test Çalıştırıcısı başlatır.

Testiniz başarısız oluyor. Uygulamayı henüz oluşturmadınız. Bu test geçişini, çalıştıran sınıfa en basit kodu yazarak yapın PrimeService :

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

Birim-test-using-MSTest dizininde dotnet test yeniden çalıştırın. dotnet testKomutu, proje için bir yapı PrimeService ve ardından proje için çalışır PrimeService.Tests . Her iki proje de oluşturulduktan sonra bu tek testi çalıştırır. Geçirir.

Daha fazla özellik ekleyin

Artık bir test geçişi yapmış olduğunuza göre daha fazla yazma zamanı vardır. Asal sayıların diğer birkaç basit durumu vardır: 0,-1. TestMethod özniteliğiyleyeni testler ekleyebilirsiniz, ancak bu hızlı bir şekilde sıkıcı hale gelir. Benzer testlerin bir paketini yazmanızı sağlayan başka bir MSTest özniteliği vardır. Test yöntemi aynı kodu yürütebilir, ancak farklı giriş bağımsız değişkenlerine sahip olabilir. Bu girişlerin değerlerini belirtmek için DataRow özniteliğini kullanabilirsiniz.

Yeni test 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 iki değerden küçük birkaç değeri sınayan bir yöntemdir. PrimeService_IsPrimeShould. cs' ye 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");
}

Çalıştır dotnet test ve bu testlerin ikisi de başarısız olur. Tüm testlerin geçişini yapmak için, if IsPrime primeservice. cs dosyasındaki yönteminin başındaki yan tümceyi değiştirin:

if (candidate < 2)

Ana kitaplıkta daha fazla test, daha fazla yer ve daha fazla kod ekleyerek yinelemek için devam edin. Testlerin tamamlanmış sürümüne ve kitaplığın tüm uygulamasınasahipsiniz.

Bu kitaplık için küçük bir kitaplık ve birim testleri kümesi oluşturdunuz. Çözümü, yeni paket ve test eklemek normal iş akışının bir parçası olacak şekilde öğrendiniz. Uygulamanın hedeflerini çözme konusunda zaman ve çaba harcamanızı en iyi şekilde gördünüz.

Ayrıca bkz.