Pengujian iOS / Spesifikasi TDD / BDD dan Pengujian Integrasi & Penerimaan

229

Apa teknologi terbaik untuk digunakan untuk pengembangan yang didorong oleh perilaku pada iPhone? Dan apa sajakah contoh proyek open source yang menunjukkan penggunaan teknologi ini secara sehat? Berikut ini beberapa opsi yang saya temukan:


Pengujian Unit

Uji :: Gaya Unit

  1. OCUnit / SenTestingKit sebagaimana dijelaskan dalam Panduan Pengembangan iOS: Aplikasi Pengujian Unit & referensi OCUnit lainnya .
  2. MENANGKAP
  3. GHUnit
  4. Google Toolbox untuk Mac: Pengujian Unit iPhone

Gaya RSpec

  1. Kiwi (yang juga dilengkapi dengan ejekan & harapan)
  2. Cedar
  3. Jasmine dengan UI Automation seperti yang ditunjukkan dalam spesifikasi iOS-Acceptance-Testing cekatan

Ujian penerimaan

Gaya Selenium

  1. Otomasi UI (berfungsi pada perangkat)

    UPDATE: Zucchini Framework tampaknya memadukan Cucumber & UI Automation! :)

    Posting Blog Lama:

  2. UISpec dengan UISpecRunner

  3. FoneMonkey

Gaya mentimun

  1. Frank dan iCuke (berdasarkan Mentimun memenuhi pembicaraan iPhone )

  2. KIF (Keep It Functional) oleh Square

  3. Zucchini Framework menggunakan sintaks Mentimun untuk menulis tes dan menggunakan CoffeeScript untuk definisi langkah.

Penambahan

Kesimpulan

Yah, jelas, tidak ada jawaban yang tepat untuk pertanyaan ini, tapi inilah yang saya pilih saat ini:

Untuk pengujian unit, saya menggunakan OCUnit / SenTestingKit di XCode 4. Sederhana & solid. Tapi, saya lebih suka bahasa BDD daripada TDD ( Mengapa RSpec lebih baik daripada Test :: Unit ?) Karena kata-kata kami menciptakan dunia kami. Jadi sekarang, saya menggunakan Kiwi dengan ARC & melengkapi kode Kiwi / pelengkapan otomatis . Saya lebih suka Kiwi daripada Cedar karena itu dibangun di atas OCUnit dan dilengkapi dengan pencocokan gaya RSpec & ejekan / bertopik. UPDATE: Saya sekarang melihat ke dalam OCMock karena, saat ini, Kiwi tidak mendukung mematikan objek jembatan bebas pulsa .

Untuk pengujian penerimaan, saya menggunakan UI Automation karena itu mengagumkan. Ini memungkinkan Anda merekam setiap test case, membuat tes menulis otomatis. Juga, Apple mengembangkannya, dan karenanya memiliki masa depan yang menjanjikan. Ini juga berfungsi pada perangkat dan dari Instrumen, yang memungkinkan untuk fitur keren lainnya, seperti menunjukkan kebocoran memori. Sayangnya, dengan UI Automation, saya tidak tahu cara menjalankan kode Objective-C, tetapi dengan Frank & iCuke Anda bisa. Jadi, saya hanya akan menguji barang Objective-C tingkat rendah dengan unit test, atau membuat UIButtonhanya untuk TESTkonfigurasi build , yang ketika diklik, akan menjalankan kode Objective-C.

Solusi apa yang Anda gunakan?

Pertanyaan-pertanyaan Terkait

mattdipasquale
sumber
1
Saya tahu setidaknya beberapa bulan yang lalu bahwa laboratorium penting menggunakan cedar. (um saya kira itu sudah jelas diberikan di akun github mereka). Dengan dukungan dari toko seperti itu, itu akan menjadi pilihan saya.
Jed Schneider
1
Itu poin yang bagus. Tapi sekali lagi, Apple menyarankan menggunakan kerangka pengujian unit mereka, bukan Cedar, bukan? Jadi, maka itu Pivotal Vs. Apel. Dengan mana harus pergi?
ma11hew28
2
Saya menulis posting yang membandingkan Frank, KIF dan UIAutomation yang mungkin menarik bagi pembaca utas ini sgleadow.github.com/blog/2011/10/26/…
Stew

Jawaban:

53

tl; dr

Di Pivotal kami menulis Cedar karena kami menggunakan dan menyukai Rspec pada proyek Ruby kami. Cedar tidak dimaksudkan untuk menggantikan atau bersaing dengan OCUnit; itu dimaksudkan untuk membawa kemungkinan pengujian gaya BDD ke Objective C, seperti Rspec memelopori pengujian gaya BDD di Ruby, tetapi belum menghilangkan Uji :: Unit. Memilih satu atau yang lain sebagian besar adalah masalah preferensi gaya.

