Reference · Testing
Red-Green-Refactor
Ringkasan satu halaman. Dari Lesson 0009.
Siklus
| Langkah | Lakukan | Jangan [3] |
|---|---|---|
| 0. Test list | Daftar skenario: harga ≤ 0, Stock negatif, nama duplikat, … | Mencampur keputusan desain implementasi |
| Red | Ubah satu item jadi test, jalankan, lihat gagal karena alasan yang benar | Menulis semua test dulu; test tanpa assertion |
| Green | Kode paling sederhana sampai test ini dan semua test lama lulus [2] | Menghapus assertion; menyalin hasil aktual ke expected; refactor sambil jalan |
| Refactor | Rapikan kode baru dan lama, test tetap hijau | Melewatkannya (kesalahan paling umum menurut Fowler [4]); abstraksi terlalu dini |
| Ulangi | Kembali ke test list sampai kosong |
Kenapa merah dulu
- Membuktikan test bisa mendeteksi perilaku yang hilang. Test yang tidak pernah merah bisa selalu hijau (assertion terlupa, method salah).
- Merah harus karena perilaku belum ada, bukan karena setup rusak atau error compile.
- Untuk bug: tulis test yang memperlihatkan bug, baru perbaiki. [6]
Template test
[Theory]
[InlineData(0)]
[InlineData(-10)]
public async Task CreateAsync_PriceNotPositive_ThrowsValidationException(decimal price)
{
// Arrange
var request = new CreateProductRequest("Keyboard", price, 5, 1);
// Act
var act = () => _sut.CreateAsync(request);
// Assert
await Assert.ThrowsAsync<ValidationException>(act);
_repo.Verify(r => r.AddAsync(It.IsAny<Product>()), Times.Never);
}
Konvensi [1]
| Aturan | .NET / xUnit | Padanan Jest |
|---|---|---|
| Nama = method _ skenario _ hasil | CreateAsync_PriceNotPositive_ThrowsValidationException | describe + it("throws when …") |
| Arrange · Act · Assert, satu Act per test | Dua input → [Theory], bukan dua Act | Dua input → test.each [5] |
| Tanpa logika di test | Tidak ada if/for/switch | Sama |
| Satu kasus | [Fact] | test() |
| Watch mode | dotnet watch test | jest --watch |
Jawaban 60 detik: "Jelaskan red-green-refactor. Kenapa harus gagal dulu?"
Red: satu test kecil untuk perilaku yang belum ada, jalankan, lihat gagal. Green: kode paling sederhana sampai semua test lulus.
Refactor: rapikan dengan test tetap hijau, jangan dilewati. Ulangi per perilaku (contoh: harga ≤ 0 → ValidationException, lalu ekstrak ValidateAsync).
Merah dulu membuktikan test bisa mendeteksi perilaku yang hilang, dan harus gagal karena alasan yang benar.
Sumber: [1] Microsoft Learn: Unit testing best practices · [2] Microsoft Learn: Unit testing C# with xUnit · [3] Kent Beck: Canon TDD · [4] Martin Fowler: Test Driven Development · [5] Jest: test.each · [6] Martin Fowler: Self Testing Code