Uji proyek tanpa rasa sakit. Laporan Yandex

Kami di tim Yandex.Maps untuk iOS membuat proyek uji menggunakan plugin kecil untuk CocoaPods dan beberapa kelas utilitas. Membuat proyek cepat dan dapat diandalkan. Tapi mungkin kita terlalu repot dan tidak terlalu sulit untuk menyusun proyek secara manual dengan pengaturan dan dependensi yang diperlukan? Dalam laporan itu, saya beralih dari yang sebaliknya: pertama saya melihat proses manual, lalu proses kita.


- Pertama, sedikit latar belakang. Yandex.Maps dikumpulkan selama lebih dari satu menit. Di komputer saya, membangun aplikasi membutuhkan waktu lebih dari tiga menit. Kami mengembangkan proyek uji untuk menghabiskan lebih sedikit waktu pada setiap perakitan. Kami memiliki cukup modularitas, dan untuk setiap modul kami melakukan proyek uji. Dalam proyek pengujian ini, fitur sedang dikembangkan.

Membuat satu proyek uji sekarang membutuhkan waktu 15 menit hingga satu jam. Ini disebabkan oleh fakta bahwa proyek harus dikonfigurasikan. Artinya, Anda perlu mengonfigurasi penandatanganan agar kami dapat mengembangkan perangkat yang sama seperti yang biasa kami lakukan. Hal ini diperlukan untuk mengkonfigurasi perpustakaan yang diperlukan. Dalam proses pengembangan fitur itu sendiri, kami terus-menerus kembali dan menyelesaikan proyek uji sehingga memenuhi kebutuhan kami.

Mengapa kita perlu proyek uji? Untuk menghemat waktu dalam perakitan. Semakin kecil proyek, semakin cepat dirakit, semakin sering kita dapat meluncurkan aplikasi pada perangkat dan semakin nyaman untuk kita kembangkan.



Apa yang seharusnya ada dalam proyek pengujian? Kita harus dapat meluncurkan, men-debug aplikasi kita pada perangkat yang sama yang digunakan untuk meluncurkan dan men-debug aplikasi utama kita.

Proyek harus dikonfigurasikan semirip mungkin dengan proyek utama, sehingga dalam proses mentransfer fitur dari proyek uji ke proyek utama, kami tidak akan mendapatkan kejutan. Atau setidaknya mengurangi jumlah kejutan yang diterima seminimal mungkin.

Kami juga membutuhkan lingkungan minimal dalam proyek pengujian, sehingga kami tidak membuang waktu membuat UIWindows, mengatur perpustakaan, membatalkan panggilan untuk membuka aplikasi di perpustakaan yang berkaitan dengan otorisasi, dll.

App_spec CocoaPods


Seluruh cerita saya hari ini akan dibangun di sekitar fitur CocoaPods yang disebut app_spec.



App_spec seperti subspec biasa, hanya saja ia tidak menghasilkan kerangka kerja yang dapat dihubungkan, tetapi aplikasi yang dapat diluncurkan pada perangkat.



Dan di luar kotak, CocoaPods memungkinkan kita untuk mendorong Info.plist dan xcconfig ke app_spec. Ini sudah memungkinkan kami untuk mengatur proyek kami dengan cukup baik.

Tetapi jika kita akan menulis kamus besar di masing-masing pods_spec, dengan nilai untuk Info.plist dan xcconfig, maka kita akan menumbuhkan podspec sendiri dan tidak nyaman untuk memodifikasinya. Jika kita perlu mengubah sesuatu, kita harus masuk ke setiap file podspec dan mengedit sesuatu dengan pena. Bagaimanapun, ini tidak nyaman.



