Bagikan melalui


Menggunakan cakupan kode untuk pengujian unit

Penting

Artikel ini menjelaskan pembuatan proyek contoh. Jika Anda sudah memiliki proyek, Anda dapat melompat ke bagian Alat cakupan kode.

Pengujian unit membantu memastikan fungsionalitas dan menyediakan sarana verifikasi untuk upaya refaktor. Cakupan kode adalah pengukuran jumlah kode yang dijalankan oleh pengujian unit - baik baris, cabang, atau metode. Sebagai contoh, jika Anda memiliki aplikasi sederhana dengan hanya dua cabang kode bersyarat (cabang a, dan cabang b), pengujian unit yang memverifikasi cabang bersyarat akan melaporkan cakupan kode cabang sebesar 50%.

Artikel ini membahas penggunaan cakupan kode untuk pengujian unit dengan Coverlet dan pembuatan laporan menggunakan ReportGenerator. Meskipun artikel ini berfokus pada C# dan xUnit sebagai kerangka kerja pengujian, MSTest dan NUnit juga akan berfungsi. Coverlet adalah proyek sumber terbuka di GitHub yang menyediakan kerangka kerja cakupan kode lintas platform untuk C#. Coverlet adalah bagian dari .NET Foundation. Coverlet mengumpulkan data eksekusi pengujian cakupan Cobertura, yang digunakan untuk pembuatan laporan.

Selain itu, artikel ini merinci cara menggunakan informasi cakupan kode yang dikumpulkan dari uji coba Coverlet untuk menghasilkan laporan. Pembuatan laporan dimungkinkan menggunakan proyek sumber terbuka lain di GitHub - ReportGenerator. ReportGenerator mengonversi laporan cakupan yang dihasilkan oleh Cobertura di antara banyak lainnya, menjadi laporan yang dapat dibaca manusia dalam berbagai format.

Artikel ini didasarkan pada proyek kode sumber sampel, tersedia di browser sampel.

Sistem sedang diuji

"Sistem sedang diuji" mengacu pada kode yang Anda tulis pengujian unitnya, ini bisa menjadi objek, layanan, atau apa pun yang mengekspos fungsionalitas yang dapat diuji. Untuk artikel ini, Anda akan membuat pustaka kelas yang akan menjadi sistem yang sedang diuji, dan dua proyek pengujian unit yang sesuai.

Membuat pustaka kelas

Dari prompt perintah di direktori baru bernama UnitTestingCodeCoverage, buat pustaka kelas standar .NET baru menggunakan dotnet new classlib perintah :

dotnet new classlib -n Numbers

Cuplikan di bawah ini mendefinisikan kelas sederhana PrimeService yang menyediakan fungsionalitas untuk memeriksa apakah angka prima. Salin cuplikan di bawah ini dan ganti konten file Class1.cs yang dibuat secara otomatis di direktori Numbers . Ganti nama file Class1.cs menjadi PrimeService.cs.

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

Tip

