0Pricing
PHP Academy · Ders

Test Odaklı Geliştirme İş Akışı

Kırmızı-yeşil-yeniden düzenleme döngüsüyle tasarımı yönlendirin.

Test Odaklı Geliştirme İş Akışı, CoddyKit'te ücretsiz bir PHP Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, PHP Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. PHP Academy kursu toplamda 4 dersten oluşur.

TDD Bir Tasarım Aracıdır

Sınama Güdümlü Geliştirme çoğu zaman bir sınama tekniği olarak tanıtılır; ancak asıl değeri tasarım baskısı oluşturmasıdır. Sınamayı önce yazarak, herhangi bir uygulama yazmadan önce bir nesnenin genel arayüzünü, bağımlılıklarını ve sözleşmesini tanımlamak zorunda kalırsınız. Sınamalar bir yan üründür; ürün ise daha iyi tasarımdır.

Kırmızı, Yeşil, Yeniden Düzenle

Bu döngünün üç kesin aşaması vardır:

  • Kırmızı — sıradaki küçük davranış için başarısız bir sınama yazın. Doğru nedenle başarısız olmalıdır.
  • Yeşil — çirkin olsa bile sınamayı geçirecek en küçük kodu yazın.
  • Yeniden düzenleme — yeşil durumda kalırken uygulamayı ve sınamaları temizleyin.

Disiplin önemlidir: Kırmızı aşamasını hiçbir zaman atlamayın (hiçbir şeyi sınamıyor olabilirsiniz), Yeşil aşamasında da gereğinden fazlasını geliştirmeyin.

Kırmızı: Başarısız Sınamayı Önce Yazın

Yüzde indirimi uygulayan bir PriceCalculator oluşturacağız. Henüz var olmayan bir davranış için sınamayla başlayın. Sınamayı çalıştırdığınızda sınıf tanımlı olmadığı için başarısız olmalıdır — bu geçerli bir Kırmızı aşamasıdır.

<?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));
    }
}

Yeşil: Geçmek İçin En Az Kodu Yazın

Şimdi çubuğu yeşile dönüştürecek en küçük uygulamayı yazın. Henüz bunları gerektiren başarısız bir sınama olmadığı için yuvarlama kuralları, doğrulama veya para birimi işlemleri ekleme isteğinize direnin.

<?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)

Genelliği Üçgenlemeyle Sağlamak

Tek bir sınama, sabit kodlamayla karşılanabilir. Üçgenleme — farklı bir ikinci örnek eklemek — uygulamanın genelleme yapmasını zorunlu kılar. Basit çözümün taklit edemeyeceği bir durum ekleyerek gerçek formülün ortaya çıkmasını sağlayın.

<?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));
    }
}

Sınır Durumlarını Belirtim Olarak Kullanmak

TDD'de yeni bir gereksinim, yeni bir başarısız sınamadır. Negatif indirimlerin geçersiz olduğunu varsayalım. Önce bir istisna bekleyen sınamayı yazın; henüz hiçbir şey fırlatılmadığı için sınama başarısız olur. Sınama sözleşmeyi belgeler.

<?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);
    }
}

Yeniden Yeşile Dönün, Sonra Yeniden Düzenleyin

Yeni sınamayı geçirmek için korumayı ekleyin, ardından güvenle yeniden düzenleyin — mevcut sınamalar gerilemeleri yakalar. Yuvarlamayı da ancak bir sınama (veya bilinen bir gereksinim) haklı çıkardığında eklediğimize dikkat edin.

<?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)

Veri Sağlayıcıları Örnekleri Sıkıştırır

Bir davranış kararlı hâle geldiğinde, birçok örnek çiftini veri sağlayıcısı kullanan tek bir parametreli sınamada birleştirin. Bu, Kırmızı/Yeşil döngüsünü hızlı ve amaç tablosunu okunabilir tutar.

<?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],
        ];
    }
}

Döngüyü Hızlı Tutun

TDD yalnızca geri bildirim döngüsü dakikalar değil saniyeler sürdüğünde işe yarar. Uygulanabilecek yöntemler:

  • Tek bir dosyayı veya süzgeci çalıştırın: phpunit --filter test_full_discount_is_free.
  • Sınamaları bir davranış belirtimi olarak okumak için --testdox kullanın.
  • Birim sınamalarını G/Ç işlemlerinden arındırın — iç döngüde veritabanı, ağ veya dosya sistemi kullanmayın.
vendor/bin/phpunit --testdox --filter PriceCalculator

Sınamaları da Yeniden Düzenleyin

Yeniden düzenleme aşaması yalnızca üretim kodunu değil, sınama paketini de kapsar. Yardımcılarla ve setUp() ile yinelemeleri kaldırın, sınamaları davranışlarına göre adlandırın ve artık anlamlı hiçbir şeyi doğrulamayan sınamaları silin. Sınamalar sonsuza kadar bakımını yaptığınız koddur — onlara da aynı özeni gösterin.

<?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 Bağımlılıkları Şekillendirir

Sınamayı önce yazdığınız için kullanımı zor bağımlılıklar hemen görünür hâle gelir. Bir sınıfı bir sınamada oluşturmak zorsa bu, bir tasarım geri bildirimidir: işbirlikçileri içeride new ile oluşturmak yerine dışarıdan verin. Aşağıdaki indirim hesaplayıcısı, yuvarlama politikasını sabit kodlamak yerine kabul ederek sınanabilir hâle gelir — TDD bu ayrım noktasını ortaya çıkarmıştır.

<?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.

Hızlı Kontrol

Kırmızı aşamasının amacı nedir?

Özet

TDD'yi bir tasarım disiplini olarak uyguladınız:

  • Kırmızı-Yeşil-Yeniden Düzenleme: başarısız sınama, en az kod, ardından yeşil durumda temizlik.
  • Üçgenleme genelliği zorunlu kılar; yeni gereksinimler yeni başarısız sınamalar olarak gelir.
  • Veri sağlayıcıları kararlı durumları sıkıştırır; --filter/--testdox döngüyü hızlı tutar.
  • Sınamalarınızı da yeniden düzenleyin — bunlar uzun ömürlü koddur.

Sırada: Mockery ile esnek sınama sahte nesneleri.

Sıkça Sorulan Sorular

“Test Odaklı Geliştirme İş Akışı” dersi ücretsiz mi?

Evet — “Test Odaklı Geliştirme İş Akışı” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve PHP Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. PHP Academy kursu toplamda 4 dersten oluşur.

“Test Odaklı Geliştirme İş Akışı” dersinde ne öğreneceğim?

Kırmızı-yeşil-yeniden düzenleme döngüsüyle tasarımı yönlendirin. PHP Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

PHP Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te PHP Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.

“Test Odaklı Geliştirme İş Akışı” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu PHP Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her PHP Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Test Odaklı Geliştirme İş Akışı
  2. Mockery ile Taklit ve Sahte Nesne Kullanımı
  3. Entegrasyon ve İşlevsel Test
  4. Infection ile Mutasyon Testi
← PHP Academy Sayfasına Dön