Gördüğüm gibi, ikinizin de avantajı var ve siz de "dezavantajlı "sınız.
Avantajı, kendinizi rahat hissettiğiniz ve sizin için çalışan bir sisteme sahip olmanızdır. Ürününüzün geçerliliğini doğruladığından memnunsunuz ve muhtemelen farklı bir çerçeve kullanan bir şey için tüm testlerinizi değiştirmeye çalışırken hiçbir iş değeri bulamazsınız. Kodunuzu yeniden düzenleyebiliyorsanız ve testleriniz değişiklikleri alırsa - ya da daha iyisi, testlerinizi değiştirebilirseniz ve mevcut kodunuz yeniden yapılanana kadar testleri geçemezse, tüm tabanlarınız kapsanır. Ancak...
İyi tasarlanmış bir birim test API'sine sahip olmanın avantajlarından biri, modern IDE'lerin çoğunda çok sayıda yerel desteğin olmasıdır. Bu, sabit çekirdekli VI'yı etkilemez ve orada Visual Studio kullanıcılarını küçümseyen kullanıcıları emacs eder, ancak iyi bir IDE kullanan kullanıcılar için testlerinizi hata ayıklama ve bunları içinde yürütme olanağınız vardır. IDE'nin kendisi. Bu iyidir, ancak kullandığınız çerçeveye bağlı olarak daha da büyük bir avantaj vardır ve bu, kodunuzu test etmek için kullanılan dildir .
Dil söylediğimde , bir programlama dilinden bahsetmiyorum, ama bunun yerine, test kodunu bir hikaye gibi okumasını sağlayan akıcı bir sözdizimine sarılmış zengin bir set kelimeden bahsediyorum. Özellikle, BDD çerçevelerinin kullanımı için bir savunucu oldum . Benim kişisel favori DotNet BDD API'sıdır StoryQ, ancak aynı temel amaca sahip, gereksinimler belgesinden bir kavram çıkarmak ve spesifikasyonda nasıl yazıldığına benzer bir şekilde kod yazmaktır. Bununla birlikte, gerçekten iyi API'ler, bir testteki her bir ifadeyi ele geçirerek ve bu ifadenin başarılı bir şekilde çalışıp çalışmadığını veya başarısız olup olmadığını belirterek daha da ileri gider. Bu, tüm testi erken dönmeden yürüttüğünüz için inanılmaz derecede kullanışlıdır, yani hata ayıklama çabalarınız inanılmaz derecede verimli olur, çünkü dikkatinizi tüm testin kodunu çözmenize gerek kalmadan testin başarısız olan kısımlarına odaklamanız gerekir. sıra. Diğer güzel şey, test çıktısının size tüm bu bilgileri göstermesidir,
Neden bahsettiğimin bir örneği olarak aşağıdakileri karşılaştırın:
Ekleri Kullanma:
Assert(variable_A == expected_value_1); // if this fails...
Assert(variable_B == expected_value_2); // ...this will not execute
Assert(variable_C == expected_value_3); // ...and nor will this!
Akıcı bir BDD API kullanarak:
(İtalik bitlerin temel olarak yöntem işaretçileri olduğunu düşünün)
WithScenario("Test Scenario")
.Given(*AConfiguration*) // each method
.When(*MyMethodToTestIsCalledWith*, variable_A, variable_B, variable_C) // in the
.Then(*ExpectVariableAEquals*, expected_value_1) // Scenario will
.And(*ExpectVariableBEquals*, expected_value_2) // indicate if it has
.And(*ExpectVariableCEquals*, expected_value_3) // passed or failed execution.
.Execute();
Şimdi BDD sözdiziminin daha uzun ve daha kötü olduğu ve bu örneklerin korkunç şekilde yapıldığını, ancak belirli bir sistem davranışı sonucunda bir sistemde çok şeyin değiştiği çok karmaşık test durumları için BDD sözdizimi size net bir şekilde sunuyor neyi test ettiğinizi ve test yapılandırmanızın nasıl tanımlandığını gösteren bir açıklama içerir ve bu kodu programcı olmayan bir kişiye gösterebilirsiniz. Buna ek olarak, "değişken_A" her iki durumda da sınamayı geçemezse, Asserts örneği sorunu düzeltene kadar ilk onaylayıcıdan sonra yürütülmezken, BDD API zincirde çağrılan her yöntemi yürütür ve ifadenin münferit bölümleri hatalıydı.
Şahsen bu yaklaşımın, test dilinin müşterilerinizin mantıksal gereksinimlerinden bahsedeceği dil ile aynı olması bakımından daha geleneksel xUnit çerçevelerinden daha iyi çalıştığını düşünüyorum. Buna rağmen, çabalarımı desteklemek için eksiksiz bir test API'sı icat etmeye gerek kalmadan xUnit çerçevelerini benzer bir tarzda kullanmayı başardım ve iddialar hala etkili bir şekilde kısa devre yapacak olsa da, daha temiz okuyorlar. Örneğin:
Nunit Kullanımı :
[Test]
void TestMyMethod()
{
const int theExpectedValue = someValue;
GivenASetupToTestMyMethod();
var theActualValue = WhenIExecuteMyMethodToTest();
Assert.That(theActualValue, Is.EqualTo(theExpectedValue)); // nice, but it's not BDD
}
Bir birim test API'sı kullanarak keşfetmeye karar verirseniz, tavsiyem kısa bir süre için çok sayıda farklı API ile deneme yapmak ve yaklaşımınızı açık tutmaktır. Ben BDD'yi kişisel olarak savunurken, kendi iş ihtiyaçlarınız ekibinizin koşulları için farklı bir şey gerektirebilir. Ancak anahtar, mevcut sisteminizi ikinci olarak tahmin etmekten kaçınmaktır. Gerekirse, mevcut testlerinizi her zaman başka bir API kullanarak birkaç testle destekleyebilirsiniz, ancak kesinlikle her şeyi aynı yapmak için büyük bir test yeniden yazılmasını önermem. Eski kod kullanımdan düştükçe, onu ve testlerini yeni bir kodla ve alternatif bir API kullanarak testlerle kolayca değiştirebilirsiniz ve bu, size herhangi bir gerçek iş değeri vermeyecek büyük bir çabaya yatırım yapmanıza gerek kalmadan. Birim test API'sini kullanma konusunda,