Dotnet test ve xUnit kullanarak .NET'te C# birim testi

Bu öğreticide birim testi projesi ve kaynak kodu projesi içeren bir çözümün nasıl derlenmesi gösterilmektedir. Önceden oluşturulmuş bir çözümü kullanarak öğreticiyi izlemek için örnek kodu görüntüleyin veya indirin. İndirme yönergeleri için bkz . Örnekler ve Öğreticiler.

Çözümü oluşturma

Bu bölümde, kaynak ve test projelerini içeren bir çözüm oluşturulur. Tamamlanan çözüm aşağıdaki dizin yapısına sahiptir:

/unit-testing-using-dotnet-test
    unit-testing-using-dotnet-test.sln
    /PrimeService
        PrimeService.cs
        PrimeService.csproj
    /PrimeService.Tests
        PrimeService_IsPrimeShould.cs
        PrimeServiceTests.csproj

Aşağıdaki yönergeler test çözümünü oluşturma adımlarını sağlar. Bir adımda test çözümü oluşturma yönergeleri için bkz. Test çözümü oluşturma komutları.

  • Bir kabuk penceresi açın.

  • Şu komutu çalıştırın:

    dotnet new sln -o unit-testing-using-dotnet-test
    

    komutu unit-testing-using-dotnet-test dotnet new sln dizininde yeni bir çözüm oluşturur.

  • Dizini unit-testing-using-dotnet-test klasörüne değiştirin.

  • Şu komutu çalıştırın:

    dotnet new classlib -o PrimeService
    

    komutu, dotnet new classlib PrimeService klasöründe yeni bir sınıf kitaplığı projesi oluşturur. Yeni sınıf kitaplığı test edilecek kodu içerir.

  • Class1.cs PrimeService.cs olarak yeniden adlandırın.

  • PrimeService.cs içindeki kodu aşağıdaki kodla değiştirin:

    using System;
    
    namespace Prime.Services
    {
        public class PrimeService
        {
            public bool IsPrime(int candidate)
            {
                throw new NotImplementedException("Not implemented.");
            }
        }
    }
    
  • Yukarıdaki kod:

    • NotImplementedException Uygulanmadığını belirten bir iletiyle bir oluşturur.
    • Öğreticinin devamında güncelleştirilir.
  • Unit-testing-using-dotnet-test dizininde, çözüme sınıf kitaplığı projesini eklemek için aşağıdaki komutu çalıştırın:

    dotnet sln add ./PrimeService/PrimeService.csproj
    
  • Aşağıdaki komutu çalıştırarak PrimeService.Tests projesini oluşturun:

    dotnet new xunit -o PrimeService.Tests
    
  • Yukarıdaki komut:

    • PrimeService.Tests dizininde PrimeService.Tests projesini oluşturur. Test projesi, test kitaplığı olarak xUnit kullanır.
    • Proje dosyasına aşağıdaki <PackageReference />öğeleri ekleyerek test çalıştırıcısını yapılandırılır:
      • Microsoft.NET.Test.Sdk
      • xunit
      • xunit.runner.visualstudio
      • coverlet.collector
  • Aşağıdaki komutu çalıştırarak test projesini çözüm dosyasına ekleyin:

    dotnet sln add ./PrimeService.Tests/PrimeService.Tests.csproj
    
  • Sınıf kitaplığını PrimeService PrimeService.Tests projesine bağımlılık olarak ekleyin:

    dotnet add ./PrimeService.Tests/PrimeService.Tests.csproj reference ./PrimeService/PrimeService.csproj  
    

Çözümü oluşturmak için komutlar

Bu bölüm, önceki bölümdeki tüm komutları özetler. Önceki bölümdeki adımları tamamladıysanız bu bölümü atlayın.

Aşağıdaki komutlar bir Windows makinesinde test çözümünü oluşturur. macOS ve Unix için dosyasını yeniden adlandırmak için komutunu işletim sistemi sürümüne ren güncelleştirinren:

dotnet new sln -o unit-testing-using-dotnet-test
cd unit-testing-using-dotnet-test
dotnet new classlib -o PrimeService
ren .\PrimeService\Class1.cs PrimeService.cs
dotnet sln add ./PrimeService/PrimeService.csproj
dotnet new xunit -o PrimeService.Tests
dotnet add ./PrimeService.Tests/PrimeService.Tests.csproj reference ./PrimeService/PrimeService.csproj
dotnet sln add ./PrimeService.Tests/PrimeService.Tests.csproj

Önceki bölümde yer alan "PrimeService.cs içindeki kodu aşağıdaki kodla değiştirin" yönergelerini izleyin.