Untuk menghilangkannya, kami membuat plugin lokal yang sangat sederhana untuk CocoaPods. Itu bahkan sepenuhnya cocok dalam satu slide. Dan dia melakukan satu-satunya hal: memberi kami izin DSL CocoaPods, yang menciptakan app_spec dengan nilai yang sudah tersumbat di Info.plist dan xcconfig. Ini sudah memungkinkan kita untuk mengkonfigurasi penandatanganan, mengkonfigurasi hal-hal penting yang ingin kita lihat terkonfigurasi dalam proyek pengujian kami.



Pertanyaan: bagaimana cara mentransfer path ke entitlements, lebih tepatnya, tempat menyimpan entitlements sehingga kita bisa meng-hardcode path ke plug-in.

Ada dua cara. Atau tunjukkan path untuk file yang hanya terletak di repositori kami, misalnya, untuk hak proyek utama. Atau simpan dalam plugin file hak khusus untuk proyek uji. Dan menggunakan plugin yang sama, salin ke developmentpod kami.



Kami memilih jalan pertama, dan di sini kami mengalami beberapa kesulitan. Faktanya adalah bahwa dalam pengembangan repositori kami berada dalam subfolder yang berbeda. Oleh karena itu, kami tidak dapat menunjukkan satu jalur relatif untuk mereka dari developmentpod ke file hak.

Penting untuk ditekankan di sini bahwa Anda harus menentukan jalur relatif, karena jalur ini tetap di pods_spec. Ini berarti bahwa ia akan berpartisipasi dalam perhitungan jumlah cek, yang disimpan di Podfile.lock. Dan jika ada jalur absolut, maka ini akan mempengaruhi jumlah cek. Ini berarti bahwa jumlah cek akan bervariasi tergantung pada folder tempat panggilan $ pod install, tempat Anda memiliki repositori, di mana mesin tempat Anda menjalankan $ pod install. Secara umum, ini mengarah pada konflik.



Sekarang saya akan menunjukkan ekstensi kecil lain dari plugin yang sama, yang memungkinkan kita untuk menghitung jalur relatif ke hak ini.

Kami tahu jalur relatif dari plugin kami ke file dengan hak, jika mereka berada di repositori yang sama. Dan juga selama peluncuran $ pod install, kita tahu jalan menuju developmentpod kita. Semua keajaiban yang ada dalam kode ini adalah garis yang disorot di mana kita cukup menghitung jalur relatif, mengetahui dua jalur absolut ini.



Jadi, apa yang kita dapatkan ketika kita sudah mengkonfigurasi app_spec dengan cara ini? Kami dapat menjalankan proyek pengujian kami di perangkat yang sama segera. Kami mendapat sejumlah besar pengaturan, termasuk hak, yang kami butuhkan.

Lingkungan Hidup


Hal berikutnya yang ingin saya bicarakan adalah lingkungan, lingkungan minimum yang sangat penting yang perlu kita mulai menulis kode segera.



Dalam kasus kami, kami membutuhkan MapKit, yang sudah dikonfigurasi, dengan kunci yang ditransfer, dengan penerusan panggilan di AccountManager. Ini adalah perpustakaan otorisasi kami. Dia juga perlu melakukan panggilan sistem, dia juga perlu mentransfer kunci, termasuk untuk melewati pembukaan aplikasi dengan referensi.

Kita juga membutuhkan layar mulai dengan tumpukan peta dan navigasi, sehingga kita dapat menggunakan tumpukan navigasi yang sama seperti pada Peta, dan lebih mudah untuk mentransfer fitur dari proyek uji ke proyek utama. Dan titik masuknya agar kita, tanpa berpikir panjang, bisa langsung mulai menulis kode yang bermanfaat.



Dalam kasus Anda, ini bisa jadi, misalnya, menyiapkan Facebook SDK, yang juga harus Anda transfer kunci; pustaka Anda untuk masuk, yang hampir pasti Anda perlukan untuk melewati tautan pembuka aplikasi. Beberapa jenis pengontrol start-up Windows start-up, dan titik masuk yang sama untuk menjalankan skrip utama yang ingin Anda kembangkan dalam proyek pengujian Anda.



