Instrumen khusus: ketika plang tidak cukup

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:

ApaAtributDeskripsi
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.

Jika

1) 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;

lalu

4) 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.

Source: https://habr.com/ru/post/id447594/


All Articles