Test oluşturun

Test temelli geliştirmede (TDD) popüler bir yaklaşım, hedef kodu uygulamadan önce bir (başarısız) test yazmaktır. Bu öğreticide TDD yaklaşımı kullanılır. IsPrime yöntemi çağrılabilir, ancak uygulanmaz. Bir test çağrısı IsPrime başarısız oluyor. TDD ile başarısız olduğu bilinen bir test yazılır. Hedef kod test geçişi yapacak şekilde güncelleştirilir. Bu yaklaşımı yinelemeye, başarısız bir test yazmaya ve ardından hedef kodu geçirecek şekilde güncelleştirmeye devam edersiniz.

PrimeService.Tests projesini güncelleştirin:

  • PrimeService.Tests/UnitTest1.cs silin.
  • PrimeService.Tests/PrimeService_IsPrimeShould.cs dosyası oluşturun.
  • PrimeService_IsPrimeShould.cs içindeki kodu aşağıdaki kodla değiştirin:
using Xunit;
using Prime.Services;

namespace Prime.UnitTests.Services
{
    public class PrimeService_IsPrimeShould
    {
        [Fact]
        public void IsPrime_InputIs1_ReturnFalse()
        {
            var primeService = new PrimeService();
            bool result = primeService.IsPrime(1);

            Assert.False(result, "1 should not be prime");
        }
    }
}

özniteliği, [Fact] test çalıştırıcısı tarafından çalıştırılan bir test yöntemini bildirir. PrimeService.Tests klasöründen komutunu çalıştırındotnet test. dotnet test komutu hem projeleri oluşturur hem de testleri çalıştırır. xUnit test çalıştırıcısı, testleri çalıştırmak için program giriş noktasını içerir. dotnet test birim testi projesini kullanarak test çalıştırıcısını başlatır.

Henüz uygulanmadığından test başarısız oluyor IsPrime . TDD yaklaşımını kullanarak, bu testin geçmesi için yalnızca yeterli kod yazın. Aşağıdaki kodla güncelleştirin IsPrime :

public bool IsPrime(int candidate)
{
    if (candidate == 1)
    {
        return false;
    }
    throw new NotImplementedException("Not fully implemented.");
}

dotnet test'i çalıştırın. Test başarılı oldu.

Daha fazla test ekleme

0 ve -1 için asal sayı testleri ekleyin. Önceki adımda oluşturulan testi kopyalayabilir ve 0 ve -1 test etmek için aşağıdaki kodun kopyalarını yapabilirsiniz. Ama bunu yapma, çünkü daha iyi bir yol var.

var primeService = new PrimeService();
bool result = primeService.IsPrime(1);

Assert.False(result, "1 should not be prime");

Yalnızca bir parametre değiştiğinde test kodunun kopyalanması kod yineleme ve test blobu ile sonuçlanmaktadır. Aşağıdaki xUnit öznitelikleri benzer testlerden oluşan bir paket yazmaya olanak tanır:

  • [Theory] aynı kodu yürüten ancak farklı giriş bağımsız değişkenleri olan bir test paketini temsil eder.
  • [InlineData] özniteliği, bu girişlerin değerlerini belirtir.

Yeni testler oluşturmak yerine, tek bir teori oluşturmak için önceki xUnit özniteliklerini uygulayın. Aşağıdaki kodu değiştirin:

[Fact]
public void IsPrime_InputIs1_ReturnFalse()
{
    var primeService = new PrimeService();
    bool result = primeService.IsPrime(1);

    Assert.False(result, "1 should not be prime");
}

aşağıdaki kodla:

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

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

Yukarıdaki kodda [Theory] ve [InlineData] ikiden küçük birkaç değerin testini etkinleştirin. İki en küçük asal sayıdır.

Sınıf bildiriminden sonra ve özniteliğinden [Theory] önce aşağıdaki kodu ekleyin:

private readonly PrimeService _primeService;

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

komutunu çalıştırın dotnet testve testlerden ikisi başarısız olur. Tüm testlerin başarılı olmasını sağlamak için yöntemini aşağıdaki kodla güncelleştirin IsPrime :

public bool IsPrime(int candidate)
{
    if (candidate < 2)
    {
        return false;
    }
    throw new NotImplementedException("Not fully implemented.");
}

TDD yaklaşımını izleyerek daha fazla başarısız test ekleyin ve ardından hedef kodu güncelleştirin. Testlerin tamamlanmış sürümüne ve kitaplığın tam uygulamasına bakın.

Tamamlanan IsPrime yöntem, ilkelliği test etme açısından verimli bir algoritma değildir.

Ek kaynaklar