Bagaimana kami melakukan ini? Dengan membuat templat AppDelegate tunggal. Di sana kami menginisialisasi semua lingkungan yang diperlukan, perpustakaan. Kami meneruskan semua panggilan yang diperlukan, mentransfer kunci yang diperlukan. Membuat proyek uji, tetap bagi kami untuk membuat AppDelegate baru untuk proyek uji dan mewarisi dari template.

Setelah itu, kita menimpa satu-satunya metode yang dipanggil setelah templat AppDelegate melakukan semua yang diperlukan. Dan di sana kita sudah memiliki ViewController awal dan di atasnya kita dapat menjalankan skrip kita, yang ingin kita debug dalam proyek pengujian.

Sudah / menjadi


Bagaimana saya bisa membuat proyek uji di dahi, dan bagaimana saya bisa membuatnya menggunakan metode yang saya jelaskan hari ini?

Membuat proyek uji di dahi:

- Kami pergi ke Xcode, buat proyek baru (File> Proyek Baru).

- Masukkan nama, lebih disukai tanpa kesalahan, tandatangani Bundle ID. Kami sedang menyiapkan proyek ini.

- Ubah versi Swift, ubah versi target. Kami mencoba menjalankan semuanya di perangkat, mengedit tanda tangan, dan sebagainya. Ini adalah proses yang agak suram.

- Selanjutnya, kita buat podfile, sambungkan dependensi di sana, instal pods.

- Setelah itu, kita mulai dan dengan sangat hati-hati dan dengan lembut mengkonfigurasi AppDelegate kita, mentransfer potongan-potongan inisialisasi perpustakaan yang kita butuhkan.

- Buat UIWindows awal dengan ViewController kami

Dan hanya setelah itu kita dapat memulai kode yang berguna. Prosedur yang cukup tidak menyenangkan, setuju.

Bagaimana kita dapat membuat proyek uji menggunakan praktik terbaik yang saya jelaskan dalam laporan hari ini?

- Kami membuat sample_app_spec, menggunakan ekstensi, untuk CocoaPods, yang digunakan untuk memulai.

- Membuat AppDelegate, dan mewarisinya dari template AppDelegate.

Setelah itu, kita dapat mulai menulis kode yang berguna.

Membuat proyek uji dengan cara ini jauh lebih cepat dan lebih dapat diandalkan. Kami pasti tidak akan membuat kesalahan dalam menandatangani pengaturan, kami pasti tidak akan membuat kesalahan dalam pengaturan proyek. Semua lingkungan yang diperlukan untuk memulai pekerjaan segera mendekati kami.

Bisakah ini lebih mudah?


Anda dapat mengajukan pertanyaan - dapatkah ini dilakukan dengan lebih mudah? Tentu saja.



Saya telah mengidentifikasi tiga tingkat kesulitan. Yang pertama adalah apa yang saya bicarakan hari ini, sekaligus, ketika kita membuat plug-in untuk CocoaPods, yang dapat memperbaiki jalur ke hak, dan templat AppDelegate.

Metode kedua ideal dalam rasio upaya terhadap laba. Ini hanya berisi plugin untuk CocoaPods, yang merupakan yang pertama dalam cerita hari ini. Artinya, itu hanya menggantikan nilai-nilai di Info.plist dan xcconfig. Itu sudah membuat hidup jauh lebih mudah.

Jika Anda tidak memerlukan file hak dalam aplikasi pengujian Anda, jika aplikasi pengujian Anda sangat berbeda satu sama lain dan tidak memerlukan komponen umum, metode ini sangat cocok untuk Anda.

