Ekinlikler
17 Mar 23 - 21 Mar 23
Diğer geliştiriciler ve uzmanlarla gerçek dünyadaki kullanım örneklerini temel alan ölçeklenebilir yapay zeka çözümleri oluşturmak için toplantı serisine katılın.
Hemen kaydolunBu tarayıcı artık desteklenmiyor.
En son özelliklerden, güvenlik güncelleştirmelerinden ve teknik destekten faydalanmak için Microsoft Edge’e yükseltin.
Ö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", 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 olacak bir sınıf kitaplığı ve buna karşılık gelen iki birim testi projesi oluşturacaksınız.
adlı UnitTestingCodeCoverage
yeni bir dizindeki komut isteminden komutunu kullanarak dotnet new classlib
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
Sınıf kitaplığının Numbers
ad alanına kasıtlı olarak eklendiğini System
belirtmek gerekir. Bu, ad alanı bildirimi olmadan using System;
erişilebilir olmasını sağlarSystem.Math. Daha fazla bilgi için bkz . ad alanı (C# Başvurusu).
komutunu kullanarak dotnet new xunit
aynı komut isteminden iki yeni xUnit Test Projesi (.NET Core) şablonu oluşturun:
dotnet new xunit -n XUnit.Coverlet.Collector
dotnet new xunit -n XUnit.Coverlet.MSBuild
Yeni oluşturulan xUnit test projelerinin her ikisinin de Numbers sınıf kitaplığına bir proje başvurusu eklemesi gerekir. Bu, test projelerinin test için PrimeService'e erişmesini sağlar. Komut isteminden komutunu dotnet add
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 add package
ekleyin:
cd XUnit.Coverlet.MSBuild && dotnet add package 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} should not 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} should not be prime");
}
}
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, UnitTestingCodeCoverage dizininde yeni bir çözüm dosyası adı XUnit.Coverage
oluşturur. Projeleri çözümün köküne ekleyin.
Şu komutu kullanarak çözümü derleyin dotnet build
:
dotnet build
Derleme başarılı olursa, uygun şekilde başvuruda bulunan projeler ve paketler olan üç projeyi oluşturdunuz ve kaynak kodu doğru güncelleştirdiniz. Tebrikler!
İki tür kod kapsamı aracı vardır:
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.
xUnit test projesi şablonu varsayılan olarak coverlet.collector ile zaten tümleştirilmiştir.
Komut isteminden, dizinleri XUnit.Coverlet.Collector projesine değiştirin ve komutunu çalıştırındotnet test
:
cd XUnit.Coverlet.Collector && dotnet test --collect:"XPlat Code Coverage"
Not
"XPlat Code Coverage"
Bağımsız değişken, Coverlet'ten veri toplayıcılarına karşılık gelen kolay bir addır. Bu ad 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 değiştirin ve komutunu çalıştırındotnet test
:
dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura
Sonuçta elde edilen coverage.cobertura.xml dosyası çıktıdır. MSBuild tümleştirme kılavuzunu buradan izleyebilirsiniz
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
Aracı çalıştırın ve önceki test çalıştırmasından coverage.cobertura.xml çıktı dosyası verilip 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.
.NET geri bildirimi
.NET, açık kaynak bir projedir. Geri bildirim sağlamak için bir bağlantı seçin:
Ekinlikler
17 Mar 23 - 21 Mar 23
Diğer geliştiriciler ve uzmanlarla gerçek dünyadaki kullanım örneklerini temel alan ölçeklenebilir yapay zeka çözümleri oluşturmak için toplantı serisine katılın.
Hemen kaydolunEğitim
Modül
Visual Studio'da C# testi - Training
Visual Studio'daki test araçlarını kullanarak C# uygulamalarınızı test etmeye başlayın. Test yazmayı, Test Gezgini'ni kullanmayı, test paketleri oluşturmayı ve kod yazmak için kırmızı, yeşil, yeniden düzenleme desenini uygulamayı öğrenin.
Belgeler
dotnet-coverage kod kapsamı aracı - .NET CLI - .NET
Çalışan bir işlemin kod kapsamı verilerini toplamak için dotnet-coverage CLI aracını yüklemeyi ve kullanmayı öğrenin.
Kod testi kapsamını belirleme - Visual Studio (Windows)
Kodlanmış testler tarafından test edilen proje kodunuzun oranını belirlemek için Visual Studio'nun kod kapsamı özelliğini kullanmayı öğrenin.
Kod Kapsamı Analizini Özelleştirme - Visual Studio (Windows)
Test kodunu kapsam sonuçlarından dışlamak için ExcludeFromCodeCoverageAttribute özniteliğini kullanmayı öğrenin. Çözümünüzün dışında derlemeler ekleyebilirsiniz.