0Pricing
PHP Academy · Pelajaran

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 --testdox untuk 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 PriceCalculator

Refaktorkan 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/--testdox menjaga 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

  1. Alur Kerja Pengembangan Berbasis Pengujian
  2. Pemalsuan dan Penggantian dengan Mockery
  3. Pengujian Integrasi dan Fungsional
  4. Pengujian Mutasi dengan Infection
← Kembali ke PHP Academy