Bagikan melalui


Gunakan cakupan kode untuk pengujian unit

Penting

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

Pengujian unit membantu memastikan fungsionalitas dan menyediakan sarana verifikasi untuk upaya refaktor. Cakupan kode adalah pengukuran jumlah kode yang dijalankan melalui pengujian unit - baik itu 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 cakupan pengujian Cobertura, yang digunakan dalam 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 contoh, tersedia di peramban sampel.

Sistem sedang diuji

"System under test" mengacu pada kode yang Anda tulis untuk pengujian unit, ini bisa berupa objek, servis, atau apa pun yang menyediakan fungsionalitas yang dapat diuji. Untuk artikel ini, Anda akan membuat perpustakaan kelas yang merupakan 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 dengan menggunakan perintah dotnet new classlib.

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

Petunjuk / Saran

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

Membuat proyek pengujian

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

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 dari pustaka kelas Numbers. Hal ini agar proyek pengujian memiliki akses ke PrimeService untuk pengujian. Dari prompt perintah, gunakan perintah dotnet add.

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 package add perintah . (Jika Anda menggunakan versi SDK .NET 9 atau yang lebih lama, gunakan formulir sebagai gantinya dotnet add package .)

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

Perintah sebelumnya mengubah direktori ke proyek pengujian MSBuild secara efektif, lalu menambahkan paket NuGet. Setelah itu selesai, sistem kemudian berpindah direktori ke atas 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} 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");
    }
}

Membuat solusi

Dari command prompt, buat solusi baru untuk menggabungkan pustaka kelas dan dua proyek pengujian. Penggunaan perintah dotnet sln:

dotnet new sln -n XUnit.Coverage

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

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

Bangun solusi menggunakan dotnet build perintah :

dotnet build XUnit.Coverage.sln

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

Peralatan 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 PengumpulData 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.

Petunjuk / Saran

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 dotnet-coverage.

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 perintah dotnet test:

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 terhadap penggunaan huruf besar/kecil. Untuk menggunakan pengumpul data Cakupan Kode bawaan .NET, gunakan "Code Coverage".

Sebagai bagian dari dotnet test pelaksanaan, file coverage.cobertura.xml yang dihasilkan akan ditempatkan di 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>

Petunjuk / Saran

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 perintah dotnet test:

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

File coverage.cobertura.xml yang dihasilkan akan dioutput. Untuk informasi lebih lanjut, lihat Integrasi Coverlet dengan MSBuild

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, dengan mengambil dalam pertimbangan file output coverage.cobertura.xml 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.

Laporan yang dihasilkan dari pengujian unit

Lihat juga

Langkah berikutnya