tl; Dr.
Pivotal'da Cedar yazdık çünkü Ruby projelerimizde Rspec kullanıyor ve seviyoruz. Cedar, OCUnit'in yerini almak veya onunla rekabet etmek anlamına gelmez; tıpkı Rspec'in Ruby'de BDD tarzı testlere öncülük ettiği gibi Test :: Unit'i elememiş olması gibi BDD tarzı test olasılığını Objective C'ye getirmek anlamına geliyordu. Birini veya diğerini seçmek büyük ölçüde stil tercihleri meselesidir.
Bazı durumlarda Cedar'ı OCUnit'in bizim için çalışma biçimindeki bazı eksikliklerin üstesinden gelmesi için tasarladık. Özellikle, hata ayıklayıcıyı testlerde kullanmak, testleri komut satırından ve CI derlemelerinden çalıştırmak ve test sonuçlarının yararlı metin çıktısını almak istedik. Bunlar sizin için az çok yararlı olabilir.
Uzun cevap
Cedar ve OCUnit gibi iki test çerçevesi arasında karar vermek (örneğin) iki şeye ayrılır: tercih edilen stil ve kullanım kolaylığı. Stil ile başlayacağım, çünkü bu sadece bir fikir ve tercih meselesi; kullanım kolaylığı bir dizi takas olma eğilimindedir.
Stil değerlendirmeleri kullandığınız teknolojiyi veya dili aşar. Ünite tarzı birim testleri, BDD tarzı testlerden çok daha uzun süredir var, ancak ikincisi büyük ölçüde Rspec nedeniyle popülerlik kazandı.
XUnit tarzı testin birincil avantajı, basitliği ve geniş çapta benimsenmesidir (birim testleri yazan geliştiriciler arasında); kod yazmayı düşünebileceğiniz neredeyse her dilde xUnit tarzı bir çerçeve bulunur.
BDD-tarzı çerçeveler xUnit-stiline kıyasla iki ana farklılık gösterir: testi (veya spesifikasyonları) nasıl yapılandırdığınız ve iddialarınızı yazmak için sözdizimi. Benim için yapısal fark ana farklılaştırıcıdır. xUnit testleri, belirli bir test sınıfındaki tüm testler için bir setUp yöntemiyle tek boyutludur. Ancak test ettiğimiz sınıflar tek boyutlu değildir; eylemleri genellikle farklı, potansiyel olarak çelişkili bağlamlarda test etmemiz gerekir. Örneğin, bir addItem: yöntemi ile basit bir ShoppingCart sınıfını düşünün (bu cevabın amaçları için Objective C sözdizimini kullanacağım). Bu yöntemin davranışı, sepet boş olduğunda, sepet başka öğeler içerdiğinden farklı olabilir; kullanıcı bir indirim kodu girmişse değişebilir; Belirtilen öğe ' t seçilen gönderim yöntemiyle gönderilir; Bu olası koşullar birbiriyle kesiştikçe, geometrik olarak artan sayıda olası bağlamla sonuçlanırsınız; xUnit tarzı testlerde bu genellikle testAddItemWhenCartIsEmptyAndNoDiscountCodeAndShippingMethodApplies gibi adlarla birçok yönteme yol açar. BDD tarzı çerçevelerin yapısı, bu koşulları ayrı ayrı düzenlemenizi sağlar, bulduğum bu, tüm vakaları kapsadığımdan emin olmanın yanı sıra bireysel koşulları bulmayı, değiştirmeyi veya eklemeyi kolaylaştırır. Örnek olarak, Cedar sözdizimini kullanarak, yukarıdaki yöntem şöyle görünecektir: xUnit tarzı testlerde bu genellikle testAddItemWhenCartIsEmptyAndNoDiscountCodeAndShippingMethodApplies gibi adlarla birçok yönteme yol açar. BDD tarzı çerçevelerin yapısı, bu koşulları ayrı ayrı düzenlemenizi sağlar, bulduğum bu, tüm vakaları kapsadığımdan emin olmanın yanı sıra bireysel koşulları bulmayı, değiştirmeyi veya eklemeyi kolaylaştırır. Örnek olarak, Cedar sözdizimini kullanarak, yukarıdaki yöntem şöyle görünecektir: xUnit tarzı testlerde bu genellikle testAddItemWhenCartIsEmptyAndNoDiscountCodeAndShippingMethodApplies gibi adlarla birçok yönteme yol açar. BDD tarzı çerçevelerin yapısı, bu koşulları ayrı ayrı düzenlemenizi sağlar, bulduğum bu, tüm vakaları kapsadığımdan emin olmanın yanı sıra bireysel koşulları bulmayı, değiştirmeyi veya eklemeyi kolaylaştırır. Örnek olarak, Cedar sözdizimini kullanarak, yukarıdaki yöntem şöyle görünecektir:
describe(@"ShoppingCart", ^{
describe(@"addItem:", ^{
describe(@"when the cart is empty", ^{
describe(@"with no discount code", ^{
describe(@"when the shipping method applies to the item", ^{
it(@"should add the item to the cart", ^{
...
});
it(@"should add the full price of the item to the overall price", ^{
...
});
});
describe(@"when the shipping method does not apply to the item", ^{
...
});
});
describe(@"with a discount code", ^{
...
});
});
describe(@"when the cart contains other items, ^{
...
});
});
});
Bazı durumlarda, paylaşılan örnek bağlamları kullanarak KURUTABİLECEĞİNİZ aynı iddia kümelerini içeren bağlamlar bulacaksınız.
BDD tarzı çerçeveler ve xUnit tarzı çerçeveler, onaylama (veya "eşleştirici") sözdizimi arasındaki ikinci temel fark, özelliklerin stilini biraz daha hoş hale getirir; bazı insanlar bundan gerçekten hoşlanır, bazıları sevmez.
Bu, kullanım kolaylığı sorununa yol açar. Bu durumda, her çerçevenin artıları ve eksileri vardır:
OCUnit, Cedar'dan çok daha uzundur ve doğrudan Xcode'a entegre edilmiştir. Bu, yeni bir test hedefi belirlemenin basit olduğu ve çoğu zaman testlerin başlatılması ve "sadece işe yaraması" için kolay olduğu anlamına gelir. Öte yandan, bir iOS cihazında çalıştırma gibi bazı durumlarda OCUnit testlerinin çalışmasını neredeyse imkansız bulduk. Cedar specs kurulumu, OCUnit testlerinden biraz daha fazla iş gerektirir, çünkü kütüphaneyi alıp kendinizle bağlantı kurabilirsiniz (asla Xcode'da önemsiz bir görev). Kurulumu kolaylaştırmak için çalışıyoruz ve tüm öneriler memnuniyetle karşılanmaktadır.
OCUnit, yapının bir parçası olarak testleri çalıştırır. Bu, testlerinizi yürütmek için bir yürütülebilir dosya çalıştırmanız gerekmediği anlamına gelir; herhangi bir test başarısız olursa derlemeniz başarısız olur. Bu, testleri çalıştırma işlemini bir adım daha basit hale getirir ve test çıktısı doğrudan derleme çıktı pencerenize gider ve bu da görmeyi kolaylaştırır. Sedir teknik özelliklerinin birkaç nedenden ötürü ayrı çalıştırdığınız bir yürütülebilir dosyaya yerleştirilmesini seçtik:
- Hata ayıklayıcıyı kullanmak istedik. Diğer herhangi bir yürütülebilir dosyayı çalıştırdığınız gibi Cedar özelliklerini de çalıştırırsınız, böylece hata ayıklayıcıyı aynı şekilde kullanabilirsiniz.
- Testlerde kolay konsol kaydı istedik. OCUnit testlerinde NSLog () kullanabilirsiniz, ancak çıktı okumak için derleme adımını açmanız gereken derleme penceresine gider.
- Hem komut satırında hem de Xcode'da test raporlarını okumak kolay istedik. OCUnit sonuçları Xcode'daki derleme penceresinde güzel görünür, ancak komut satırından (veya CI işleminin bir parçası olarak) oluşturmak, test çıktısının çok sayıda ve diğer derleme çıktısıyla karıştırılmasıyla sonuçlanır. Ayrı inşa ve çalıştırma aşamalarında Cedar, çıktıyı ayırır, böylece test çıktısının bulunması kolaydır. Varsayılan Sedir test çalıştırıcısı standart baskı stilini kopyalar "." her geçen spec için, "F" başarısız specs için, vb. Cedar da özel raportör nesneleri kullanma yeteneğine sahiptir, böylece biraz çaba ile, istediğiniz herhangi bir şekilde sonuç çıktısı olabilir.
OCUnit, Objective C için resmi birim test çerçevesidir ve Apple tarafından desteklenir. Apple temel olarak sınırsız kaynaklara sahiptir, bu yüzden bir şey yapılmasını isterse yapılacaktır. Ve sonuçta, bu Apple'ın oynadığımız sanal alanı. Bu madalyonun kapak tarafı, Apple'ın her gün bir bajillion destek talebi ve hata raporu siparişi alması. Hepsini ele alma konusunda kayda değer derecede iyidirler, ancak derhal veya hiç bildirdiğiniz sorunları ele alamayabilirler. Cedar, OCUnit'ten çok daha yeni ve daha az pişmiş, ancak sorularınız veya sorunlarınız veya önerileriniz Cedar posta listesine (cedar-discuss@googlegroups.com) bir mesaj gönderin ve size yardımcı olmak için elimizden geleni yapacağız. Ayrıca, kodu Github'dan (github.com/pivotal/cedar) çatallayın ve eksik olduğunu düşündüğünüz her şeyi ekleyin.
İOS cihazlarda OCUnit testlerini çalıştırmak zor olabilir. Dürüst olmak gerekirse, bunu bir süredir denemedim, bu yüzden daha kolay olabilirdi, ancak son denediğimde herhangi bir UIKit işlevselliği için OCUnit testleri alamadım. Cedar'ı yazdığımızda, hem simülatörde hem de cihazlarda UIKit'e bağlı kodu test edebileceğimizden emin olduk.
Son olarak, birim testi için Cedar yazdık, yani UISpec gibi projelerle gerçekten karşılaştırılamaz. UISpec'i kullanmaya çalıştığımdan bu yana uzun zaman geçti, ancak öncelikle bir iOS cihazında programlı olarak kullanıcı arayüzünü kullanmaya odaklandığımı anladım. Özellikle Apple'ın UIAutomation'ı duyurmak üzereyken Cedar'ın bu tür özellikleri desteklememesine karar verdik.