Dalam beberapa kasus kami merancang Cedar untuk mengatasi beberapa kekurangan dalam cara OCUnit bekerja untuk kami. Secara khusus, kami ingin dapat menggunakan debugger dalam pengujian, untuk menjalankan tes dari baris perintah dan dalam build CI, dan mendapatkan hasil teks yang berguna dari hasil pengujian. Hal-hal ini mungkin lebih atau kurang bermanfaat bagi Anda.

Jawaban panjang

Memutuskan antara dua kerangka kerja pengujian seperti Cedar dan OCUnit (misalnya) bermuara pada dua hal: gaya yang disukai, dan kemudahan penggunaan. Saya akan mulai dengan gaya, karena itu hanya masalah pendapat dan preferensi; kemudahan penggunaan cenderung menjadi satu set pengorbanan.

Pertimbangan gaya melampaui teknologi atau bahasa apa yang Anda gunakan. xUnit unit-style telah ada jauh lebih lama dari pengujian style-BDD, tetapi yang terakhir telah dengan cepat memperoleh popularitas, sebagian besar karena Rspec.

Keuntungan utama pengujian gaya xUnit adalah kesederhanaannya, dan adopsi yang luas (di antara pengembang yang menulis tes unit); hampir semua bahasa yang dapat Anda pertimbangkan untuk menulis kode memiliki kerangka kerja gaya xUnit yang tersedia.

Kerangka kerja gaya BDD cenderung memiliki dua perbedaan utama bila dibandingkan dengan gaya xUnit: bagaimana Anda menyusun tes (atau spesifikasi), dan sintaksis untuk menulis pernyataan Anda. Bagi saya, perbedaan struktural adalah pembeda utama. xUnit tes satu dimensi, dengan satu metode setUp untuk semua tes dalam kelas tes yang diberikan. Kelas yang kami uji, bagaimanapun, bukan satu dimensi; kita sering perlu menguji tindakan dalam beberapa konteks yang berbeda, berpotensi saling bertentangan. Misalnya, pertimbangkan kelas ShoppingCart sederhana, dengan metode addItem: (untuk keperluan jawaban ini saya akan menggunakan sintaks Objective C). Perilaku metode ini mungkin berbeda ketika kereta kosong dibandingkan dengan ketika kereta berisi barang-barang lainnya; mungkin berbeda jika pengguna telah memasukkan kode diskon; mungkin berbeda jika item yang ditentukan bisa ' t dikirim dengan metode pengiriman yang dipilih; dll. Ketika kondisi-kondisi yang mungkin ini bersilangan satu sama lain, Anda berakhir dengan jumlah konteks yang meningkat secara geometris; dalam pengujian xUnit-style, ini sering mengarah ke banyak metode dengan nama-nama seperti testAddItemWhenCartIsEmptyAndNoDiscountCodeAndShippingMethodApplies. Struktur kerangka kerja gaya BDD memungkinkan Anda untuk mengatur kondisi ini secara individual, yang menurut saya membuatnya lebih mudah untuk memastikan saya menutupi semua kasus, serta lebih mudah untuk menemukan, mengubah, atau menambahkan kondisi individual. Sebagai contoh, menggunakan sintaks Cedar, metode di atas akan terlihat seperti ini: dalam pengujian xUnit-style, ini sering mengarah ke banyak metode dengan nama-nama seperti testAddItemWhenCartIsEmptyAndNoDiscountCodeAndShippingMethodApplies. Struktur kerangka kerja gaya BDD memungkinkan Anda untuk mengatur kondisi ini secara individual, yang menurut saya membuatnya lebih mudah untuk memastikan saya menutupi semua kasus, serta lebih mudah untuk menemukan, mengubah, atau menambahkan kondisi individual. Sebagai contoh, menggunakan sintaks Cedar, metode di atas akan terlihat seperti ini: dalam pengujian xUnit-style, ini sering mengarah ke banyak metode dengan nama-nama seperti testAddItemWhenCartIsEmptyAndNoDiscountCodeAndShippingMethodApplies. Struktur kerangka kerja gaya BDD memungkinkan Anda untuk mengatur kondisi ini secara individual, yang menurut saya membuatnya lebih mudah untuk memastikan saya menutupi semua kasus, serta lebih mudah untuk menemukan, mengubah, atau menambahkan kondisi individual. Sebagai contoh, menggunakan sintaks Cedar, metode di atas akan terlihat seperti ini:

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, ^{
            ...
        });
    });
});