Perlu disebutkan bahwa Numbers pustaka kelas sengaja ditambahkan ke System namespace layanan. Ini memungkinkan untuk System.Math dapat diakses tanpa using System; deklarasi namespace. Untuk informasi selengkapnya, lihat namespace layanan (Referensi C#).

Membuat proyek pengujian

Buat dua templat xUnit Test Project (.NET Core) baru dari prompt perintah yang sama menggunakan dotnet new xunit perintah :

dotnet new xunit -n XUnit.Coverlet.Collector
dotnet new xunit -n XUnit.Coverlet.MSBuild

Kedua proyek pengujian xUnit yang baru dibuat perlu menambahkan referensi proyek pustaka kelas Numbers . Hal ini agar proyek pengujian memiliki akses ke PrimeService untuk pengujian. Dari prompt perintah, gunakan dotnet add perintah :

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

Proyek MSBuild dinamai dengan tepat, karena akan bergantung pada paket NuGet coverlet.msbuild . Tambahkan dependensi paket ini dengan menjalankan dotnet add package perintah:

cd XUnit.Coverlet.MSBuild && dotnet add package coverlet.msbuild && cd ..

Perintah sebelumnya mengubah direktori yang secara efektif mencakup ke proyek pengujian MSBuild , lalu menambahkan paket NuGet. Ketika itu selesai, itu kemudian mengubah direktori, meningkatkan satu tingkat.

Buka kedua file UnitTest1.cs , dan ganti kontennya dengan cuplikan berikut. Ganti nama file UnitTest1.cs menjadi PrimeServiceTests.cs.

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

Membuat solusi

Dari prompt perintah, buat solusi baru untuk merangkum pustaka kelas dan dua proyek pengujian. dotnet sln Menggunakan perintah :

dotnet new sln -n XUnit.Coverage

Ini akan membuat nama XUnit.Coverage file solusi baru di direktori UnitTestingCodeCoverage . Tambahkan proyek ke akar solusi.

dotnet sln XUnit.Coverage.sln add **/*.csproj --in-root

Bangun solusi menggunakan dotnet build perintah :

dotnet build

Jika build berhasil, Anda telah membuat tiga proyek, proyek dan paket yang direferensikan dengan tepat, dan memperbarui kode sumber dengan benar. Kerja bagus!

Alat cakupan kode

Ada dua jenis alat cakupan kode:

  • DataCollectors: DataCollectors memantau eksekusi pengujian dan mengumpulkan informasi tentang uji coba. Mereka melaporkan informasi yang dikumpulkan dalam berbagai format output, seperti XML dan JSON. Untuk informasi selengkapnya, lihat DataCollector pertama Anda.
  • Generator laporan: Gunakan data yang dikumpulkan dari eksekusi pengujian untuk menghasilkan laporan, sering kali sebagai HTML bergaya.

Di bagian ini, fokusnya adalah pada alat pengumpul data.

.NET menyertakan pengumpul data cakupan kode bawaan, yang juga tersedia di Visual Studio. Pengumpul data ini menghasilkan file .coverage biner yang dapat digunakan untuk menghasilkan laporan di Visual Studio. File biner tidak dapat dibaca manusia, dan harus dikonversi ke format yang dapat dibaca manusia sebelum dapat digunakan untuk menghasilkan laporan di luar Visual Studio.

Tip

Alat ini dotnet-coverage adalah alat lintas platform yang dapat digunakan untuk mengonversi file hasil pengujian cakupan biner ke format yang dapat dibaca manusia. Untuk informasi selengkapnya, lihat cakupan dotnet.

Coverlet adalah alternatif sumber terbuka untuk pengumpul bawaan. Ini menghasilkan hasil pengujian sebagai file XML Cobertura yang dapat dibaca manusia, yang kemudian dapat digunakan untuk menghasilkan laporan HTML. Untuk menggunakan Coverlet untuk cakupan kode, proyek pengujian unit yang ada harus memiliki dependensi paket yang sesuai, atau mengandalkan alat global .NET dan paket NuGet coverlet.console yang sesuai.

Integrasikan dengan uji .NET

Templat proyek pengujian xUnit sudah terintegrasi dengan coverlet.collector secara default. Dari prompt perintah, ubah direktori ke proyek XUnit.Coverlet.Collector , dan jalankan dotnet test perintah :

cd XUnit.Coverlet.Collector && dotnet test --collect:"XPlat Code Coverage"

Catatan

Argumen "XPlat Code Coverage" adalah nama yang mudah diingat yang sesuai dengan pengumpul data dari Coverlet. Nama ini diperlukan tetapi tidak peka huruf besar/kecil. Untuk menggunakan . Pengumpul data Cakupan Kode bawaan NET, gunakan "Code Coverage".

Sebagai bagian dotnet test dari eksekusi, file coverage.cobertura.xml yang dihasilkan adalah output ke direktori TestResults. File XML berisi hasilnya. Ini adalah opsi lintas platform yang bergantung pada .NET CLI, dan sangat bagus untuk sistem build di mana MSBuild tidak tersedia.

Di bawah ini adalah contoh file coverage.cobertura.xml .

<?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>

Tip

Sebagai alternatif, Anda dapat menggunakan paket MSBuild jika sistem build Anda sudah menggunakan MSBuild. Dari prompt perintah, ubah direktori ke proyek XUnit.Coverlet.MSBuild , dan jalankan dotnet test perintah :

dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura

File coverage.cobertura.xml yang dihasilkan adalah output. Anda dapat mengikuti panduan integrasi MSBuild di sini

Menghasilkan laporan

Sekarang setelah Anda dapat mengumpulkan data dari eksekusi pengujian unit, Anda dapat membuat laporan menggunakan ReportGenerator. Untuk menginstal paket ReportGenerator NuGet sebagai alat global .NET, gunakan dotnet tool install perintah :

dotnet tool install -g dotnet-reportgenerator-globaltool

Jalankan alat dan berikan opsi yang diinginkan, mengingat output coverage.cobertura.xml file dari uji coba sebelumnya.

reportgenerator
-reports:"Path\To\TestProject\TestResults\{guid}\coverage.cobertura.xml"
-targetdir:"coveragereport"
-reporttypes:Html

Setelah menjalankan perintah ini, file HTML mewakili laporan yang dihasilkan.

Unit test-generated report

Lihat juga

Langkah berikutnya