Alur Kerja Pengembangan Berbasis Pengujian
Arahkan perancangan dengan siklus merah-hijau-refaktor.
Alur Kerja Pengembangan Berbasis Pengujian adalah pelajaran PHP Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar PHP Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus PHP Academy mencakup 4 pelajaran total.
TDD Adalah Alat Perancangan
Pengembangan Berbasis Pengujian sering dipasarkan sebagai teknik pengujian, tetapi nilai sebenarnya adalah tekanan perancangan. Dengan menulis pengujian terlebih dahulu, Anda dipaksa untuk menentukan antarmuka publik suatu objek, dependensinya, dan kontraknya sebelum menulis implementasi apa pun. Pengujian tersebut adalah hasil sampingan; perancangan yang lebih baik adalah produknya.
Merah, Hijau, Refaktor
Siklus ini memiliki tiga tahap yang ketat:
- Merah — tulis pengujian yang gagal untuk perilaku kecil berikutnya. Pengujian itu harus gagal karena alasan yang tepat.
- Hijau — tulis kode minimum agar pengujian berhasil, meskipun kodenya buruk.
- Refaktor — rapikan implementasi dan pengujian sambil mempertahankan kondisi hijau.
Disiplin itu penting: jangan pernah melewati tahap Merah (Anda mungkin sebenarnya tidak menguji apa pun), dan jangan membangun terlalu banyak pada tahap Hijau.
Merah: Tulis Pengujian yang Gagal Terlebih Dahulu
Kita akan membangun PriceCalculator yang menerapkan diskon persentase. Mulailah dengan pengujian untuk perilaku yang belum ada. Saat dijalankan, pengujian tersebut harus gagal karena kelasnya belum didefinisikan — itu adalah tahap Merah yang valid.
<?php
use PHPUnit\Framework\TestCase;
final class PriceCalculatorTest extends TestCase
{
public function test_applies_a_percentage_discount(): void
{
$calc = new PriceCalculator();
// 100 with 10% off -> 90.0
self::assertSame(90.0, $calc->withDiscount(100.0, 10));
}
}
Hijau: Kode Minimum agar Berhasil
Sekarang tulis implementasi terkecil yang membuatnya berhasil. Jangan tergoda untuk menambahkan aturan pembulatan, validasi, atau penanganan mata uang — belum ada pengujian gagal yang menuntut hal-hal tersebut.
<?php
final class PriceCalculator
{
public function withDiscount(float $amount, float $percent): float
{
return $amount - ($amount * $percent / 100);
}
}
$calc = new PriceCalculator();
var_dump($calc->withDiscount(100.0, 10)); // float(90)
Triangulasi untuk Mendorong Keumuman
Satu pengujian dapat dipenuhi dengan nilai yang ditulis secara langsung. Triangulasi — menambahkan contoh kedua yang berbeda — memaksa implementasi agar berlaku umum. Tambahkan kasus yang tidak dapat dipalsukan oleh solusi sederhana, sehingga rumus yang sebenarnya harus diterapkan.
<?php
use PHPUnit\Framework\TestCase;
final class PriceCalculatorTest extends TestCase
{
public function test_zero_percent_is_unchanged(): void
{
self::assertSame(50.0, (new PriceCalculator())->withDiscount(50.0, 0));
}
public function test_full_discount_is_free(): void
{
self::assertSame(0.0, (new PriceCalculator())->withDiscount(50.0, 100));
}
}
Jadikan Kasus Tepi sebagai Spesifikasi
Dalam TDD, persyaratan baru berarti pengujian gagal yang baru. Misalkan diskon negatif tidak valid. Tulis terlebih dahulu pengujian yang mengharapkan pengecualian; pengujian itu gagal karena belum ada yang melempar pengecualian. Pengujian tersebut mendokumentasikan kontrak.
<?php
use PHPUnit\Framework\TestCase;
final class PriceCalculatorValidationTest extends TestCase
{
public function test_rejects_negative_discount(): void
{
$this->expectException(\InvalidArgumentException::class);
(new PriceCalculator())->withDiscount(100.0, -5);
}
}
Kembali Hijau, Lalu Refaktor
Tambahkan penjagaan agar pengujian baru berhasil, lalu lakukan refaktor dengan percaya diri — pengujian yang sudah ada akan menangkap kemunduran. Perhatikan bahwa kita juga baru memperkenalkan pembulatan setelah pengujian (atau persyaratan yang sudah diketahui) membenarkannya.
<?php
final class PriceCalculator
{
public function withDiscount(float $amount, float $percent): float
{
if ($percent < 0 || $percent > 100) {
throw new \InvalidArgumentException('percent must be 0..100');
}
return round($amount - ($amount * $percent / 100), 2);
}
}
var_dump((new PriceCalculator())->withDiscount(19.99, 15)); // float(16.99)
Penyedia Data Memadatkan Contoh
Setelah suatu perilaku stabil, gabungkan banyak pasangan contoh menjadi satu pengujian berparameter dengan penyedia data. Ini menjaga siklus Merah/Hijau tetap cepat dan tabel maksud tetap mudah dibaca.
<?php
use PHPUnit\Framework\TestCase;
use PHPUnit\Framework\Attributes\DataProvider;
final class DiscountTableTest extends TestCase
{
#[DataProvider('cases')]
public function test_discounts(float $amount, float $pct, float $expected): void
{
self::assertSame($expected, (new PriceCalculator())->withDiscount($amount, $pct));
}
public static function cases(): array
{
return [
'no discount' => [100.0, 0, 100.0],
'ten percent' => [100.0, 10, 90.0],
'free' => [100.0, 100, 0.0],
];
}
}
Jaga Siklus Tetap Cepat
TDD hanya berhasil jika siklus umpan balik berlangsung dalam hitungan detik, bukan menit. Beberapa langkah praktis:
- Jalankan satu file atau gunakan penyaring:
phpunit --filter test_full_discount_is_free. - Gunakan
--testdoxuntuk membaca pengujian sebagai spesifikasi perilaku. - Pastikan pengujian unit bebas dari masukan/keluaran — tanpa basis data, jaringan, atau sistem berkas dalam siklus inti.
vendor/bin/phpunit --testdox --filter PriceCalculatorRefaktorkan Pengujian Juga
Tahap Refaktor mencakup rangkaian pengujian, bukan hanya kode produksi. Hapus duplikasi dengan pembantu dan setUp(), beri nama pengujian berdasarkan perilaku, dan hapus pengujian yang tidak lagi menegaskan hal yang bermakna. Pengujian adalah kode yang akan Anda pelihara selamanya — perlakukan dengan perhatian yang sama.
<?php
use PHPUnit\Framework\TestCase;
final class PriceCalculatorTest extends TestCase
{
private PriceCalculator $calc;
protected function setUp(): void
{
$this->calc = new PriceCalculator(); // shared setup, no duplication
}
public function test_ten_percent(): void
{
self::assertSame(90.0, $this->calc->withDiscount(100.0, 10));
}
}
TDD Membentuk Dependensi
Karena Anda menulis pengujian terlebih dahulu, dependensi yang canggung segera terlihat. Jika suatu kelas sulit dibuat dalam pengujian, itu adalah umpan balik perancangan: masukkan kolaborator sebagai dependensi alih-alih membuatnya dengan new di dalam kelas. Kalkulator diskon di bawah ini menjadi dapat diuji dengan menerima kebijakan pembulatannya, bukan menetapkannya secara langsung — TDD mendorong terciptanya celah tersebut.
<?php
interface RoundingPolicy { public function round(float $v): float; }
final class PriceCalculator
{
public function __construct(private RoundingPolicy $rounding) {}
public function withDiscount(float $amount, float $percent): float
{
return $this->rounding->round($amount - ($amount * $percent / 100));
}
}
// Tests inject a deterministic RoundingPolicy; no hidden global behavior.
Pemeriksaan Singkat
Apa tujuan tahap Merah?
Ringkasan
Anda telah mempraktikkan TDD sebagai disiplin perancangan:
- Merah-Hijau-Refaktor: pengujian yang gagal, kode minimum, lalu pembersihan saat tetap hijau.
- Triangulasi memaksa keumuman; persyaratan baru hadir sebagai pengujian gagal yang baru.
- Penyedia data memadatkan kasus yang stabil;
--filter/--testdoxmenjaga siklus tetap cepat. - Refaktorkan pengujian Anda juga — pengujian tersebut adalah kode berumur panjang.
Berikutnya: objek pengganti pengujian yang fleksibel dengan Mockery.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Alur Kerja Pengembangan Berbasis Pengujian” gratis?
Ya — teks lengkap “Alur Kerja Pengembangan Berbasis Pengujian” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus PHP Academy, upgrade ke CoddyKit PRO. Kursus PHP Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Alur Kerja Pengembangan Berbasis Pengujian”?
Arahkan perancangan dengan siklus merah-hijau-refaktor. Kamu berlatih PHP Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai PHP Academy?
Tidak diperlukan pengalaman sebelumnya. PHP Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.
Berapa lama pelajaran “Alur Kerja Pengembangan Berbasis Pengujian” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran PHP Academy ini?
Ya. Setiap pelajaran PHP Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Alur Kerja Pengembangan Berbasis Pengujian
- Pemalsuan dan Penggantian dengan Mockery
- Pengujian Integrasi dan Fungsional
- Pengujian Mutasi dengan Infection