GitHub Copilot 101Orta seviye14 dk

Dokümantasyon, Testler ve Refactoring

Copilot dokümantasyon, test ve refactoring işlerini hızlandırabilir. Davranış sözleşmesi yazmayı, yalnızca kodla doğrulanabilen noktaları belgelemeyi, doğru sınırı mock'lamayı ve refactor sonrasında gözlemlenebilir davranışın değişmediğini kanıtlamayı öğrenin.


Bu derste neler öğreneceksiniz?

  • Copilot'tan dokümantasyon, test veya refactor istemeden önce davranış sözleşmesi yazın
  • Yalnızca kodun doğruladığı davranışı belgeleyin ve kanıtsız garanti eklemeyin
  • Birim ile entegrasyon kapsamı arasından seçim yapın ve yalnızca dış sınırları mock'layın
  • Refactor sonrasında imzaların, hataların ve sonuçların başlangıçla aynı kaldığını doğrulayın
Bu sayfada

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.

Yalnızca kodun kanıtladığını belgeleyin· github-copilot
Zayıf örnek

Seçili fonksiyon için iyi bir docstring yaz.

İyi örnek

Seçili fonksiyonu başka bir geliştirici için belgele. Tek cümlede amacını, her parametreyi ve türünü, dönüş değerini, exception ve hata koşulları, yan etkileri ve kısa bir kullanım örneği. Yalnızca kodun kanıtladığı davranışı kullan, garanti uydurma, belirsiz her şeyi TODO diye etiketle ve dosyayı düzenlemeden docstring'i göster.

Bu prompt neden daha iyi? Her iddiası uygulamada doğrulanabilen bir docstring elde edersiniz. Belirsiz noktalar kesin bir bilgi gibi yazılmak yerine TODO olarak işaretlenir.

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.

Test kodundan önce test matrisi isteyin· github-copilot
Zayıf örnek

Bu fonksiyon için gereken tüm testleri yaz.

İyi örnek

Seçili fonksiyon için test matrisi tasarla. Normal girdileri, tam sınırları, sınırın hemen içini ve dışını, geçersiz girdileri ve uygun olduğunda bağımlılığın başarı ve hata durumlarını ekle. Her durum için birim mi entegrasyon testi mi olduğunu, mock'lanacak sınırı, beklenen sonucu ya da hatayı ve assertion'ın neden public davranışı kontrol ettiğini belirt. Henüz test kodu yazma ve kodda olmayan davranışı çıkarma.

Bu prompt neden daha iyi? Test kodu yazılmadan önce inceleyip daraltabileceğiniz bir durum tablosu elde edersiniz. Böylece testler private yapıyı değil, public davranışı doğrular.

Sözlük araması exception türünü değiştirebilir

Bir koşulu base_fees[destination] ile değiştirmek eşdeğer görünebilir, ancak eksik anahtar artık çağıranların beklediği ValueError yerine KeyError fırlatır. Arama hatasını yakalayıp özgün hatayı (from None ile) yeniden fırlatın ve desteklenmeyen girdiyi özellikle test edin. O yolu hiç kapsamayan geçen testler regresyonu yakalayamaz.

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.

Davranışı koruyan refactor yaması isteyin· github-copilot
Zayıf örnek

Hedef mantığını bir sözlükle temizle ve çalışmaya devam etmesini sağla.

İyi örnek

Hedef koşulunu ücret eşlemesiyle değiştir. Fonksiyon imzasını, desteklenen hedefleri, exception türleri ve mesajlarını, ek ücret eşiğini ve yuvarlamayı koru. Desteklenmeyen hedef hâlâ KeyError değil ValueError fırlatmalı. Yalnızca en küçük yamayı göster ve her değişikliğin koruduğu değişmezi belirt.

Bu prompt neden daha iyi? Arama hatasını özgün ValueError'a dönüştüren try/except yapısı dahil, public sözleşmeyi koruyan küçük bir yama elde edersiniz. Sonucu başlangıç kontrollerinin tamamını yeniden çalıştırarak doğrularsınız.

Şimdi siz deneyin

Tek fonksiyonu güvenle belgeleyin, test edin ve refactor yapın

