iOS Testleri / Teknik Özellikler TDD / BDD ve Entegrasyon ve Kabul Testi


229

İPhone'da davranış odaklı geliştirme için kullanılacak en iyi teknolojiler nelerdir? Ve bu teknolojilerin sağlıklı kullanımını gösteren bazı açık kaynaklı örnek projeler nelerdir? Bulduğum bazı seçenekler:


Birim Testi

Test :: Birim Stili

  1. İOS Geliştirme Kılavuzu: Birim Test Uygulamaları ve diğer OCUnit referanslarında açıklandığı gibi OCUnit / SenTestingKit .
  2. TUTMAK
  3. GHUnit
  4. Mac için Google Araç Kutusu: iPhone Birim Testi

RSpec Tarzı

  1. Kivi (ayrıca alay ve beklentilerle birlikte gelir)
  2. Sedir
  3. İksiz 'iOS-Kabul-Test özelliklerinde gösterildiği gibi UI Otomasyonu ile Yasemin

Kabul testleri

Selenyum Tarzı

  1. UI Automation (cihazda çalışır)

    GÜNCELLEME: Zucchini Framework , Salatalık ve Kullanıcı Arayüzü Otomasyonunu harmanlıyor gibi görünüyor! :)

    Eski Blog Yazıları:

  2. UISpecRunner ile UISpec

  3. FoneMonkey

Salatalık Stili

  1. Frank ve iCuke ( Salatalık tabanlı iPhone konuşmasıyla buluşuyor )

  2. KIF (Fonksiyonel Keep It) tarafından Meydanı

  3. Zucchini Framework , test yazmak için Salatalık sözdizimini ve adım tanımları için CoffeeScript kullanır.

İlaveler

Sonuç

Açıkçası, bu sorunun doğru bir cevabı yok, ama şu anda gitmeyi seçtiğim şey:

Birim testi için XCode 4'te OCUnit / SenTestingKit kullanıyordum . Çok basit ve sağlam. Ancak, BDD'nin TDD'yi tercih ediyorum ( RSpec neden Test :: Unit'den daha iyi ?) Çünkü sözlerimiz dünyamızı yaratıyor. Şimdi ARC & Kiwi kod tamamlama / otomatik tamamlama ile Kiwi kullanıyorum . OCUnit'in üzerine inşa edilmiş ve RSpec tarzı eşleştiriciler ve alaylar / saplamalar ile birlikte geldiğinden Kivi'yi Cedar'a tercih ederim. GÜNCELLEME: Şimdi OCMock'a bakıyorum çünkü şu anda Kiwi, ücretsiz köprülü cisimleri desteklemiyor .

Kabul testi için UI Automation kullanıyorum çünkü harika. Her test senaryosunu kaydetmenizi sağlar ve yazma testlerini otomatik hale getirir. Ayrıca, Apple bunu geliştirir ve bu yüzden umut verici bir geleceği vardır. Ayrıca cihazda ve Bellek sızıntılarını göstermek gibi diğer harika özelliklere izin veren Aletlerden de çalışır. Ne yazık ki, UI Automation ile Objective-C kodunu nasıl çalıştıracağımı bilmiyorum, ancak Frank & iCuke ile yapabilirsiniz. Bu yüzden, alt düzey Objective-C öğelerini birim testleri ile test edeceğim veya UIButtonyalnızca tıklandığında Objective-C kodunu çalıştıracak TESTyapı yapılandırması için s oluşturacağım .

Hangi çözümleri kullanıyorsunuz?

ilgili sorular


1
en az birkaç ay önce çok önemli laboratuvarların sedir kullandığını biliyorum. (um sanırım onun açık github hesabında verilen bu açıktır). Böyle bir dükkandan destek alarak, bu benim seçimim olurdu.
Jed Schneider

1
İyi bir noktaya değindin. Ama sonra tekrar, Apple Cedar değil, birim test çerçevelerini kullanmanızı önerir, değil mi? Yani, Pivotal Vs. Elma. Hangisi ile gitmeli?
'17