Dalam beberapa kasus, Anda akan menemukan konteks di dalamnya yang berisi set asersi yang sama, yang dapat Anda KERING menggunakan konteks contoh bersama.

Perbedaan utama kedua antara kerangka kerja gaya-BDD dan kerangka kerja gaya-xUnit, pernyataan (atau "matcher") sintaksis, membuat gaya spesifikasi agak lebih baik; beberapa orang sangat menyukainya, yang lain tidak.

Itu mengarah pada pertanyaan tentang kemudahan penggunaan. Dalam hal ini, setiap kerangka kerja memiliki pro dan kontra:

  • OCUnit telah ada jauh lebih lama dari Cedar, dan terintegrasi langsung ke dalam Xcode. Ini berarti mudah untuk membuat target pengujian baru, dan, sebagian besar waktu, mendapatkan tes dan menjalankan "hanya berfungsi." Di sisi lain, kami menemukan bahwa dalam beberapa kasus, seperti berjalan di perangkat iOS, menjalankan tes OCUnit hampir mustahil. Menyiapkan spesifikasi Cedar membutuhkan lebih banyak pekerjaan daripada tes OCUnit, karena Anda telah mendapatkan pustaka dan menautkannya sendiri (tidak pernah merupakan tugas sepele di Xcode). Kami sedang berupaya membuat pengaturan lebih mudah, dan semua saran lebih dari diterima.

  • OCUnit menjalankan tes sebagai bagian dari build. Ini berarti Anda tidak perlu menjalankan executable untuk menjalankan tes Anda; jika ada tes yang gagal, build Anda gagal. Ini membuat proses menjalankan tes satu langkah lebih mudah, dan output tes langsung masuk ke jendela output build Anda yang membuatnya mudah dilihat. Kami memilih untuk membuat spesifikasi Cedar menjadi executable yang Anda jalankan secara terpisah karena beberapa alasan:

    • Kami ingin dapat menggunakan debugger. Anda menjalankan spesifikasi Cedar sama seperti Anda akan menjalankan executable lainnya, sehingga Anda dapat menggunakan debugger dengan cara yang sama.
    • Kami ingin konsol mudah masuk dalam tes. Anda dapat menggunakan NSLog () dalam tes OCUnit, tetapi output masuk ke jendela build di mana Anda harus membuka langkah build untuk membacanya.
    • Kami ingin mudah membaca laporan pengujian, baik di baris perintah maupun di Xcode. Hasil OCUnit muncul dengan baik di jendela build di Xcode, tetapi membangun dari baris perintah (atau sebagai bagian dari proses CI) menghasilkan output tes yang bercampur dengan banyak dan banyak output build lainnya. Dengan fase build dan run yang terpisah, Cedar memisahkan output sehingga output tes mudah ditemukan. Pelari uji Cedar default menyalin gaya pencetakan standar "." untuk setiap spesifikasi yang lewat, "F" untuk spesifikasi yang gagal, dll. Cedar juga memiliki kemampuan untuk menggunakan objek reporter khusus, sehingga Anda dapat memperoleh hasil keluaran sesuai keinginan Anda, dengan sedikit usaha.
  • OCUnit adalah kerangka pengujian unit resmi untuk Objective C, dan didukung oleh Apple. Apple pada dasarnya memiliki sumber daya tanpa batas, jadi jika mereka ingin sesuatu dilakukan, itu akan selesai. Dan, bagaimanapun juga, ini adalah kotak pasir Apple tempat kami bermain. Sisi lain dari koin itu, bagaimanapun, adalah bahwa Apple menerima pesanan permintaan dukungan bajillion dan laporan bug setiap hari. Mereka sangat baik dalam menangani semuanya, tetapi mereka mungkin tidak dapat menangani masalah yang Anda laporkan segera, atau tidak sama sekali. Cedar jauh lebih baru dan kurang dipanggang daripada OCUnit, tetapi jika Anda memiliki pertanyaan atau masalah atau saran, kirim pesan ke milis Cedar ([email protected]) dan kami akan melakukan apa yang kami bisa untuk membantu Anda. Juga, jangan ragu untuk mengambil kode dari Github (github.com/pivotal/cedar) dan tambahkan apa pun yang menurut Anda tidak ada.

  • Menjalankan tes OCUnit pada perangkat iOS mungkin sulit. Sejujurnya, saya belum mencoba ini selama beberapa waktu, jadi mungkin menjadi lebih mudah, tetapi terakhir kali saya mencoba saya tidak bisa mendapatkan tes OCUnit untuk fungsionalitas UIKit agar berfungsi. Ketika kami menulis Cedar, kami memastikan bahwa kami dapat menguji kode yang bergantung pada UIKit baik pada simulator maupun pada perangkat.

