Birim testi için kod kapsamını kullanma

Ö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 olacak 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

adlı UnitTestingCodeCoverageyeni 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).

Test projeleri oluşturma

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");
    }
}

Çö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, UnitTestingCodeCoverage dizininde yeni bir çözüm dosyası adı XUnit.Coverage 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, uygun şekilde başvuruda bulunan projeler ve paketler olan üç projeyi oluşturdunuz ve kaynak kodu doğru güncelleştirdiniz. 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 bkz . ilk DataCollector'ınız.
  • 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 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

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

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.

Unit test-generated report

Ayrıca bkz.

Sonraki Adımlar