Instrumen untuk Apple's Xcode adalah alat untuk menganalisis kinerja aplikasi iOS. Mereka digunakan untuk mengumpulkan dan menampilkan data yang diperlukan dalam debugging kode. Tahun lalu, Apple
memperkenalkan Custom Instruments. Ini adalah kesempatan untuk memperluas seperangkat alat standar untuk membuat profil aplikasi. Ketika alat yang ada tidak cukup, Anda dapat membuat sendiri yang baru - mereka akan mengumpulkan, menganalisis, dan menampilkan data sesuai kebutuhan.
Setahun telah berlalu, dan hampir tidak ada alat publik dan informasi baru tentang pembuatannya di jaringan. Jadi kami memutuskan untuk memperbaiki situasi dan membagikan bagaimana kami menciptakan Instrumen Kustom kami sendiri, yang menentukan alasan lemahnya isolasi unit test. Ini didasarkan pada teknologi plang (kami menulis tentang hal itu
dalam artikel sebelumnya ) dan memungkinkan Anda untuk dengan cepat dan akurat menentukan di mana tes berkedip.

Minimum teoritis
Untuk membuat alat baru untuk Xcode, Anda perlu memahami dua blok teoretis. Bagi mereka yang ingin mencari tahu sendiri, kami akan segera memberikan tautan yang diperlukan:
Selebihnya - di bawah ini adalah ringkasan singkat dari topik yang diperlukan.
Pertama pilih File -> New -> Project -> Kategori macOS -> Paket instrumen. Proyek yang dibuat mencakup file dengan ekstensi .instrpkg, di mana alat baru dideklarasikan secara deklaratif dalam format xml. Mari berkenalan dengan elemen markup:
Apa | Atribut | Deskripsi
|
Skema data
| skema interval, skema titik, dll.
| Menjelaskan struktur data sebagai tabel seperti skema sql. Skema digunakan dalam elemen markup lainnya untuk menentukan jenis data pada input dan output model, misalnya, ketika menggambarkan pemetaan (UI).
|
Impor skema data
| skema impor
| Impor skema yang sudah jadi. Ini memungkinkan Anda untuk menggunakan struktur data yang ditentukan oleh Apple.
|
Model alat
| pemodel
| Mengaitkan alat dengan file .clp, di mana logika alat didefinisikan, dan mengumumkan skema data yang diharapkan pada input dan output model.
|
Deskripsi alat
| instrumen
| Menjelaskan model data dan menentukan bagaimana acara akan ditampilkan di UI. Model data dijelaskan menggunakan atribut create-table, create-parameter, dll. Bagan alat didefinisikan oleh atribut grafik, dan tabel bagian didefinisikan oleh daftar, narasi, dll.
|
Jika kami ingin menambah logika alat baru, kemudian buat file .clp dengan kode CLIPS. Entitas bahasa dasar:
- "Fakta" adalah peristiwa tertentu yang terdaftar dalam sistem menggunakan perintah tegas;
- "Aturan" adalah blok-if dengan sintaksis spesifik yang berisi kondisi di mana serangkaian tindakan dilakukan.
Aturan mana dan dalam urutan apa yang akan diaktifkan ditentukan oleh CLIPS itu sendiri berdasarkan fakta yang masuk, prioritas aturan dan mekanisme penyelesaian konflik.
Bahasa ini mendukung pembuatan tipe data berdasarkan primitif, penggunaan aritmatika, operasi logis dan fungsi. Serta pemrograman berorientasi objek penuh (OOP) dengan definisi kelas, mengirim pesan, multiple inheritance.
Pertimbangkan sintaks dasar bahasa yang memungkinkan Anda membuat logika untuk alat khusus.
1. Untuk membuat
fact
, gunakan konstruk
assert
:
CLIPS> (assert (duck))
Dengan demikian, kita mendapatkan entri
duck
di tabel fakta, yang dapat dilihat menggunakan perintah
facts
:
CLIPS> (facts)
Untuk menghapus fakta, gunakan perintah
retract
:
(retract duck)
2. Untuk membuat
rule
, gunakan konstruk
defrule
:
CLIPS> (defrule duck) — duck (animal-is duck)</i> — animal-is duck => (assert (sound-is quack))) — sound-is quack
3. Untuk membuat dan menggunakan variabel, sintaks berikut digunakan (sebelum nama variabel ada tanda wajib "?"):
?<variable-name>
4. Anda dapat membuat tipe data baru menggunakan:
CLIPS> (deftemplate prospect (slot name (type STRING) (default ?DERIVE)) (slot assets (type SYMBOL) (default rich)) (slot age (type NUMBER) (default 80)))
Jadi, kami mendefinisikan struktur dengan prospek nama dan tiga nama atribut, aset, dan usia dari jenis yang sesuai dan nilai default.
5. Operasi aritmatika dan logis memiliki sintaks awalan. Artinya, untuk menambahkan 2 dan 3, Anda harus menggunakan konstruksi berikut:
CLIPS> (+ 2 3)
Atau untuk membandingkan dua variabel x dan y:
CLIPS> (> ?x ?y)
Contoh praktis
Dalam proyek kami, kami menggunakan pustaka
OCMock untuk membuat objek rintisan. Namun, ada situasi ketika seekor tikus hidup lebih lama dari tes yang dibuatnya, dan memengaruhi isolasi tes-tes lainnya. Akibatnya, ini mengarah ke "berkedip" (ketidakstabilan) dari unit test. Untuk melacak masa uji dan cemoohan, kami akan membuat alat kami sendiri. Berikut ini adalah algoritme tindakan.
Langkah 1. Membuat markup untuk acara plang
Untuk mendeteksi mox yang bermasalah, diperlukan dua kategori peristiwa interval - waktu pembuatan dan penghancuran moxa, waktu mulai dan waktu akhir pengujian. Untuk mendapatkan peristiwa ini, pergi ke perpustakaan
OCMock
dan
OCMock
mereka dengan
signpost
di metode
init
dan
stopMocking
dari kelas
stopMocking
.


