Bir refactor, if/elif zincirini sözlük aramasıyla değiştiriyor. Testler geçiyor, diff düzenli görünüyor. Merge'den bir hafta sonra ValueError bekleyen bir çağıran, yakalanmamış KeyError nedeniyle çöküyor. Test takımı yeşildi ama public davranış değişmişti. Dokümantasyon ve testlerde de aynı tür boşluk oluşabilir.
Belgele, test et ve refactor yap
Copilot'u sizin yönettiğiniz döngünün içinde tutun. Mevcut davranışı okuyun, davranış sözleşmesini yazın, plan veya taslak isteyin, yanıtla diff'i inceleyin ve test ya da doğrudan kontrol çalıştırın. Kanıt bir sorun gösterdiğinde düzeltmeye dönün. Davranış sözleşmesi, çağıranların gözlemleyip güvenebileceği girdileri, dönüş değerlerini, hataları, yan etkileri ve önemli sınırları belirtir. "Pozitif ağırlık ve desteklenen hedef için ücreti iki ondalığa yuvarlayarak döndür. Pozitif olmayan ağırlıkları ve desteklenmeyen hedefleri ValueError ile reddet." cümlesi Copilot'a kısıtları, size de kabul ölçütlerini verir.
Sözleşme olmadan istek ve inceleme açık uçlu kalır. Sözleşmeyle birlikte dokümantasyonun karşılaştırılacağı olgular, testlerin doğrulayacağı davranış ve refactor'ın koruyacağı değişmez tanımlanmış olur. Bu dersteki üç görevde de aynı yaklaşımı farklı bir çıktıya uygularsınız.
Sıra önemlidir. Önce mevcut davranışı okuyun, sonra sözleşmeyi yazın ve en son Copilot'tan çıktı isteyin. Doğrudan "Bunun testlerini yaz" demek hem görevi hem de inceleme ölçütünü belirsiz bırakır. Çağıranın gözlemleyebildiği davranışı yazmak için ayıracağınız 30 saniye, sonraki bütün adımlara somut bir ölçü kazandırır.
Dokümantasyonu güvenilir kılan nedir?
Yararlı dokümantasyon gözlemlenebilir davranışı anlatır. "Ücreti iki ondalık basamağa yuvarlayarak döndürür" ifadesi hesap yeniden düzenlense de geçerliliğini korur. "Taban ücreti ve ek ücreti toplar" bugünkü uygulamayı anlatır ve refactor sonrasında eskiyebilir. Prompt'ta çağıranın ihtiyaç duyduğu amacı, parametreleri ve türleri, dönüş değerini, exception'ları, yan etkileri, sınırları ve kısa bir kullanım örneğini isteyin.
Üretilen dokümantasyonun temel riski, tahminlerin garanti gibi yazılmasıdır. Copilot fonksiyonun üretmediği bir exception'ı veya kodun söz vermediği bir sıralamayı belgeleyebilir. Gelecekteki çağıran da bu ifadeye güvenebilir. Prompt'ta yalnızca kodla doğrulanan davranışın kullanılmasını ve belirsiz noktaların TODO olarak işaretlenmesini isteyin. Ardından her parametre, exception, yan etki ve örnek iddiasını uygulamayla karşılaştırın. Doğrulanmamış dokümantasyon iyi biçimlendirilmiş bir tahminden ibarettir.
Birim mi entegrasyon mu, neyi mock'lamalısınız?
Birim testi tek bir fonksiyonu yalıtır ve bağımlılıklarını kontrol eder. Entegrasyon testi ise iki veya daha fazla gerçek bileşenin protokol, şema ya da biçim konusunda uyumlu olduğunu kanıtlar. Seçimi doğrulamak istediğiniz davranışa göre yapın. Tek fonksiyon içindeki hesap, doğrulama veya hata dönüştürme için birim testi uygundur. Gerçek veritabanı adapter'ı ile kodunuzun sorgu sonucu üzerinde anlaştığını kanıtlamak için entegrasyon testi gerekir. Bu durumda adapter'ı mock'lamak görmek istediğiniz gerçek etkileşimi gizler.
Test durumlarını uygulama dallarından değil, davranış kategorilerinden çıkarın. Normal girdiyi, tam sınırı, sınırın hemen içindeki ve dışındaki değerleri, reddedilecek geçersiz girdiyi kapsayın. Bağımlılık varsa başarı ve hata yollarını da ekleyin. Üretilen test matrisi hızlı bir taslak olabilir. Sözleşmenin tanımlamadığı davranışı varsayan satırları koda dönüştürmeden önce çıkarın.
Birim testinde yalnızca HTTP istemcisi, veritabanı, saat veya e-posta servisi gibi dış sınırı mock'layın. Test ettiğiniz iş mantığını mock'lamak, davranışı kanıtlamayan başarılı testler üretir. Assertion'ları dönen değer, public hata veya gerekli bileşen çağrısı gibi gözlemlenebilir davranışa yöneltin. Private yardımcı adını ya da rastlantısal işlem sırasını doğrulamak testi uygulamaya bağlar. Böyle bir test zararsız refactor'da bozulabilir, gerçek regresyonda ise geçebilir. Tekrar kullanılabilir kurulum için fixture kullanabilirsiniz, fakat senaryonun girdileri ve beklenen sonuçları testte görünür tutun.
Bir checkout fonksiyonunun vergi istemcisini çağırdığını ve ağ zaman aşımını QuoteUnavailableError gibi bir domain hatasına dönüştürdüğünü düşünün. Birim testi bu istemciyi mock'lar. Bir durumda sabit oran döndürür, diğerinde zaman aşımı üretir. Test ilk durumda toplamı, ikinci durumda public domain hatasını doğrular. Gerçek ağ isteği yapmaz ve private değişkenleri incelemez. Mock'ları dış, yıkıcı, yavaş veya deterministik olmayan sınırlar için kullanın. Kargo ek ücreti gibi saf bir hesapta gerçek girdi değerleri yeterlidir.
Refactor için başlangıç ölçütü oluşturun
Refactoring, dışarıdan gözlemlenebilen davranışı korurken iç yapıyı değiştirir. Karmaşık ifadeye ad vermek, yardımcı fonksiyon çıkarmak veya yinelenen koşulları arama tablosuyla değiştirmek buna örnektir. İmza, dönüş değeri, exception türü, yuvarlama kuralı, değerlendirme sırası veya yan etki değişirse artık davranış da değişmiştir.
Refactor için bir başlangıç ölçütü gerekir. Koda dokunmadan önce mevcut testleri çalıştırın veya birkaç doğrudan çağrıyı sonuçlarıyla kaydedin. Değişiklikten sonra aynı kontrolleri tekrarlayın. Açıklamayı değil, diff'in kendisini okuyun. Public imza, dönüş değeri ve türü, exception türü ve mesajı, doğrulama sırası, yuvarlama, sıralama ve bağımlılık çağrılarını özellikle kontrol edin.
Sözlük araması örneği riski açıkça gösterir. if destination == "domestic" … elif … else raise ValueError yapısını base = base_fees[destination] biçimine çevirmek daha temiz görünebilir. Ancak doğrudan arama, bilinmeyen hedef için eski ValueError yerine KeyError üretir. Davranışı koruyan sürüm arama hatasını yakalar, mevcut ValueError mesajını yeniden üretir ve iç KeyError bilgisinin sızmaması için from None kullanır. Yapı iyileşirken public sözleşme aynı kalır.
Kanıt, desteklenmeyen hedef testi dahil aynı kontrollerin değişiklikten önce ve sonra geçmesidir. Yalnızca normal akışı kapsayan testler bu regresyonu yakalayamaz. Copilot taslağı hızlandırabilir, ancak doğrulama sorumluluğu sizdedir. Bu alışkanlığı bir sonraki Gizlilik, Planlar ve GH-300 Yolu dersinde genişleteceksiniz.