2
Frank, KIF ve UIAutomation'ı bu konunun okuyucularına ilgi duyabilecek bir karşılaştırma yazdım sgleadow.github.com/blog/2011/10/26/…
Stew

Yanıtlar:


53

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.


Kapsamlı yanıt için teşekkürler. RSpec kitabını okuyacağım ve Ceder'i deneyeceğim. UISpec'i Selenyum bölümüne taşıdım ve orada da UIAutomation ekledim. UIAutomation hakkındaki blog yazınızı okuyorum. Frank aslında çok daha basit ve daha okunabilir görünüyor, artı daha iyi belgelenmiş, bu yüzden bununla başlamayı düşünüyorum. Umarım UIAutomation kadar güçlüdür. UIAutomation'ın yaşam döngüsü sorunlarını test edebileceğini söylüyorsunuz. İCuke de yapabilir miyim acaba ...
ma11hew28

8

Frank'i kabul testi karýţmasýna atmam gerekecek . Bu oldukça yeni bir ektir, ancak benim için şimdiye kadar mükemmel çalıştı. Ayrıca, icuke ve diğerlerinden farklı olarak, aslında aktif olarak üzerinde çalışılmaktadır.


5

Test odaklı geliştirme için, GHUnit'i kullanmayı seviyorum , kurulumu çok kolay ve hata ayıklama için de harika çalışıyor.


Teşekkürler. Bunu gördüm ama bundan bahsetmeyi unuttum.
ma11hew28

GHUnit için PLus 1. OCMock ile çok kullandı. Kurulumu, genişletmesi ve çok güvenilir bir şekilde çalışması çok kolaydır.
drekka

4

Harika Liste!

İOS uygulamalarını UI test etmek için başka bir ilginç çözüm buldum.

Kabak Çerçevesi

Dayanmaktadır UIAutomation. Çerçeve, Salatalık tarzında ekran merkezli senaryolar yazmanıza izin verir. Senaryolar Simülatörde ve bir konsoldan cihazda yürütülebilir (CI dostudur).

İddialar ekran görüntüsü tabanlıdır. Esnek görünmüyor, ancak vurgulanan ekran karşılaştırması ile güzel bir HTML raporu alıyor ve piksel tam iddiasına sahip olmak istediğiniz bölgeleri tanımlayan maskeler sağlayabilirsiniz.

Her ekran açıklanmalı CoffeScriptve kendi aracı yakut olarak yazılmalıdır. Bu bir çeşit poliglott kabus, ama araç için güzel bir soyutlama sağlar UIAutomationve ekranlar tanımlandığında QA kişi için bile yönetilebilir.


Sıkı! Teşekkürler. Bunu yukarıdaki soruya ekledim.
ma11hew28

2

Kabul testleri için iCuke ve birim testleri için Cedar seçerdim. UIAutomation, Apple için doğru yönde atılmış bir adımdır, ancak araçların sürekli entegrasyon için daha iyi desteğe ihtiyacı vardır; örneğin UIAutomation testlerinin Cihazlarla otomatik olarak yürütülmesi şu anda mümkün değildir.


1

GHUnit birim testleri için iyidir; entegrasyon testleri için UISpec'i biraz başarılı bir şekilde kullandım (burada github çatalı: https://github.com/drync/UISpec ), ancak hafif bir kurulum olacağına söz verdiğinden iCuke'yi denemeyi dört gözle bekliyorum ve RSpec ve Salatalık gibi iyiliği test eden rayları kullanın.



0

OCDSpec2'yi gerçekten çok seviyorum ama önyargılıyım, OCDSpec'i yazdım ve ikincisine katkıda bulundum.

İOS'ta bile çok hızlı, çünkü OCUnit'in üstüne koymak yerine sıfırdan inşa edildi. RSpec / Jasmine sözdizimi de vardır.

https://github.com/ericmeyer/ocdspec2

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.