Reference · Testing

Red-Green-Refactor

Ringkasan satu halaman. Dari Lesson 0009.

Siklus

LangkahLakukanJangan [3]
0. Test listDaftar skenario: harga ≤ 0, Stock negatif, nama duplikat, …Mencampur keputusan desain implementasi
RedUbah satu item jadi test, jalankan, lihat gagal karena alasan yang benarMenulis semua test dulu; test tanpa assertion
GreenKode paling sederhana sampai test ini dan semua test lama lulus [2]Menghapus assertion; menyalin hasil aktual ke expected; refactor sambil jalan
RefactorRapikan kode baru dan lama, test tetap hijauMelewatkannya (kesalahan paling umum menurut Fowler [4]); abstraksi terlalu dini
UlangiKembali ke test list sampai kosong

Kenapa merah dulu

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 / xUnitPadanan Jest
Nama = method _ skenario _ hasilCreateAsync_PriceNotPositive_ThrowsValidationExceptiondescribe + it("throws when …")
Arrange · Act · Assert, satu Act per testDua input → [Theory], bukan dua ActDua input → test.each [5]
Tanpa logika di testTidak ada if/for/switchSama
Satu kasus[Fact]test()
Watch modedotnet watch testjest --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