Doğru mu yapıyorum? Eğer tam olarak ne değiştirmem gerekiyorsa
Sadece bu kısa açıklamadan söylemek zor, ama bu, hayır, şüpheli değil doğru yapıyor. Not: Yaptığınız şeyin işe yaramadığını veya bir şekilde kötü olduğunu söylemiyorum, ancak TDD yapmıyorsunuz. Orta "D", "Sürülen" anlamına gelir, testler her şeyi, geliştirme sürecini, kodu, tasarımı, mimariyi ve her şeyi yönlendirir .
Testler size ne yazacağınızı, ne zaman yazacağınızı, sonra ne yazacağınızı, ne zaman yazmayı durduracağınızı söyler. Size tasarımı ve mimariyi anlatıyorlar. (Tasarım ve mimari koddan yeniden düzenleme yoluyla ortaya çıkar.) TDD testle ilgili değildir. İlk önce testler yazmakla bile ilgili değil: TDD, testlerin sizi yönlendirmesine izin vermekle ilgilidir, önce bunları yazmak sadece gerekli bir önkoşuldur.
Kodu gerçekten yazmanızın ya da tamamen etmenizin önemi yoktur: kafanıza kod (iskelet) yazıyorsunuz, daha sonra bu kod için testler yazıyorsunuz. Bu TDD değil.
Bu alışkanlığı bırakmak zor . Gerçekten, gerçekten zor. Özellikle deneyimli programcılar için zor görünüyor.
Keith Braithwaite, TDD'yi Demek İstediğiniz Gibi adlandırdığı bir egzersiz yarattı . Kesinlikle izlemeniz gereken ve sizi TDD'yi daha titiz bir şekilde uygulamaya yönlendirecek şekilde tasarlanmış bir dizi kuraldan ( Bob Amca'nın Üç TDD Kuralına dayanır , ancak çok daha katı) oluşur. Çift programlama ile en iyi şekilde çalışır (böylece çiftiniz kuralları ihlal etmediğinizden emin olabilir) ve bir eğitmen.
Kurallar:
- Tam olarak yeni bir test yazın, mümkün olan en küçük test bir çözüm yönünü gösteriyor gibi görünüyor
- Bakın başarısız; derleme hataları hata olarak sayılır
- Test yönteminde yapabileceğiniz en az uygulama kodunu yazarak (1) 'den testi yapın .
- Yeniden çoğaltma kaldırmak için refactor, aksi takdirde tasarım geliştirmek için gerektiği gibi. Bu hareketleri kullanma konusunda katı olun:
- yeni bir yöntem istiyorsunuz — zamanı yeniden düzenleyene kadar bekleyin, ardından… bunlardan birini yaparak yeni (test dışı) yöntemler oluşturun ve başka bir yolla:
- tercih edilen: test sınıfında yeni bir yöntem oluşturmak için (3) 'e göre oluşturulan uygulama kodunda Extract Method yapın veya
- Gerekirse: (3) uyarınca uygulama kodunu mevcut bir uygulama yöntemine taşıyın
- yeni bir sınıf istiyorsunuz — zamanı yeniden düzenleyene kadar bekleyin, sonra… bir Taşıma Yöntemi için bir hedef sağlamak ve başka bir sebep olmadan test dışı sınıflar oluşturun
- Taşıma Yöntemini uygulayarak uygulama sınıflarını yöntemlerle doldurun ve başka bir yol kullanmayın
Tipik olarak, bu, kafanızda tasarımın ne olması gerektiğini hayal ederek, sıkça uygulanmış "sözde TDD yöntemi" ne göre çok farklı tasarımlara yol açacak, daha sonra bu tasarımı zorlamak için testler yazacak, daha önce tasarladığınız tasarımı uygulayacak testler".
Bir grup insan sahte TDD kullanarak tic tac toe oyunu gibi bir şey uyguladığında, genellikle Board
3 × 3 Integer
s dizisi olan bir tür sınıf içeren çok benzer tasarımlarla sonuçlanırlar . Ve programcıların en azından bir kısmı aslında bu sınıfı testler olmadan yazmış olacaklar çünkü “buna ihtiyaç duyacaklarını biliyorlar” ya da “testlerini yazmak için bir şeye ihtiyaçları var”. Bununla birlikte, aynı grubu TDD'yi Kastettiğiniz gibi uygulamaya zorladığınızda, genellikle çok farklı tasarımların geniş bir çeşitliliği ile sonuçlanırlar, çoğu zaman a'ya benzer bir şey bile kullanmazlar Board
.
Yazdığınız sınavın yeterli olup olmadığını tespit etmenin bir yolu var mı?
Tüm iş gereksinimlerini karşıladıklarında. Testler, sistem gereksinimlerinin bir kodlamasıdır.
1 + 1 = 2'ye eşdeğer olabilecek çok basit işlevsellik için test yazmak iyi bir uygulama mı yoksa sadece bir abartı mı?
Yine, geriye doğru var: işlevsellik için test yazmıyorsunuz. Testler için işlevsellik yazıyorsunuz. Testi geçmek için işlevsellik önemsiz ise, bu harika! Bir sistem gereksinimini karşıladınız ve bunun için çok çalışmak zorunda kalmadınız!
İşlevselliği değiştirmek ve buna bağlı olarak gereksinimin değişip değişmediğini test etmek iyi midir?
Hayır. Bir gereksinim değişirse, bu gereksinime karşılık gelen testi değiştirirsiniz, başarısız olduğunu izleyin, sonra geçmesi için kodu değiştirin. Testler her zaman önce gelir.
Bunu yapmak zor. Bir noktaya ulaşmak için bir çeşit "kas hafızası" oluşturmak için düzinelerce, belki de yüzlerce saatlik kasıtlı uygulamaya ihtiyacınız var , burada son tarih belirdiğinde ve baskı altındayken, bunu düşünmenize bile gerek yok ve bunu yapmak çalışmanın en hızlı ve en doğal yolu haline gelir .