Pengujian unit dan integrasi di aplikasi API Minimal
Catatan
Ini bukan versi terbaru dari artikel ini. Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.
Peringatan
Versi ASP.NET Core ini tidak lagi didukung. Untuk informasi selengkapnya, lihat Kebijakan Dukungan .NET dan .NET Core. Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.
Penting
Informasi ini berkaitan dengan produk pra-rilis yang mungkin dimodifikasi secara substansial sebelum dirilis secara komersial. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.
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:
- Host web SUT dikonfigurasi.
- Klien server pengujian dibuat untuk mengirimkan permintaan ke aplikasi.
- Langkah Atur pengujian dijalankan: Aplikasi pengujian menyiapkan permintaan.
- Langkah pengujian Act dijalankan: Klien mengirimkan permintaan dan menerima respons.
- Langkah pengujian Assert dijalankan: Respons aktual divalidasi sebagai lulus atau gagal berdasarkan respons yang diharapkan .
- Proses berlanjut sampai semua pengujian dijalankan.
- 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 proyekbin
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 Tambahan
- Pengujian autentikasi dasar bukan repositori .NET tetapi ditulis oleh anggota tim .NET. Ini memberikan contoh pengujian autentikasi dasar.
- Menampilkan atau mengunduh kode sampel
- Autentikasi dan otorisasi dalam API minimal
- Menggunakan penerowongan port Visual Studio untuk men-debug API web
- Menguji logika pengontrol di ASP.NET Core
- Pengujian unit Razor Pages di ASP.NET Core
ASP.NET Core