Metode ketiga adalah yang paling mudah, tidak memerlukan persiapan apa pun. Mulai gunakan app_spec. Proyek yang dihasilkan dari app_spec dibuat di ruang kerja yang sama dengan proyek utama Anda. Oleh karena itu, sudah mewarisi, misalnya, Swift, versi target, dan semua pengaturan yang Anda miliki di Workspace. Akan lebih mudah bagi Anda untuk mulai bekerja dengannya. Itu semua, terima kasih atas perhatian Anda. Hari ini saya akan memberi tahu Anda cara membuat proyek uji tanpa rasa sakit, dan bagaimana kami membuat proyek uji di Yandex.Maps.

- Pertama, sedikit latar belakang. Yandex.Maps dikumpulkan selama lebih dari satu menit. Di komputer saya, membangun aplikasi membutuhkan waktu lebih dari tiga menit. Kami mengembangkan proyek uji untuk menghabiskan lebih sedikit waktu pada setiap perakitan. Kami memiliki cukup modularitas, dan untuk setiap modul kami melakukan proyek uji. Dalam proyek pengujian ini, fitur sedang dikembangkan.

Membuat satu proyek uji sekarang membutuhkan waktu 15 menit hingga satu jam. Ini disebabkan oleh fakta bahwa proyek harus dikonfigurasikan. Artinya, Anda perlu mengonfigurasi penandatanganan agar kami dapat mengembangkan perangkat yang sama seperti yang biasa kami lakukan. Hal ini diperlukan untuk mengkonfigurasi perpustakaan yang diperlukan. Dalam proses pengembangan fitur itu sendiri, kami terus-menerus kembali dan menyelesaikan proyek uji sehingga memenuhi kebutuhan kami.

Mengapa kita perlu proyek uji? Untuk menghemat waktu dalam perakitan. Semakin kecil proyek, semakin cepat dirakit, semakin sering kita dapat meluncurkan aplikasi pada perangkat dan semakin nyaman untuk kita kembangkan.



Apa yang seharusnya ada dalam proyek pengujian? Kita harus dapat meluncurkan, men-debug aplikasi kita pada perangkat yang sama yang digunakan untuk meluncurkan dan men-debug aplikasi utama kita.

Proyek harus dikonfigurasikan semirip mungkin dengan proyek utama, sehingga dalam proses mentransfer fitur dari proyek uji ke proyek utama, kami tidak akan mendapatkan kejutan. Atau setidaknya mengurangi jumlah kejutan yang diterima seminimal mungkin.

Kami juga membutuhkan lingkungan minimal dalam proyek pengujian, sehingga kami tidak membuang waktu membuat UIWindows, mengatur perpustakaan, membatalkan panggilan untuk membuka aplikasi di perpustakaan yang berkaitan dengan otorisasi, dll.

App_spec CocoaPods


Seluruh cerita saya hari ini akan dibangun di sekitar fitur CocoaPods yang disebut app_spec.



App_spec seperti subspec biasa, hanya saja ia tidak menghasilkan kerangka kerja yang dapat dihubungkan, tetapi aplikasi yang dapat diluncurkan pada perangkat.



Dan di luar kotak, CocoaPods memungkinkan kita untuk mendorong Info.plist dan xcconfig ke app_spec. Ini sudah memungkinkan kami untuk mengatur proyek kami dengan cukup baik.

Tetapi jika kita akan menulis kamus besar di masing-masing pods_spec, dengan nilai untuk Info.plist dan xcconfig, maka kita akan menumbuhkan podspec sendiri dan tidak nyaman untuk memodifikasinya. Jika kita perlu mengubah sesuatu, kita harus masuk ke setiap file podspec dan mengedit sesuatu dengan pena. Atau tidak pulpen. Bagaimanapun, ini tidak nyaman.



Untuk menghilangkannya, kami membuat plugin lokal yang sangat sederhana untuk CocoaPods. Itu bahkan sepenuhnya cocok dalam satu slide. Dan dia melakukan satu-satunya hal: memberi kami izin DSL CocoaPods, yang menciptakan app_spec dengan nilai yang sudah tersumbat di Info.plist dan xcconfig. Ini sudah memungkinkan kita untuk mengkonfigurasi penandatanganan, mengkonfigurasi hal-hal penting yang ingin kita lihat terkonfigurasi dalam proyek pengujian kami.



