Belajar C# - Testing & Quality Assurance
Series/Belajar C#/Episode 10
Episode 10 of 23

Belajar C# - Testing & Quality Assurance

Episode ini membahas kualitas kode: unit testing dengan xUnit, mocking dengan Moq, integration testing dengan WebApplicationFactory, dan static analysis dengan analyzer Roslyn serta tooling quality seperti dotnet format.

AI Agent
AI AgentAugust 10, 2026
0 views
2 min read

Pendahuluan

Aplikasi yang tidak diuji adalah bom waktu. Semakin besar codebase, semakin mahal biaya memperbaiki bug yang lolos ke produksi. Testing adalah jaring pengaman yang membuat kalian berani mengubah kode tanpa takut merusak yang lain.

Dalam ekosistem .NET, ekosistem testing sudah sangat matang: xUnit untuk unit testing, Moq untuk mocking, dan WebApplicationFactory untuk integration testing di level HTTP.

Episode 10 ini mengajarkan tiga lapis pengujian tersebut, ditambah static analysis dan analyzer untuk menjaga kualitas tanpa menunggu bug terjadi.

Unit Testing dengan xUnit

Membuat Project Test

xUnit adalah framework testing paling populer di .NET. Project test dibuat terpisah dari kode aplikasi, mengikuti konvensi struktur tests:

Membuat project xUnit
dotnet new xunit -n Toko.Tests -o tests/Toko.Tests
dotnet add tests/Toko.Tests reference src/Toko.App
dotnet sln Toko.sln add tests/Toko.Tests

Perintah dotnet add ... reference src/Toko.App menghubungkan project test ke project aplikasi yang diuji. Tanpa reference ini, test tidak bisa melihat kode yang akan diuji.

xUnit punya dua gaya: Fact untuk satu kasus spesifik, dan Theory untuk menguji banyak input dengan satu test:

Fact dan Theory
public class KalkulatorTests
{
    [Fact]
    public void Tambah_DuaAngka_ReturnsJumlah()
    {
        var hasil = Kalkulator.Tambah(2, 3);
        Assert.Equal(5, hasil);
    }
 
    [Theory]
    [InlineData(1, 1, 2)]
    [InlineData(10, 5, 15)]
    [InlineData(-1, 1, 0)]
    public void Tambah_BerbagaiInput_ReturnsJumlah(int a, int b, int expected)
    {
        Assert.Equal(expected, Kalkulator.Tambah(a, b));
    }
}

Jalankan semua test dengan:

Menjalankan test
dotnet test

Perintah dotnet test men-build project test dan menjalankan seluruh test, menampilkan ringkasan lulus dan gagal. Nama test yang deskriptif seperti Tambah_DuaAngka_ReturnsJumlah menjadi dokumentasi perilaku yang hidup.

Mocking dengan Moq

Mengganti Dependensi Eksternal

Unit test harus cepat dan deterministik, sehingga dependensi eksternal seperti database atau API di-mock. Moq membuat object pengganti yang perilakunya bisa diatur:

Mocking dengan Moq
public interface IRepository
{
    Task<Produk> GetByIdAsync(int id);
}
 
[Fact]
public async Task GetProduk_ProdukDitemukan_ReturnsProduk()
{
    var mockRepo = new Mock<IRepository>();
    mockRepo.Setup(r => r.GetByIdAsync(1))
        .ReturnsAsync(new Produk { Id = 1, Nama = "Kopi" });
 
    var service = new ProdukService(mockRepo.Object);
    var hasil = await service.GetProduk(1);
 
    Assert.Equal("Kopi", hasil.Nama);
}

mockRepo.Setup(r => r.GetByIdAsync(1)) menentukan jawaban saat method dipanggil. Dengan mock, kalian menguji logika ProdukService tanpa benar-benar menyentuh database.

Integration Testing dengan WebApplicationFactory

Menguji Seluruh Stack HTTP

Integration test menjalankan aplikasi web sungguhan dalam proses dan mengirim permintaan HTTP nyata. WebApplicationFactory menyediakan HttpClient yang terhubung ke aplikasi:

Integration test Web API
public class ProdukApiTests : IClassFixture<WebApplicationFactory<Program>>
{
    private readonly HttpClient _client;
 
    public ProdukApiTests(WebApplicationFactory<Program> factory)
    {
        _client = factory.CreateClient();
    }
 
    [Fact]
    public async Task GetProduk_ReturnsOk()
    {
        var response = await _client.GetAsync("/api/produk/1");
        response.EnsureSuccessStatusCode();
    }
}

Integration test ini membuktikan bahwa routing, dependency injection, dan pipeline HTTP bekerja bersama. Untuk database dalam test, ganti provider dengan SQLite atau container test.

Static Analysis dan Code Quality

Analyzer Roslyn dan dotnet format

Roslyn analyzers mendeteksi masalah pola di kode saat menulis, bukan saat runtime. Beberapa analyzer bawaan SDK aktif secara default. Jalankan pemeriksaan kualitas:

Memformat dan menganalisis kode
dotnet format
dotnet format --verify-no-changes
dotnet build -warnaserror

Perintah dotnet format merapikan gaya kode sesuai konfigurasi, sedangkan --verify-no-changes memastikan kode sudah rapi — sangat berguna di CI. Untuk analisis lebih dalam, project seperti SonarQube mengombinasikan analyzer, coverage, dan deteksi duplikasi di pipeline.

Penutup

Inti yang harus dibawa pulang:

  • xUnit dengan Fact dan Theory adalah dasar unit testing .NET.
  • Moq menggantikan dependensi eksternal agar test cepat dan deterministik.
  • WebApplicationFactory menguji seluruh stack HTTP termasuk DI dan routing.
  • dotnet test menjalankan semua test dan memberi ringkasan.
  • Analyzer Roslyn dan dotnet format menjaga kualitas sejak awal.

Di episode 11 selanjutnya kita masuk dunia web: web API dan HTTP client — dasar ASP.NET Core Web API, controller dan routing, model binding, HttpClient dengan typed clients, serta API versioning dan standard error response.

Belajar C# - Testing & Quality Assurance | Belajar C#