Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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şturmak için Komutları.
Bir kabuk penceresi açın.
Aşağıdaki komutu çalıştırın:
dotnet new sln -o unit-testing-using-dotnet-testdotnet new slnkomutu, birim testi yapmak için dotnet test kullanan dizininde yeni bir çözüm oluşturur.Dizini unit-testing-using-dotnet-test klasörüne değiştirin.
Aşağıdaki komutu çalıştırın:
dotnet new classlib -o PrimeServicedotnet new classlibkomutu, PrimeService klasöründe yeni bir sınıf kitaplığı projesi oluşturur. Yeni sınıf kitaplığı test edilecek kodu içerir.Class1.csPrimeService.csolarak 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."); } } }Şu anda bu kod bir NotImplementedException oluşturur, ancak öğreticinin ilerleyen bölümlerinde yöntemini uygulayacaksınız.
unit-testing-using-dotnet-test dizininde aşağıdaki komutu çalıştırarak sınıf kitaplığı projesini çözüme ekleyin:
dotnet sln add ./PrimeService/PrimeService.csprojAşağıdaki komutu çalıştırarak PrimeService.Tests projesini oluşturun:
dotnet new xunit -o PrimeService.TestsYukarıdaki komut , PrimeService.Tests dizininde PrimeService.Tests projesini oluşturur. Test projesi, test kitaplığı olarak xUnit kullanır. Komut, proje dosyasına aşağıdaki
<PackageReference />öğeleri ekleyerek test çalıştırıcısını da yapılandırıyor:Microsoft.NET.Test.Sdkxunitxunit.runner.visualstudiocoverlet.collector
Aşağıdaki komutu çalıştırarak test projesini çözüm dosyasına ekleyin:
dotnet sln add ./PrimeService.Tests/PrimeService.Tests.csprojPrimeServicesınıf kitaplığını 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, dosyayı yeniden adlandırmak için ren komutunu ren işletim sistemi sürümüne güncelleştirin:
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.
IsPrime için bir test çağrısı başarısız oluyor. TDD ile başarısız olduğu bilinen bir test yazarsınız. Ardından test geçişini yapmak için hedef kodu güncelleştirirsiniz. Bu yaklaşımı tekrarlamaya, başarısız bir test yazmaya ve ardından hedef kodu geçmesi için güncellemeye 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 shouldn't be prime"); } } }
[Fact] özniteliği, test çalıştırıcısı tarafından çalıştırılan bir test yöntemini bildirir.
PrimeService.Tests klasöründen dotnet testçalıştırın.
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. Birim testi projesi kullanılarak dotnet test test çalıştırıcısı başlatılır.
IsPrime uygulanmadığından test başarısız olur. 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 shouldn't 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şler için değerleri 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 shouldn't 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");
}
Önceki kodda [Theory] ve [InlineData] ikiden küçük birkaç değerin test edilmesine olanak tanır. İki en küçük asal sayıdır.
Sınıf bildiriminden sonra ve [Theory] özniteliğinden önce aşağıdaki kodu ekleyin:
private readonly PrimeService _primeService;
public PrimeService_IsPrimeShould()
{
_primeService = new PrimeService();
}
dotnet testçalıştırın ve testlerden ikisi başarısız olur. Tüm testlerin başarılı olmasını sağlamak için IsPrime yöntemini aşağıdaki kodla güncelleştirin:
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ıneksiksiz uygulamasına bakın.
Tamamlanan IsPrime yöntem, ilkelliği test için verimli bir algoritma değildir.