Perspektif:
Öyleyse bir adım geriye gidip TDD'nin bize yardım etmeye çalıştığını soralım. TDD, kodumuzun doğru olup olmadığını belirlememize yardımcı olmaya çalışıyor. Doğru olarak, "kod iş gereksinimlerini karşılıyor mu?" Satış noktası, gelecekte değişikliklerin gerekli olacağını biliyoruz ve bu değişiklikleri yaptıktan sonra kodumuzun doğru kalmasını sağlamak istiyoruz.
Bu perspektifi yükseltirim, çünkü detaylarda kaybolmanın ve elde etmeye çalıştığımız şeyleri gözden kaçırmanın kolay olduğunu düşünüyorum.
İlkeler - SAP:
TDD'de uzman olmasam da, Tek Onaylama Prensibi'nin (SAP) öğretmeye çalıştığının bir parçası olduğunu düşünüyorum. SAP "her seferinde bir şeyi test et" şeklinde yeniden ifade edilebilir. Ancak TOTAT, dili SAP kadar kolay yuvarlamaz.
Her seferinde bir şeyi test etmek, bir vakaya odaklanmanız anlamına gelir; bir yol; bir sınır koşulu; bir hata durumu; biri ne olursa olsun test başına. Ve bunun arkasındaki itici fikir, test durumu başarısız olduğunda neyin kırıldığını bilmeniz gerektiğidir, böylece sorunu daha hızlı çözebilirsiniz. Bir test içinde birden fazla koşulu (yani birden fazla şey) test ederseniz ve test başarısız olursa, ellerinizde çok daha fazla işiniz olur. Öncelikle birden fazla vakanın hangisinin başarısız olduğunu tanımlamanız ve ardından bu vakanın neden başarısız olduğunu anlamanız gerekir .
Bir seferde bir şeyi test ederseniz, arama kapsamınız çok daha küçüktür ve kusur daha hızlı tanımlanır. "Her seferinde bir şeyi test et" seçeneğinin, bir kerede birden fazla işlem çıktısına bakmanıza gerek olmadığını unutmayın. Örneğin, bir "bilinen iyi yol" test ederken, belirli bir sonuç değeri foo
yanı sıra başka bir değer görmek için bekleyebilirsiniz bar
ve bunu testimin bir foo != bar
parçası olarak doğrulayabilir . Anahtar, çıkış kontrollerini test edilen duruma göre mantıksal olarak gruplandırmaktır.
İlkeler - PMP:
Benzer şekilde, sanırım Özel Yöntem Prensibi'nin (PMP) bize ne öğretmesi gerektiği konusunda biraz eksiksiniz. PMP, sisteme bir kara kutu gibi davranmamızı teşvik ediyor. Belirli bir girdi için, belirli bir çıktı almalısınız. Kara kutunun çıktıyı nasıl oluşturduğu umrunda değil. Yalnızca çıktılarınızın girdilerinizle hizalanmasını önemsersiniz.
PMP, kodunuzun API yönlerine bakmak için gerçekten iyi bir perspektiftir. Ayrıca, test etmek zorunda olduğunuz şeyleri kapsamanıza da yardımcı olabilir. Arayüz noktalarınızı tanımlayın ve sözleşmelerinin şartlarını karşıladıklarını doğrulayın. Arayüzün arkasındaki (diğer adıyla özel) yöntemlerin işlerini nasıl yaptığına dikkat etmeniz gerekmez. Sadece yapmaları gerekeni yaptığını doğrulamanız gerekiyor.
Uygulamalı TDD ( sizin için )
Durumunuz sıradan bir uygulamanın ötesinde biraz kırışıklık gösterir. Uygulamanızın yöntemleri durumsaldır, bu nedenle çıktıları yalnızca girişe değil, daha önce yapılanlara da bağlıdır. Eminim <insert some lecture>
burada devletin korkunç ve falan filan falan olması gerekir, ama bu gerçekten probleminizi çözmeye yardımcı olmaz.
Çeşitli potansiyel durumları ve bir geçişi tetiklemek için ne yapılması gerektiğini gösteren bir çeşit durum diyagramı tablonuz olduğunu varsayacağım. Bunu yapmazsanız, bu sistem için iş gereksinimlerini ifade etmeye yardımcı olacağından buna ihtiyacınız olacak.
Testler: İlk olarak, durum değişikliğini yürürlüğe koyan bir dizi testle sonuçlanacaksınız. İdeal olarak, meydana gelebilecek tüm durum değişikliklerini uygulayan testlere sahip olacaksınız, ancak tam olarak gitmeniz gerekmeyebilecek birkaç senaryo görebiliyorum.
Ardından, veri işlemeyi doğrulamak için testler oluşturmanız gerekir. Veri işleme testlerini oluşturduğunuzda bu durum testlerinden bazıları yeniden kullanılacaktır. Örneğin, ve durumlarına Foo()
dayalı olarak farklı çıktılara sahip bir yönteminiz olduğunu varsayalım . Eğer kullanmak isteyeceksiniz "ne zaman çıktı test etmek için bir kurulum adımı olarak testi içindedir ".Init
State1
ChangeFooToState1
Foo()
State1
Bu yaklaşımın arkasında bahsetmek istediğim bazı çıkarımlar var. Spoiler, işte safları çileden çıkaracağım
Öncelikle, bir şeyi bir durumda test ve başka bir durumda kurulum olarak kullandığınızı kabul etmelisiniz. Bir yandan, bu doğrudan SAP'nin ihlali gibi görünüyor. Ancak mantıklı ChangeFooToState1
olarak iki amaca sahip olursanız, yine de SAP'nin bize ne öğrettiğinin ruhunu karşılıyorsunuz demektir. Foo()
Durumların değiştiğinden emin olmanız gerektiğinde , ChangeFooToState1
test olarak kullanırsınız . Ve ne zaman " Foo()
in State1
" çıkışını doğrulamanız gerektiğinde ChangeFooToState1
kurulum olarak kullanıyorsunuz .
İkinci madde, pratik açıdan, sisteminiz için tamamen rastgele birim testi istemeyeceğinizdir. Çıkış doğrulama testlerini çalıştırmadan önce tüm durum değişikliği testlerini çalıştırmalısınız. SAP, bu siparişin arkasındaki ana prensiptir. Neyin belirgin olması gerektiğini belirtmek için - test olarak başarısız olursa bir şeyi kurulum olarak kullanamazsınız.
Bir araya getirmek:
Durum diyagramınızı kullanarak geçişleri kapsayan testler oluşturacaksınız. Yine, diyagramınızı kullanarak, durum tarafından yönlendirilen tüm giriş / çıkış veri işleme durumlarını kapsayacak şekilde testler oluşturursunuz.
Bu yaklaşımı izlerseniz, bloated, complicated, long, and difficult to write
testlerin yönetilmesi biraz daha kolay olmalıdır. Genel olarak, daha küçük olmalılar ve daha özlü olmalılar (yani daha az karmaşık). Testlerin daha ayrıştırılmış veya modüler olduğunu da fark etmelisiniz.
Şimdi, sürecin tamamen ağrısız olacağını söylemiyorum çünkü iyi testler yazmak biraz çaba gerektiriyor. Ve bazıları hala zor olacak çünkü birkaç vakanızın üzerinde ikinci bir parametre (durum) eşliyorsunuz. Ve bir kenara, vatansız bir sistemin neden testler yapmak için daha kolay olduğu biraz daha açık olmalıdır. Ancak bu yaklaşımı uygulamanıza uyarlarsanız, uygulamanızın doğru çalıştığını kanıtlayabildiğinizi bulmalısınız.