Başlangıç disiplini kas hafızasına dönüşsün diye döngünün tamamını küçük, saf bir fonksiyonda çalıştırın. Yaklaşık dokuz dakika ayırın.

  1. 01

    Pozitif olmayan ağırlıkları ve desteklenmeyen hedefleri ValueError ile reddeden, 5 kg üzerinde ek ücret ekleyen ve iki ondalığa yuvarlayan shipping_fee(weight_kg, destination) fonksiyonunu oluşturun. Davranış sözleşmesini bir ya da iki cümleyle yazın.

  2. 02

    Copilot'tan yalnızca koddaki olgularla docstring isteyin. Ardından her parametre, dönüş ve exception iddiasını uygulamaya göre kontrol edin.

  3. 03

    İki geçerli hedef, ek ücret sınırı, sıfır ağırlık, negatif ağırlık ve bilinmeyen hedefi kapsayan altı davranış tablosu testi oluşturun. Başlangıç durumunu görmek için testleri çalıştırın.

    İpucu: Refactor tuzağını yakalayan test bilinmeyen hedef testidir.

  4. 04

    Bilinmeyen hedefin KeyError değil ValueError fırlatmaya devam etmesini şart koşarak eşleme tabanlı refactor isteyin. Diff'i okuyun.

  5. 05

    Aynı altı testi yeniden çalıştırın ve bilinmeyen hedef dahil hepsinin hâlâ geçtiğini doğrulayın.

Belgelenmiş ve test edilmiş bir fonksiyon elde edersiniz. Refactor'ın çağıranın görebildiği davranışı değiştirmediğini kanıtlar ve gerçek kodda kullanabileceğiniz bir başlangıç alışkanlığı edinirsiniz.

Aklınızda kalsın

  • Önce davranış sözleşmesi yazın. Bu sözleşme dokümantasyon, test ve refactor için ortak ölçüt sağlar.
  • Gözlemlenebilir davranışı belgeleyin ve kodun doğrulamadığı noktaları TODO olarak işaretleyin.
  • Kanıtlamak istediğiniz davranışa göre birim veya entegrasyon kapsamı seçin. Yalnızca dış sınırları mock'layın.
  • Private yardımcıları veya rastlantısal sıralamayı değil, public sonuçlarla hataları doğrulayın.
  • Refactor öncesi ve sonrasında aynı kontrolleri çalıştırın. İmza, hata ve yuvarlama değişiklikleri için diff'i inceleyin.

Kendinizi test edin

  1. 1. Bir refactor, hedef koşulunu `base_fees[destination]` ile değiştiriyor. Çağıranlar bilinmeyen hedefte eskiden ValueError alırken şimdi KeyError alıyor. En küçük doğru düzeltme nedir?

  2. 2. Gerçek bir veritabanı adapter'ı ile kodunuzun sorgu sonucunda anlaştığını kanıtlamalısınız. Hangi test düzeyi uygundur?

  3. 3. Bir hesaplama için birim testinde neyi mock'lamalısınız?

  4. 4. Hangi docstring ifadesi daha kalıcıdır?

  5. 5. Bir refactor'ı kabul etmeden önce hangi kanıta ihtiyacınız var?

  6. 6. Birim testindeki assertion neyi hedeflemelidir?

Sık sorulan sorular

Bu dersteki terimler

davranış sözleşmesi
Çağıranın güvenebildiği girdileri, çıktıları, hataları, yan etkileri ve sınırları sade dille belirten ve kabul ölçütü olarak kullanılan ifadedir.
refactoring
Dışarıdan gözlemlenebilen davranışı değiştirmeden iç yapıyı değiştirmektir. İmzalar, sonuçlar, hatalar, sıralama ve yan etkiler aynı kalır.
mock
Birim testini deterministik kılmak için HTTP istemcisi, veritabanı ya da saat gibi dış bağımlılığın yerine geçen kontrollü bileşen.
regresyon testi
Hata düzeltmesi ya da refactor boyunca korunması gereken davranışı sabitleyen testtir. Değişiklikten önce başarısız, sonra başarılı olur.

Daha fazla kaynak