Pengujian unit dan integrasi di aplikasi API Minimal

Oleh Fiyaz Bin Hasan, dan Rick Anderson

Pengantar pengujian integrasi

Pengujian integrasi mengevaluasi komponen aplikasi pada tingkat yang lebih luas daripada pengujian unit. Pengujian unit digunakan untuk menguji komponen perangkat lunak terisolasi, seperti metode kelas individual. Pengujian integrasi mengonfirmasi bahwa dua komponen aplikasi atau lebih bekerja sama untuk menghasilkan hasil yang diharapkan, mungkin termasuk setiap komponen yang diperlukan untuk memproses permintaan sepenuhnya.

Pengujian yang lebih luas ini digunakan untuk menguji infrastruktur aplikasi dan seluruh kerangka kerja, sering kali termasuk komponen berikut:

  • Database
  • Sistem file
  • Appliance jaringan
  • Alur respons permintaan

Pengujian unit menggunakan komponen fabrikasi, yang dikenal sebagai objek palsu atau tiruan, sebagai pengganti komponen infrastruktur.

Berbeda dengan pengujian unit, pengujian integrasi:

  • Gunakan komponen aktual yang digunakan aplikasi dalam produksi.
  • Memerlukan lebih banyak kode dan pemrosesan data.
  • Membutuhkan waktu lebih lama untuk dijalankan.

Oleh karena itu, batasi penggunaan pengujian integrasi ke skenario infrastruktur yang paling penting. Jika perilaku dapat diuji menggunakan pengujian unit atau pengujian integrasi, pilih pengujian unit.

Dalam diskusi pengujian integrasi, proyek yang diuji sering disebut System Under Test, atau "SUT" singkatnya. "SUT" digunakan di seluruh artikel ini untuk merujuk ke aplikasi ASP.NET Core yang sedang diuji.

Jangan menulis pengujian integrasi untuk setiap permutasi akses data dan file dengan database dan sistem file. Terlepas dari berapa banyak tempat di seluruh aplikasi berinteraksi dengan database dan sistem file, serangkaian pengujian integrasi baca, tulis, perbarui, dan hapus yang berfokus biasanya mampu menguji database dan komponen sistem file dengan memadai. Gunakan pengujian unit untuk pengujian rutin logika metode yang berinteraksi dengan komponen-komponen ini. Dalam pengujian unit, penggunaan infrastruktur palsu atau tiruan menghasilkan eksekusi pengujian yang lebih cepat.

pengujian integrasi ASP.NET Core

Pengujian integrasi di ASP.NET Core memerlukan hal berikut:

  • Proyek pengujian digunakan untuk memuat dan menjalankan pengujian. Proyek pengujian memiliki referensi ke SUT.
  • Proyek pengujian membuat host web pengujian untuk SUT dan menggunakan klien server pengujian untuk menangani permintaan dan respons dengan SUT.
  • Runner pengujian digunakan untuk menjalankan pengujian dan melaporkan hasil pengujian.

Pengujian integrasi mengikuti urutan peristiwa yang mencakup langkah-langkah pengujian Arrange, Act, dan Assert yang biasa:

  1. Host web SUT dikonfigurasi.
  2. Klien server pengujian dibuat untuk mengirimkan permintaan ke aplikasi.
  3. Langkah Atur pengujian dijalankan: Aplikasi pengujian menyiapkan permintaan.
  4. Langkah pengujian Act dijalankan: Klien mengirimkan permintaan dan menerima respons.
  5. Langkah pengujian Assert dijalankan: Respons aktual divalidasi sebagai lulus atau gagal berdasarkan respons yang diharapkan .
  6. Proses berlanjut sampai semua pengujian dijalankan.
  7. Hasil pengujian dilaporkan.

Biasanya, host web pengujian dikonfigurasi secara berbeda dari host web normal aplikasi untuk eksekusi pengujian. Misalnya, database yang berbeda atau pengaturan aplikasi yang berbeda dapat digunakan untuk pengujian.

Komponen infrastruktur, seperti host web pengujian dan server pengujian dalam memori (TestServer), disediakan atau dikelola oleh paket Microsoft.AspNetCore.Mvc.Testing . Penggunaan paket ini menyederhanakan pembuatan dan eksekusi pengujian.

Paket Microsoft.AspNetCore.Mvc.Testing menangani tugas-tugas berikut:

  • Menyalin file dependensi (.deps) dari SUT ke direktori proyek bin pengujian.
  • Mengatur akar konten ke akar proyek SUT sehingga file statis dan halaman/tampilan ditemukan saat pengujian dijalankan.
  • Menyediakan kelas WebApplicationFactory untuk menyederhanakan bootstrapping SUT dengan TestServer.

Dokumentasi pengujian unit menjelaskan cara menyiapkan proyek pengujian dan runner pengujian, bersama dengan instruksi terperinci tentang cara menjalankan pengujian dan rekomendasi tentang cara memberi nama pengujian dan kelas pengujian.

Memisahkan pengujian unit dari pengujian integrasi ke dalam proyek yang berbeda. Memisahkan pengujian:

  • Membantu memastikan bahwa komponen pengujian infrastruktur tidak secara tidak sengaja disertakan dalam pengujian unit.
  • Memungkinkan kontrol atas set pengujian mana yang dijalankan.

Kode sampel di GitHub menyediakan contoh pengujian unit dan integrasi pada aplikasi API Minimal.

Jenis implementasi IResult

Jenis implementasi publik IResult di Microsoft.AspNetCore.Http.HttpResults namespace layanan dapat digunakan untuk menguji unit penangan rute minimal saat menggunakan metode bernama alih-alih lambda.

Kode berikut menggunakan NotFound<TValue> kelas :

[Fact]
public async Task GetTodoReturnsNotFoundIfNotExists()
{
    // Arrange
    await using var context = new MockDb().CreateDbContext();

    // Act
    var result = await TodoEndpointsV1.GetTodo(1, context);

    //Assert
    Assert.IsType<Results<Ok<Todo>, NotFound>>(result);

    var notFoundResult = (NotFound) result.Result;

    Assert.NotNull(notFoundResult);
}

Kode berikut menggunakan Ok<TValue> kelas :

[Fact]
public async Task GetTodoReturnsTodoFromDatabase()
{
    // Arrange
    await using var context = new MockDb().CreateDbContext();

    context.Todos.Add(new Todo
    {
        Id = 1,
        Title = "Test title",
        Description = "Test description",
        IsDone = false
    });

    await context.SaveChangesAsync();

    // Act
    var result = await TodoEndpointsV1.GetTodo(1, context);

    //Assert
    Assert.IsType<Results<Ok<Todo>, NotFound>>(result);

    var okResult = (Ok<Todo>)result.Result;

    Assert.NotNull(okResult.Value);
    Assert.Equal(1, okResult.Value.Id);
}

Sumber Daya Tambahan