Selanjutnya, buka proyek yang sedang dipelajari, lakukan markup dalam pengujian unit,
setUp
dan
tearDown
:

Langkah 2. Buat alat baru dari templat Paket Instrumen

Pertama, kami menentukan tipe data dari input. Untuk melakukan ini,
.instrpkg
mengimpor skema
signpost
di
signpost
. Sekarang acara yang dibuat oleh
signpost
akan jatuh ke dalam alat:

Selanjutnya, kami menentukan jenis data dalam output. Dalam contoh ini, kami akan menampilkan acara secara bersamaan. Setiap acara akan memiliki waktu dan deskripsi. Untuk melakukan ini, nyatakan skema:

Langkah 3. Kami menjelaskan logika alat ini
Kami membuat file terpisah dengan ekstensi
.clp
, di mana kami menetapkan aturan menggunakan bahasa CLIPS. Untuk membiarkan alat baru tahu di mana file logika didefinisikan, tambahkan blok
modeler
:

Di blok ini, menggunakan atribut
production-system
, tentukan jalur relatif ke file dengan logika. Dalam atribut
output
dan
required-input
mendefinisikan skema data untuk input dan output, masing-masing.

Langkah 4. Kami menjelaskan secara spesifik penyajian alat (UI)
Dalam file
.instrpkg
, tetap untuk menggambarkan alat itu sendiri, yaitu menampilkan hasilnya. Buat tabel untuk data dalam atribut
create-table
menggunakan
schema-ref
detected-mocks-narrative
sebelumnya
detected-mocks-narrative
dalam atribut
schema-ref
. Dan mengatur jenis keluaran informasi - naratif (deskriptif):

Langkah 5. Kami menulis kode logika
Mari kita
.clp
ke file
.clp
, di mana logika sistem pakar didefinisikan. Logikanya adalah sebagai berikut: jika waktu mulai pengujian berpotongan dengan interval kehidupan moka, maka kami percaya bahwa mok ini "berasal" dari tes lain - yang melanggar isolasi unit-test saat ini. Untuk akhirnya membuat acara dengan informasi yang menarik, Anda perlu melakukan langkah-langkah berikut:
1. Tentukan struktur tiruan dan unitTest dengan bidang - waktu acara, pengidentifikasi acara, nama tes, dan kelas mok.

2. Kami menetapkan aturan yang akan membuat fakta dengan tipe
mock
dan
unitTest
berdasarkan peristiwa masuk
signpost
masuk:

