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
- OCUnit / SenTestingKit sebagaimana dijelaskan dalam Panduan Pengembangan iOS: Aplikasi Pengujian Unit & referensi OCUnit lainnya .
- Contoh: iPhoneUnitTests , Three20
- MENANGKAP
- GHUnit
- Google Toolbox untuk Mac: Pengujian Unit iPhone
Gaya RSpec
- Kiwi (yang juga dilengkapi dengan ejekan & harapan)
- Cedar
- Jasmine dengan UI Automation seperti yang ditunjukkan dalam spesifikasi iOS-Acceptance-Testing cekatan
Ujian penerimaan
Gaya Selenium
Otomasi UI (berfungsi pada perangkat)
- Panduan Instrumen Otomasi UI
- Dokumentasi referensi Otomasi UI
- Tuneup js - pustaka keren untuk digunakan dengan UIAutomation.
Menangkap Tindakan Antarmuka Pengguna ke dalam Script Otomatisasi
Dimungkinkan untuk menggunakan Timun (ditulis dalam JavaScript) untuk menggerakkan Otomasi UI. Ini akan menjadi proyek open-source yang hebat. Lalu, kita bisa menulis Gherkin untuk menjalankan pengujian UI Automation. Untuk saat ini, saya hanya akan menulis Gherkin sebagai komentar.
UPDATE: Zucchini Framework tampaknya memadukan Cucumber & UI Automation! :)
Posting Blog Lama:
UISpec dengan UISpecRunner
Gaya mentimun
Frank dan iCuke (berdasarkan Mentimun memenuhi pembicaraan iPhone )
- The Frank Google Grup memiliki lebih banyak aktivitas daripada iCuke Google Grup .
- Frank berjalan di kedua perangkat dan simulator, sementara iCuke hanya berjalan di simulator.
- Frank tampaknya memiliki satu set definisi langkah yang lebih komprehensif daripada definisi langkah iCuke . Dan, Frank juga memiliki ringkasan definisi langkah di wiki mereka .
- Saya mengusulkan agar kami menggabungkan iCuke & Frank (mirip dengan cara Merb & Rails bergabung) karena mereka memiliki tujuan bersama yang sama: Mentimun untuk iOS.
Zucchini Framework menggunakan sintaks Mentimun untuk menulis tes dan menggunakan CoffeeScript untuk definisi langkah.
Penambahan
- OCMock untuk mengejek
- OCHamcrest dan / atau Expecta untuk harapan
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 UIButton
hanya untuk TEST
konfigurasi build , yang ketika diklik, akan menjalankan kode Objective-C.
Solusi apa yang Anda gunakan?
Pertanyaan-pertanyaan Terkait
- Apakah ada solusi BDD yang saat ini berfungsi dengan baik dengan iOS4 dan Xcode4?
- SenTestingKit (terintegrasi dengan XCode) versus GHUnit pada XCode 4 untuk Unit Testing?
- Menguji kode asinkron di iOS dengan OCunit
- SenTestingKit di Xcode 4: Pengujian asinkron?
- Bagaimana cara kerja pengujian unit pada iPhone?
Jawaban:
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:
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:
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.
sumber
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.
sumber
Untuk pengembangan yang digerakkan oleh tes, saya suka menggunakan GHUnit , sangat mudah untuk diatur, dan bekerja sangat baik untuk debugging.
sumber
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
CoffeScript
dan alat itu sendiri ditulis dalam ruby. Ini semacam mimpi buruk polyglott, tetapi alat ini menyediakan abstraksi yang bagus untukUIAutomation
dan ketika layar dijelaskan itu dapat dikelola bahkan untuk orang QA.sumber
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.
sumber
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.
sumber
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.
sumber
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
sumber