Akhirnya, kami menulis Cedar untuk pengujian unit, yang berarti tidak benar-benar sebanding dengan proyek-proyek seperti UISpec. Sudah cukup lama sejak saya mencoba menggunakan UISpec, tetapi saya memahaminya untuk fokus terutama pada pemrograman terprogram UI pada perangkat iOS. Kami secara khusus memutuskan untuk tidak mencoba agar Cedar mendukung jenis spesifikasi ini, karena Apple (pada saat itu) akan mengumumkan UIAutomation.

Adam Milligan
sumber
Terima kasih atas tanggapannya. Saya akan membaca buku RSpec dan mencoba Ceder. Saya memindahkan UISpec ke bagian Selenium dan menambahkan UIAutomation di sana juga. Saya membaca posting blog Anda tentang UIAutomation. Frank sebenarnya terlihat jauh lebih sederhana dan lebih mudah dibaca, ditambah dengan dokumentasi yang lebih baik, jadi saya berpikir untuk memulai dengan itu. Saya hanya berharap itu sekuat UIAutomation. Anda mengatakan UIAutomation dapat menguji masalah siklus hidup. Saya ingin tahu apakah iCuke juga bisa ...
ma11hew28
8

Saya harus melemparkan Frank ke dalam campuran pengujian penerimaan. Ini adalah tambahan yang cukup baru tetapi sejauh ini telah bekerja sangat baik untuk saya. Juga, ini sebenarnya sedang dikerjakan secara aktif, tidak seperti icuke dan yang lainnya.

raidfive
sumber
5

Untuk pengembangan yang digerakkan oleh tes, saya suka menggunakan GHUnit , sangat mudah untuk diatur, dan bekerja sangat baik untuk debugging.

Richard J. Ross III
sumber
Terima kasih. Saya melihat itu tetapi lupa menyebutkannya.
ma11hew28
Ditambah 1 untuk GHUnit. menggunakannya banyak dengan OCMock. Sangat mudah untuk mengatur, memperluas dan bekerja dengan sangat andal.
drekka
4

Daftar Hebat!

Saya menemukan solusi menarik lainnya untuk UI menguji aplikasi iOS.

Kerangka Zucchini

Itu didasarkan pada UIAutomation. Kerangka kerja ini memungkinkan Anda menulis skenario sentris layar dalam gaya seperti Mentimun. Skenario dapat dijalankan di Simulator dan di perangkat dari konsol (ramah CI).

Pernyataan tersebut didasarkan pada tangkapan layar. Kedengarannya tidak fleksibel, tetapi membuat Anda mendapatkan laporan HTML yang bagus, dengan perbandingan layar yang disorot dan Anda dapat memberikan topeng yang menentukan wilayah yang Anda inginkan memiliki penegasan tepat piksel.

Setiap layar harus dijelaskan dalam CoffeScriptdan alat itu sendiri ditulis dalam ruby. Ini semacam mimpi buruk polyglott, tetapi alat ini menyediakan abstraksi yang bagus untuk UIAutomationdan ketika layar dijelaskan itu dapat dikelola bahkan untuk orang QA.

user1129998
sumber
Ketat! Terima kasih. Saya menambahkan ini ke pertanyaan di atas.
ma11hew28
2

Saya akan memilih iCuke untuk tes penerimaan dan Cedar untuk tes unit. UIAutomation adalah langkah ke arah yang benar untuk Apple, tetapi alat tersebut membutuhkan dukungan yang lebih baik untuk integrasi berkelanjutan; secara otomatis menjalankan tes UIAutomation dengan Instrumen saat ini tidak mungkin, misalnya.

SamCee
sumber
1

GHUnit baik untuk pengujian unit; untuk tes integrasi, saya telah menggunakan UISpec dengan beberapa keberhasilan (garpu github di sini: https://github.com/drync/UISpec ), tetapi saya menantikan untuk mencoba iCuke, karena menjanjikan pengaturan yang ringan, dan Anda dapat gunakan rel menguji kebaikan, seperti RSpec dan Mentimun.

rampok
sumber
1

Saat ini saya menggunakan Specta untuk rspec seperti pembuatan dan pasangan itu (seperti yang disebutkan di atas) expecta yang memiliki ton ini pilihan pencocokan mengagumkan.

Keith Smiley
sumber
0

Saya kebetulan sangat menyukai OCDSpec2 tapi saya bias, saya menulis OCDSpec dan berkontribusi pada yang kedua.

Ini sangat cepat bahkan di iOS, sebagian karena dibangun dari bawah ke atas daripada diletakkan di atas OCUnit. Ini memiliki sintaks RSpec / Jasmine juga.

https://github.com/ericmeyer/ocdspec2

Eric Smith
sumber