Pertanyaan: bagaimana cara mentransfer path ke entitlements, lebih tepatnya, tempat menyimpan entitlements sehingga kita bisa meng-hardcode path ke plug-in.

Ada dua cara. Atau tunjukkan path untuk file yang hanya terletak di repositori kami, misalnya, untuk hak proyek utama. Atau simpan dalam plugin file hak khusus untuk proyek uji. Dan menggunakan plugin yang sama, salin ke developmentpod kami.



Kami memilih jalan pertama, dan di sini kami mengalami beberapa kesulitan. Faktanya adalah bahwa dalam pengembangan repositori kami berada dalam subfolder yang berbeda. Oleh karena itu, kami tidak dapat menunjukkan satu jalur relatif untuk mereka dari developmentpod ke file hak.

Penting untuk ditekankan di sini bahwa Anda harus menentukan jalur relatif, karena jalur ini tetap di pods_spec. Ini berarti bahwa ia akan berpartisipasi dalam perhitungan jumlah cek, yang disimpan di Podfile.lock. Dan jika ada jalur absolut, maka ini akan mempengaruhi jumlah cek. Ini berarti bahwa jumlah cek akan bervariasi tergantung pada folder tempat panggilan $ pod install, tempat Anda memiliki repositori, di mana mesin tempat Anda menjalankan $ pod install. Secara umum, ini mengarah pada konflik.



Sekarang saya akan menunjukkan ekstensi kecil lain dari plugin yang sama, yang memungkinkan kita untuk menghitung jalur relatif ke hak ini.

Kami tahu jalur relatif dari plugin kami ke file dengan hak, jika mereka berada di repositori yang sama. Dan juga selama peluncuran $ pod install, kita tahu jalan menuju developmentpod kita. Semua keajaiban yang ada dalam kode ini adalah garis yang disorot di mana kita cukup menghitung jalur relatif, mengetahui dua jalur absolut ini.



Jadi, apa yang kita dapatkan ketika kita sudah mengkonfigurasi app_spec dengan cara ini? Kami dapat menjalankan proyek pengujian kami di perangkat yang sama segera. Kami mendapat sejumlah besar pengaturan, termasuk hak, yang kami butuhkan.

Lingkungan Hidup


Hal berikutnya yang ingin saya bicarakan adalah lingkungan, lingkungan minimum yang sangat penting yang perlu kita mulai menulis kode segera.



Dalam kasus kami, kami membutuhkan MapKit, yang sudah dikonfigurasi, dengan kunci yang ditransfer, dengan penerusan panggilan di AccountManager. Ini adalah perpustakaan otorisasi kami. Dia juga perlu melakukan panggilan sistem, dia juga perlu mentransfer kunci, termasuk untuk melewati pembukaan aplikasi dengan referensi.

Kita juga membutuhkan layar mulai dengan tumpukan peta dan navigasi, sehingga kita dapat menggunakan tumpukan navigasi yang sama seperti pada Peta, dan lebih mudah untuk mentransfer fitur dari proyek uji ke proyek utama. Dan titik masuknya agar kita, tanpa berpikir panjang, bisa langsung mulai menulis kode yang bermanfaat.



Dalam kasus Anda, ini bisa jadi, misalnya, menyiapkan Facebook SDK, yang juga harus Anda transfer kunci; pustaka Anda untuk masuk, yang hampir pasti Anda perlukan untuk melewati tautan pembuka aplikasi. Beberapa jenis pengontrol start-up Windows start-up, dan titik masuk yang sama untuk menjalankan skrip utama yang ingin Anda kembangkan dalam proyek pengujian Anda.



