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.
Önemli
Bu makalede örnek projenin oluşturulması açıklanmaktadır. Zaten bir projeniz varsa Kod kapsamı araçları bölümüne atlayabilirsiniz.
Birim testleri, işlevselliğin sağlanmasına yardımcı olur ve yeniden düzenleme çalışmaları için bir doğrulama aracı sağlar. Kod kapsamı, satırlar, dallar veya yöntemler gibi birim testleri tarafından çalıştırılan kod miktarının ölçümüdür. Örneğin, yalnızca iki koşullu kod dalı (dal a ve b dalı) içeren basit bir uygulamanız varsa, koşullu dalı doğrulayan birim testi a , %50'lik dal kodu kapsamını bildirir.
Bu makalede, ReportGenerator kullanılarak Coverlet ve rapor oluşturma ile birim testi için kod kapsamının kullanımı ele alınmaktadır. Bu makale, test çerçevesi olarak C# ve xUnit'e odaklansa da, hem MSTest hem de NUnit de çalışır. Coverlet, GitHub'da C# için platformlar arası kod kapsamı çerçevesi sağlayan açık kaynak bir projedir. Coverlet, .NET Foundation'ın bir parçasıdır. Coverlet, rapor oluşturma için kullanılan Cobertura kapsam testi çalıştırma verilerini toplar.
Ayrıca, bu makalede bir Coverlet test çalıştırmasından toplanan kod kapsamı bilgilerinin rapor oluşturmak için nasıl kullanılacağı ayrıntılı olarak anlatılır. Rapor oluşturma işlemi GitHub - ReportGenerator'da başka bir açık kaynak projesi kullanılarak mümkündür. ReportGenerator, Cobertura tarafından oluşturulan kapsam raporlarını birçok farklı biçimde insan tarafından okunabilir raporlara dönüştürür.
Bu makale, örnek tarayıcısında bulunan örnek kaynak kodu projesini temel alır.
Test altındaki sistem
"Test altındaki sistem", birim testleri yazdığınız kodu ifade eder; bu bir nesne, hizmet veya test edilebilir işlevselliği kullanıma sunan başka bir şey olabilir. Bu makalede, test altındaki sistem olan bir sınıf kitaplığı ve buna karşılık gelen iki birim testi projesi oluşturacaksınız.
Sınıf kitaplığı oluşturma
Yeni bir dizin UnitTestingCodeCoverage oluşturun ve ardından bu dizindeki komut isteminde dotnet new classlib komutunu kullanarak yeni bir .NET standart sınıf kitaplığı oluşturun.
dotnet new classlib -n Numbers
Aşağıdaki kod parçacığı, bir sayıyla asal olup olmadığını denetlemek için işlevsellik sağlayan basit PrimeService bir sınıf tanımlar. Aşağıdaki kod parçacığını kopyalayın ve Numbers dizininde otomatik olarak oluşturulan Class1.cs dosyasının içeriğini değiştirin.
Class1.cs dosyasını PrimeService.cs olarak yeniden adlandırın.
namespace System.Numbers
{
public class PrimeService
{
public bool IsPrime(int candidate)
{
if (candidate < 2)
{
return false;
}
for (int divisor = 2; divisor <= Math.Sqrt(candidate); ++divisor)
{
if (candidate % divisor == 0)
{
return false;
}
}
return true;
}
}
}
İpucu
Numbers sınıf kitaplığının System ad alanına kasıtlı olarak eklendiğini belirtmek gerekir. Bu, System.Math ad alanı bildirimi olmadan erişilebilir olmasını sağlar. Daha fazla bilgi için bkz. ad alanı (C# Başvurusu).
Test projeleri oluşturma
komutunu kullanarak aynı komut isteminden iki yeni dotnet new xunit şablonu oluşturun:
dotnet new xunit -n XUnit.Coverlet.Collector
dotnet new xunit -n XUnit.Coverlet.MSBuild
Yeni oluşturulan her iki xUnit test projesinin de Numbers sınıf kitaplığına bir proje referansı eklemesi gerekir. Bu, test projelerinin test için PrimeService'e erişmesini sağlar. Komut isteminden dotnet add komutunu kullanın:
dotnet add XUnit.Coverlet.Collector\XUnit.Coverlet.Collector.csproj reference Numbers\Numbers.csproj
dotnet add XUnit.Coverlet.MSBuild\XUnit.Coverlet.MSBuild.csproj reference Numbers\Numbers.csproj
MSBuild projesi, coverlet.msbuild NuGet paketine bağlı olacağı için uygun şekilde adlandırılır. komutunu çalıştırarak bu paket bağımlılığını dotnet package add ekleyin. (.NET 9 veya önceki bir SDK sürümü kullanıyorsanız, bunun yerine formu kullanın dotnet add package .)
cd XUnit.Coverlet.MSBuild && dotnet package add coverlet.msbuild && cd ..
Önceki komut, MSBuild test projesinin kapsamını etkili bir şekilde belirleyerek dizinleri değiştirip NuGet paketini eklemiştir. Bu işlem tamamlandığında dizinleri değiştirerek bir düzey yukarı çıktı.
her iki UnitTest1.cs dosyasını da açın ve içeriğini aşağıdaki kod parçacığıyla değiştirin. UnitTest1.cs dosyalarını PrimeServiceTests.cs olarak yeniden adlandırın.
using System.Numbers;
using Xunit;
namespace XUnit.Coverlet
{
public class PrimeServiceTests
{
readonly PrimeService _primeService;
public PrimeServiceTests() => _primeService = new PrimeService();
[Theory]
[InlineData(-1), InlineData(0), InlineData(1)]
public void IsPrime_ValuesLessThan2_ReturnFalse(int value) =>
Assert.False(_primeService.IsPrime(value), $"{value} shouldn't be prime");
[Theory]
[InlineData(2), InlineData(3), InlineData(5), InlineData(7)]
public void IsPrime_PrimesLessThan10_ReturnTrue(int value) =>
Assert.True(_primeService.IsPrime(value), $"{value} should be prime");
[Theory]
[InlineData(4), InlineData(6), InlineData(8), InlineData(9)]
public void IsPrime_NonPrimesLessThan10_ReturnFalse(int value) =>
Assert.False(_primeService.IsPrime(value), $"{value} shouldn't be prime");
}
}
Çözüm oluşturma
Komut isteminden sınıf kitaplığını ve iki test projesini kapsüllemek için yeni bir çözüm oluşturun.
dotnet sln Komutunu kullanarak:
dotnet new sln -n XUnit.Coverage
Bu, XUnit.Coverage dizininde yeni bir çözüm dosyası adı oluşturur. Projeleri çözümün köküne ekleyin.
dotnet sln XUnit.Coverage.sln add **/*.csproj --in-root
Şu komutu kullanarak çözümü derleyin dotnet build :
dotnet build
Derleme başarılı olursa, üç projeyi oluşturmuş, projeleri ve paketleri uygun şekilde referans almış ve kaynak kodunu doğru güncellemişsiniz demektir. Tebrikler!
Kod kapsamı araçları
İki tür kod kapsamı aracı vardır:
- DataCollectors: DataCollectors, test yürütmeyi izler ve test çalıştırmaları hakkında bilgi toplar. Toplanan bilgileri XML ve JSON gibi çeşitli çıkış biçimlerinde bildirirler. Daha fazla bilgi için ilk DataCollector'ınız bölümüne bakın.
- Rapor oluşturucuları: Genellikle stillenmiş HTML olarak rapor oluşturmak için test çalıştırmalarından toplanan verileri kullanın.
Bu bölümde, odak veri toplayıcı araçlarıdır.
.NET, Visual Studio'da da kullanılabilen yerleşik bir kod kapsamı veri toplayıcısı içerir. Bu veri toplayıcı, Visual Studio'da rapor oluşturmak için kullanılabilecek bir ikili .coverage dosyası oluşturur. İkili dosya insan tarafından okunabilir değildir ve Visual Studio dışında rapor oluşturmak için kullanılabilmesi için önce insan tarafından okunabilir bir biçime dönüştürülmesi gerekir.
İpucu
Araç dotnet-coverage , ikili kapsam test sonuçları dosyasını insan tarafından okunabilir bir biçime dönüştürmek için kullanılabilecek platformlar arası bir araçtır. Daha fazla bilgi için bkz . dotnet-coverage.
Coverlet , yerleşik toplayıcıya açık kaynak bir alternatiftir. Test sonuçlarını insan tarafından okunabilen Cobertura XML dosyaları olarak oluşturur ve daha sonra HTML raporları oluşturmak için kullanılabilir. Kod kapsamı için Coverlet kullanmak için, mevcut bir birim testi projesinin uygun paket bağımlılıklarına sahip olması veya alternatif olarak .NET genel araçlarına ve buna karşılık gelen coverlet.console NuGet paketine güvenmesi gerekir.
.NET testiyle tümleştirme
xUnit test projesi şablonu varsayılan olarak coverlet.collector ile zaten tümleştirilmiştir. Komut isteminden, dizinleri XUnit.Coverlet.Collector projesine
cd XUnit.Coverlet.Collector && dotnet test --collect:"XPlat Code Coverage"
Not
"XPlat Code Coverage" Bağımsız değişken, Coverlet'teki veri toplayıcılarına karşılık gelen kullanıcı dostu bir addır. Bu isim gereklidir ancak büyük/küçük harfe duyarlı değildir. kullanmak için. NET'in yerleşik Kod Kapsamı veri toplayıcısını kullanın "Code Coverage".
Çalıştırmanın dotnet test bir parçası olarak, TestResults dizinine sonuçta elde edilen bir coverage.cobertura.xml dosyası oluşturulur. XML dosyası sonuçları içerir. Bu, .NET CLI'yı kullanan platformlar arası bir seçenektir ve MSBuild'in kullanılamadığı derleme sistemleri için idealdir.
Aşağıda örnek coverage.cobertura.xml dosyası verilmiştir.
<?xml version="1.0" encoding="utf-8"?>
<coverage line-rate="1" branch-rate="1" version="1.9" timestamp="1592248008"
lines-covered="12" lines-valid="12" branches-covered="6" branches-valid="6">
<sources>
<source>C:\</source>
</sources>
<packages>
<package name="Numbers" line-rate="1" branch-rate="1" complexity="6">
<classes>
<class name="Numbers.PrimeService" line-rate="1" branch-rate="1" complexity="6"
filename="Numbers\PrimeService.cs">
<methods>
<method name="IsPrime" signature="(System.Int32)" line-rate="1"
branch-rate="1" complexity="6">
<lines>
<line number="8" hits="11" branch="False" />
<line number="9" hits="11" branch="True" condition-coverage="100% (2/2)">
<conditions>
<condition number="7" type="jump" coverage="100%" />
</conditions>
</line>
<line number="10" hits="3" branch="False" />
<line number="11" hits="3" branch="False" />
<line number="14" hits="22" branch="True" condition-coverage="100% (2/2)">
<conditions>
<condition number="57" type="jump" coverage="100%" />
</conditions>
</line>
<line number="15" hits="7" branch="False" />
<line number="16" hits="7" branch="True" condition-coverage="100% (2/2)">
<conditions>
<condition number="27" type="jump" coverage="100%" />
</conditions>
</line>
<line number="17" hits="4" branch="False" />
<line number="18" hits="4" branch="False" />
<line number="20" hits="3" branch="False" />
<line number="21" hits="4" branch="False" />
<line number="23" hits="11" branch="False" />
</lines>
</method>
</methods>
<lines>
<line number="8" hits="11" branch="False" />
<line number="9" hits="11" branch="True" condition-coverage="100% (2/2)">
<conditions>
<condition number="7" type="jump" coverage="100%" />
</conditions>
</line>
<line number="10" hits="3" branch="False" />
<line number="11" hits="3" branch="False" />
<line number="14" hits="22" branch="True" condition-coverage="100% (2/2)">
<conditions>
<condition number="57" type="jump" coverage="100%" />
</conditions>
</line>
<line number="15" hits="7" branch="False" />
<line number="16" hits="7" branch="True" condition-coverage="100% (2/2)">
<conditions>
<condition number="27" type="jump" coverage="100%" />
</conditions>
</line>
<line number="17" hits="4" branch="False" />
<line number="18" hits="4" branch="False" />
<line number="20" hits="3" branch="False" />
<line number="21" hits="4" branch="False" />
<line number="23" hits="11" branch="False" />
</lines>
</class>
</classes>
</package>
</packages>
</coverage>
İpucu
Alternatif olarak, derleme sisteminiz ZATEN MSBuild kullanıyorsa MSBuild paketini kullanabilirsiniz. Komut isteminden, dizinleri XUnit.Coverlet.MSBuild projesine
dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura
Sonuçta elde edilen coverage.cobertura.xml dosyası çıktıdır. Daha fazla bilgi için MSBuild ile Coverlet tümleştirmesi bölümüne bakın.
Rapor oluştur
Artık birim testi çalıştırmalarından veri topladığınıza göre, ReportGenerator'ı kullanarak raporlar oluşturabilirsiniz. ReportGenerator NuGet paketini .NET genel aracı olarak yüklemek için komutunu dotnet tool install kullanın:
dotnet tool install -g dotnet-reportgenerator-globaltool
Önceki test çalıştırmasından elde edilen coverage.cobertura.xml çıktı dosyasını kullanarak aracı çalıştırın ve istenen seçenekleri sağlayın.
reportgenerator
-reports:"Path\To\TestProject\TestResults\{guid}\coverage.cobertura.xml"
-targetdir:"coveragereport"
-reporttypes:Html
Bu komutu çalıştırdıktan sonra, oluşturulan raporu bir HTML dosyası temsil eder.
Ayrıca bkz.
- Visual Studio birim testi kod kapsamı
- GitHub - Kapak deposu
- GitHub - ReportGenerator depoları
- ReportGenerator proje sitesi
- Azure: Kod kapsamı sonuçlarını yayımlama
- Azure: Kod kapsamı sonuçlarını gözden geçirme
- .NET CLI test komutu
- dotnet-coverage
- Örnek kaynak kodu