Aturan-aturan ini dapat dibaca sebagai berikut: jika pada input kita mendapatkan fakta dari tipe os-signpost dengan
subsystem
diinginkan,
category
,
name
dan
event-type
, kemudian membuat fakta baru dengan tipe yang didefinisikan di atas (unitTest atau mock), dan mengisinya dengan nilai-nilai. Penting untuk diingat di sini - CLIPS adalah bahasa yang case-sensitive dan nilai-nilai subsistem, kategori, nama, dan tipe peristiwa harus cocok dengan apa yang digunakan dalam kode proyek yang diteliti.

Variabel dari peristiwa plang dilewatkan sebagai berikut:

3. Kami mendefinisikan aturan yang merilis acara yang selesai (mereka berlebihan, karena mereka tidak mempengaruhi hasil).

Langkah 6. Tetapkan aturan yang akan menghasilkan hasil.
Anda dapat membaca aturan seperti ini.
Jika1) ada unitTest dan ejekan;
2) dalam hal ini, awal pengujian terjadi lebih lambat dari moka yang ada;
3) ada tabel untuk menyimpan hasil dengan skema narasi terdeteksi-mengejek;
lalu4) membuat catatan baru;
5) isi dengan waktu;
6) ... dan deskripsi.

Hasilnya, kita melihat gambar berikut saat menggunakan alat baru:

Kode sumber untuk instrumen khusus dan proyek sampel untuk menggunakan instrumen dapat dilihat
di GitHub .
Alat debugging
Debugger digunakan untuk men-debug alat khusus.

Dia mengizinkan
1. Lihat kode yang dikompilasi berdasarkan pada deskripsi di instrpkg.
2. Lihat informasi terperinci tentang apa yang terjadi pada alat saat runtime.

3. Menampilkan daftar lengkap dan deskripsi skema data sistem yang dapat digunakan sebagai input dalam alat baru.

4. Jalankan perintah sewenang-wenang di konsol. Misalnya, tampilkan daftar aturan dengan perintah daftar-defrules atau fakta dengan perintah fakta

Pengaturan pada server CI
Anda dapat menjalankan alat dari baris perintah - untuk membuat profil aplikasi selama pelaksanaan tes unit atau UI pada CI-server. Ini akan memungkinkan, misalnya, menangkap kebocoran memori sedini mungkin. Untuk menguji profil di dalam pipa, gunakan perintah berikut:
1. Menjalankan alat dengan atribut:
xcrun instruments -t <template_name> -l <average_duration_ms> -w <device_udid>
- di mana
template_name
adalah jalur ke templat dengan alat atau nama templat. Anda bisa mendapatkan perintah xcrun instruments -s
; average_duration_ms
- waktu perekaman dalam milidetik, harus lebih besar dari atau sama dengan waktu uji coba;device_udid
- pengidentifikasi simulator. Anda bisa mendapatkan perintah instrumen xcrun -s. Harus cocok dengan pengenal simulator tempat tes akan dijalankan.
2. Menjalankan tes pada simulator yang sama dengan perintah:
xcodebuild -workspace <path_to_workspace>-scheme <scheme_with_tests> -destination <device> test-without-building
- di mana
path_to_workspace
adalah jalur ke ruang kerja Xcode; scheme_with_tests
- skema dengan tes;device
- pengidentifikasi simulator.
Akibatnya, laporan dengan ekstensi .trace akan dibuat di direktori kerja, yang dapat dibuka oleh aplikasi Instruments atau dengan mengklik kanan pada file dan memilih Show Package Contents.
Kesimpulan
Kami melihat contoh peningkatan rambu ke alat lengkap dan memberi tahu cara menerapkannya secara otomatis pada "menjalankan" server CI dan menggunakannya dalam menyelesaikan masalah "berkedip" (tidak stabil) tes.
Saat Anda menyelami kemungkinan instrumen khusus, Anda akan lebih memahami dalam hal apa Anda dapat menggunakan instrumen tersebut. Sebagai contoh, mereka juga membantu kita untuk memahami masalah multithreading - di mana dan kapan menggunakan akses data yang aman.
Membuat alat baru cukup sederhana. Tetapi hal utama adalah bahwa setelah menghabiskan beberapa hari mempelajari mekanisme dan dokumentasi untuk membuatnya hari ini, Anda akan dapat menghindari beberapa malam tanpa tidur dalam upaya untuk memperbaiki bug.
Sumber
Artikel ini ditulis dengan @regno , Anton Vlasov, seorang pengembang iOS.