Pada tahun 2018, Apple untuk (ketiga) kali berikutnya memperbarui format di mana informasi tentang uji coba dikeluarkan. Jika sebelumnya itu adalah file plist, yang dulunya xml besar, sekarang menjadi file besar dengan ekstensi xcresult, yang dibuka melalui Xcode dan berisi banyak informasi berguna, dimulai dengan hasil pengujian dengan log, tangkapan layar, dan diakhiri dengan cakupan target , informasi diagnostik tentang perakitan, dan banyak lagi. Sebagian besar pengembang tidak bekerja dengan ini setiap hari, tetapi pembangun infrastruktur dalam artikel ini mungkin menemukan sesuatu yang berguna.
Mari kita uraikan pro dan kontra dari memperbarui format
Apa kerugian dari memperbarui format?
- Beratnya banyak, yang berarti pertukaran file semacam itu dengan server CI bisa lama.
- Jika tidak ada Xcode, maka itu tidak akan terbuka (diragukan bahwa penguji atau pengembang tidak akan memiliki Xcode, tetapi masih).
- Kemungkinan kerusakan alat integrasi yang ada. Belajar bekerja dengan sesuatu yang baru lagi.
Bagaimana kenyamanan xcresult yang baru?
- Buka secara native melalui Xcode.
- Anda dapat mentransfer ke kolega dari QA dan pengembangan, meskipun mereka tidak memiliki proyek lokal. Semuanya akan terbuka dan menampilkan informasi yang Anda butuhkan.
- Berisi informasi lengkap tentang menjalankan pengujian.
- Bisa dibaca tidak hanya melalui Xcode.
Kami akan berbicara tentang poin terakhir dalam artikel ini.
Mengapa membaca XCResult di luar Xcode?
Jika perusahaan Anda telah menyiapkan proses CI&CD, Anda mungkin mengumpulkan metrik pada pembuatan proyek, stabilitas dan jumlah pengujian, dan, tentu saja, menguji data cakupan. Kemungkinan besar, di suatu tempat di Bamboo, Jenkins, Github, Anda telah menjatuhkan tes atau status CI, atau persentase cakupan. Merupakan kebiasaan untuk mengotomatiskan operasi semacam itu dan menyerahkannya pada belas kasihan mesin yang tidak berjiwa. Alat apa yang kita miliki untuk ini?
Apple, bersama dengan rilis format baru, merilis alat xcresulttool dan xccov, yang dapat Anda gunakan dari terminal.
Apa yang bisa kita dapatkan dengan xccov?
xcrun xccov view --report --json /path/to/your/TestScheme.xcresult
Permintaan akan mengembalikan informasi yang komprehensif tentang cakupan apa yang dimiliki semua target, metode apa dan kelas apa yang dicakup, berapa kali mereka dieksekusi dan baris apa yang dieksekusi. Objek memiliki struktur yang mirip. Ada 4 level total: root, target, file, function. Semua level kecuali root memiliki kolom nama. Semua level memiliki bidang CoverLines dan lineCoverage. Penting untuk diperhatikan bahwa objek memiliki konteksnya sendiri. Seluruh struktur dapat dijelaskan dalam beberapa protokol.
Selain protokol, kami menyoroti struktur berikut: CoverageReport - agregator segalanya dan root. Ini berisi larik objek Target. Setiap Target berisi larik File, yang pada gilirannya berisi larik Fungsi. Objek ini akan mengimplementasikan protokol yang dijelaskan di atas.
Kami tertarik pada bidang lineCoverage. Untuk membuat laporan yang bagus (seperti di fastlane), buka bidang lineCoverage dan telusuri semua objek dengan fungsi sederhana:
Kita akan mendapatkan sesuatu yang mirip dengan:
Coverage Report Summary: • Utils.framework: 51,04 % • NavigationAssistantKit.framework: 0,0 % • NavigationKit.framework: 35,85 % • Logger.framework: 20,32 % • FTCCardData.framework: 78,21 % • FTCFeeSDK.framework: 25,25 % • ErrorPresenter.framework: 2,8 % • MTUIKit.framework: 0,24 % • AnalyticsKit.framework: 47,52 % • EdaSDK.framework: 1,18 % • Alerts.framework: 85,19 % • Resources.framework: 39,16 % • QpayApiTests.xctest: 88,37 % • FTCFeeSDKTests.xctest: 97,91 %
PS Agar cakupan dapat dikumpulkan, Anda perlu menambahkan parameter YA -enableCodeCoverage ke tim pengujian Anda atau mengaktifkannya dalam pengaturan skema di Xcode.
Peluang apa yang akan diberikan xcresulttool?
Faktanya, xcresulttool tidak memiliki antarmuka yang sangat besar, tetapi Anda bisa mendapatkan banyak informasi darinya jika Anda mengetahui struktur xcresult. Dan ini adalah seluruh database tempat Anda dapat membuat kueri.
Sebaiknya mulai dengan antarmukanya sendiri:
xcrun xcresulttool --help OVERVIEW: Xcode Result Bundle Tool (version 16015) USAGE: xcresulttool subcommand [options] ... SUBCOMMANDS: export Export File or Directory from Result Bundle formatDescription Result Bundle Format Description get Get Result Bundle Object graph Print Result Bundle Object Graph merge Merge Result Bundles metadata Result Bundle Metadata version XCResultKit Version
Untuk membaca strukturnya, kita hanya perlu memanggil perintah:
xcrun xcresulttool get --path /path/to/your/res.xcresult --format json
Di sinilah kita mendapatkan "daftar isi" untuk bundel xcresult kita. Apa yang terjadi, pengujian apa yang dijalankan, berapa lama, di mana screenshot dan log, dan apa saja peringatan compiler. Hal utama bagi kami adalah mendapatkan pengidentifikasi file yang berisi informasi tentang tes.
xcrun xcresulttool get --path /path/to/your/res.xcresult --format json --id {id}
Kemudian kita akan mendapatkan objek dengan target pengujian, jenis pengujian, yang dibagi menjadi kelas pengujian dan setelan pengujian dengan laporan dengan log, tangkapan layar, waktu eksekusi, dan informasi lain untuk setiap pengujian.
Sayangnya, alasan kegagalan tes merah tidak akan mudah untuk ditarik - untuk ini Anda harus membuat permintaan lain untuk setiap tes yang gagal (dan pada kenyataannya, tidak satu pun!!
Untuk Ringkasan Kegagalan, permintaan yang sama digunakan :
xcrun xcresulttool get --path /path/to/your/res.xcresult --format json --id {id}
Tetapi untuk log kerusakan, Anda perlu menghapus --format json dari permintaan, karena hanya ada string dan saat meneruskan pemformat, alat akan menghasilkan kesalahan.
Apa yang harus dilakukan dengan pengetahuan latar belakang ini selanjutnya?
Otomatiskan, tentu saja! Jika Anda mencoba perintah ini, Anda akan melihat bahwa jawabannya sangat besar dan sulit dibaca. Bagaimana cara mengotomatiskan? Ruby, Python ... Atau Swift?
Tentu saja cepat. Setiap pengembang iOS modern tahu itu. Proyek ini terbuka di Xcode, debugging, syntax highlighting, pengetikan yang kuat tersedia. Singkatnya, mimpi! Apalagi dengan munculnya manajer paket Swift.
Bukan rahasia lagi bahwa dengan kecepatan kita dapat dengan mudah meluncurkan proses, mendeteksi kesalahan, dan mendapatkan keluaran. Dalam kasus yang paling sederhana, kita bisa bertahan dengan konstruksi seperti itu:
Sekarang kita hanya perlu menjelajahi format XCResult melalui xcrun xcov dan xcrun xcresulttool yang sudah dikenal. Misalnya, untuk membaca cakupan tes, kami menggunakan:
Dan untuk mendapatkan daftar isi XCResult kita perlu mengeksekusi:
Tapi bagaimana kita mendapatkan struktur CoverageReport dan XCResult yang kita hargai?
Kami mendapatkan string dari Data, yang akan dikembalikan oleh perintah Shell pertama kepada kami dan meletakkan konten di sini: quicktype.io .
Layanan ini akan menghasilkan sesuatu yang mirip dengan struktur cepat yang dibutuhkan. Benar, Anda tidak akan dapat menggunakan hasil "sebagaimana adanya". Kita harus mempelajari struktur jawaban lebih dekat dan membuang duplikat. Meski demikian, pekerjaan semacam itu tidaklah sulit. Anda dapat membuang bagian yang tidak perlu, atau Anda dapat melakukan penelitian dan menyoroti beberapa blok
penyusun dasar: Berdasarkan ini, jelaskan sisa strukturnya, misalnya:
atau bahkan informasi semacam itu tentang komputer tempat menjalankan dilakukan:
Nah, bagaimana cara menggunakan ini?
Ada dua cara untuk menggunakan pengikis kami. Yang pertama adalah sebagai dapat dieksekusi, dan di sinilah pustaka pengurai argumen cepat Apple berguna. Sebelumnya, kami harus menulis sendiri pemrosesan argumen, menutupinya dengan tes, dan mendukungnya. Sekarang pekerjaan ini telah diambil alih oleh perpustakaan populer, yang pengelolanya dapat dipercaya.
Ada dua perintah: dapatkan laporan pengujian dan buat laporan pengujian junit. Anda perlu membangun proyek dan menjalankan biner, meneruskan argumen yang diperlukan:
Cara kedua adalah menggunakan proyek ini sebagai perpustakaan. Kami memiliki proyek CI besar yang bertanggung jawab untuk merakit, menguji, dan mengirimkan produk KoronaPay kami. Misalnya, berdasarkan hasil pengujian yang lulus, kita dapat mengekstrak semua kegagalan pernyataan dan error dalam pengujian seperti ini:
Atau dapatkan pengujian berwarna merah, analisis labu, dan mulai ulang saja.
Bagaimana cara menganalisis? Semuanya sederhana dan tidak mudah pada saat bersamaan. Untuk mendapatkan detail alasan kegagalan pengujian, Anda perlu membuat permintaan tambahan ke xcresult menggunakan pengenal ringkasan kegagalan. Dan kemudian ekstrak informasi dari ringkasan kegagalan. Saat ini, kami telah mempelajari cara mencari error dalam pengujian dan kasus koneksi yang hilang, serta menarik alasannya. Tidaklah sulit untuk memahami bahwa telah terjadi tabrakan. Anda hanya perlu menemukan kata-kata yang disayangi masuk ke dalam failureSummaries.
Sedikit lebih sulit untuk mengetahui penyebab kecelakaan itu.
Di sinilah mekanisme refleksi dengan cepat berguna, yang meskipun agak terbatas, sangat bagus untuk memecahkan masalah ini. Temukan semua objek Lampiran bernama kXCTAttachmentLegacyDiagnosticReportData.
Tidak ada keajaiban tentang metode reflectProperties, ini adalah ekstensi sederhana untuk Mirror:
Kategori lain dari pengujian merah adalah asserts. Tidak seperti crash, Anda tidak bisa begitu saja mencari string "crashed in" di sini. Tes semacam itu dapat disamarkan sebagai kasus koneksi yang hilang. Untuk mengetahui alasannya, Anda harus melalui beberapa larik di dalam objek TestCase seperti ini:
Untuk operasi semacam itu, pustaka kami memiliki entitas TestsInspector yang dapat memberikan ringkasan pengujian berwarna merah. Jadi, tes merah dikelompokkan berdasarkan karakteristik dalam laporannya.
Alih-alih sebuah kesimpulan
Seperti semua solusi yang ada di area ini, scrapper kami bukanlah alat yang lengkap untuk menganalisis xcresult. Untuk mendapatkan semua informasi dan melihat screenshot, Anda masih perlu membuka xcresult melalui Xcode. Namun, jika Anda memiliki CI yang dikonfigurasi dan Anda ingin melihat hasil pengujian dengan cepat, kemungkinan besar Anda akan dapat menghargai kombinasi junit dan xcscrapper kami dengan nilai yang sebenarnya.