Bagaimana kami melakukan ini? Dengan membuat templat AppDelegate tunggal. Di sana kami menginisialisasi semua lingkungan yang diperlukan, perpustakaan. Kami meneruskan semua panggilan yang diperlukan, mentransfer kunci yang diperlukan. Membuat proyek uji, tetap bagi kami untuk membuat AppDelegate baru untuk proyek uji dan mewarisi dari template.

Setelah itu, kita menimpa satu-satunya metode yang dipanggil setelah templat AppDelegate melakukan semua yang diperlukan. Dan di sana kita sudah memiliki ViewController awal dan di atasnya kita dapat menjalankan skrip kita, yang ingin kita debug dalam proyek pengujian.

Sudah / menjadi


Bagaimana saya bisa membuat proyek uji di dahi, dan bagaimana saya bisa membuatnya menggunakan metode yang saya jelaskan hari ini?

Membuat proyek uji di dahi:

- Kami pergi ke Xcode, buat proyek baru (File> Proyek Baru).

- Masukkan nama, lebih disukai tanpa kesalahan, tandatangani Bundle ID. Kami sedang menyiapkan proyek ini.

- Ubah versi Swift, ubah versi target. Kami mencoba menjalankan semuanya di perangkat, mengedit tanda tangan, dan sebagainya. Ini adalah proses yang agak suram.

- Selanjutnya, kita buat podfile, sambungkan dependensi di sana, instal pods.

- Setelah itu, kita mulai dan dengan sangat hati-hati dan dengan lembut mengkonfigurasi AppDelegate kita, mentransfer potongan-potongan inisialisasi perpustakaan yang kita butuhkan.

- Buat UIWindows awal dengan ViewController kami

Dan hanya setelah itu kita dapat memulai kode yang berguna. Prosedur yang cukup tidak menyenangkan, setuju.

Bagaimana kita dapat membuat proyek uji menggunakan praktik terbaik yang saya jelaskan dalam laporan hari ini?

- Kami membuat sample_app_spec, menggunakan ekstensi, untuk CocoaPods, yang digunakan untuk memulai.

- Membuat AppDelegate, dan mewarisinya dari template AppDelegate.

Setelah itu, kita dapat mulai menulis kode yang berguna.

Membuat proyek uji dengan cara ini jauh lebih cepat dan lebih dapat diandalkan. Kami pasti tidak akan membuat kesalahan dalam menandatangani pengaturan, kami pasti tidak akan membuat kesalahan dalam pengaturan proyek. Semua lingkungan yang diperlukan untuk memulai pekerjaan segera mendekati kami.

Bisakah ini lebih mudah?


Anda dapat mengajukan pertanyaan - dapatkah ini dilakukan dengan lebih mudah? Tentu saja.



Saya telah mengidentifikasi tiga tingkat kesulitan. Yang pertama adalah apa yang saya bicarakan hari ini, sekaligus, ketika kita membuat plug-in untuk CocoaPods, yang dapat memperbaiki jalur ke hak, dan templat AppDelegate.

Metode kedua ideal dalam rasio upaya terhadap laba. Ini hanya berisi plugin untuk CocoaPods, yang merupakan yang pertama dalam cerita hari ini. Artinya, itu hanya menggantikan nilai-nilai di Info.plist dan xcconfig. Itu sudah membuat hidup jauh lebih mudah.

Jika Anda tidak memerlukan file hak dalam aplikasi pengujian Anda, jika aplikasi pengujian Anda sangat berbeda satu sama lain dan tidak memerlukan komponen umum, metode ini sangat cocok untuk Anda.

Metode ketiga adalah yang paling mudah, tidak memerlukan persiapan apa pun. Mulai gunakan app_spec. Proyek yang dihasilkan dari app_spec dibuat di ruang kerja yang sama dengan proyek utama Anda. Oleh karena itu, sudah mewarisi versi Swift, versi target, dan semua pengaturan yang Anda miliki di Workspace. Akan lebih mudah bagi Anda untuk mulai bekerja dengannya.
Terimakasih atas perhatiannya.

All Articles