Setiap orang yang pernah atau terlibat dalam autotest Android tahu betapa menyakitkannya itu.
Anda bosan dengan volume tugas dan masalah sehingga liburan tidak membantu. Orang-orang bahkan berhenti karena protes otomatis.
Rasa sakit, penderitaan, dan siksaan tak terhindarkan menyebabkan munculnya sesuatu yang baru dan indah. Kami mencoba menyatukan semua garu yang harus kami injak, menggabungkan upaya kami dengan orang-orang dari Avito dan HH dan menciptakan sesuatu yang akan membuat hubungan Anda dengan tes otomatis jauh lebih baik dan lebih berbuah.
Meet:
Kaspresso - kerangka kerja autotest yang Anda tunggu-tunggu!

Saya akan segera mencatat bahwa ada dua video berkualitas cukup tinggi di
jaringan yang didedikasikan untuk
Kaspresso dan
AdbServer (tambahan untuk Kaspresso, tetapi pada saat yang sama, proyek yang kuat dan independen):
1.
Dmitry Movchan, Eugene Matsyuk - Cara mulai menulis autotests dan tidak menjadi gila2.
Egor Kournikov - Satu-satunya yang Anda butuhkan untuk pengujian UIMereka menggambarkan secara terperinci sejarah penciptaan perpustakaan: bagaimana kami beralih dari menyelesaikan satu masalah ke memecahkan masalah lain, dan apa yang terjadi pada akhirnya. Saya sangat merekomendasikannya.
Oleh karena itu, dalam artikel ini saya hanya akan berbicara tentang poin utama dan chip sehingga Anda dapat dengan cepat memahami apa kerangka kerja ini dan tugas apa yang dipecahkannya. Dan nyali serta detail dapat ditemukan dalam video dan dokumentasi.
Mengapa kita bahkan membutuhkan kerangka kerja kita sendiri?
Setiap pengembang yang mulai menulis autotests pasti bertanya:
- Bagaimana cara mulai menulis autotests?
- Alat apa yang harus dipilih?
- Apa yang harus dilakukan jika tidak ada alat yang diperlukan?
- Apa praktik terbaik?
Untuk semua ini tambahkan bahwa setiap tim berusaha untuk menyelesaikan masalah ini dengan caranya sendiri. Akibatnya, tidak ada jawaban tunggal untuk mereka, tidak ada tempat untuk mengintip bagaimana melakukannya dengan benar. Oleh karena itu, menulis dan mendukung autotest mahal bagi perusahaan, yang mempertanyakan kelayakan otomatisasi seperti itu.
Sementara itu, otomatisasi uji mengejar tujuan yang baik. Ini memungkinkan Anda untuk selalu memiliki panduan hijau dan siap untuk dirilis. Dan ini berarti Anda dapat meluncurkan rilis dengan cepat.
Satu-satunya masalah adalah menemukan jawaban untuk pertanyaan di atas. Tetapi mereka hampir sama untuk semua tim. Jadi mengapa tidak mengotomatiskan solusi mereka?
Apa yang kita inginkan dari framework?
Mari kita ungkapkan harapan kita sedikit dari kerangka kerja.
Mudah dibaca
Secara default, hanya perpustakaan Espresso yang tersedia untuk kami di Android. Tentu saja, ada Appium + Mentimun, yang secara teori memungkinkan Anda untuk menulis tes pada dua platform sekaligus. Tetapi masyarakat dengan percaya diri bergerak menuju instrumen pertama. Saya tidak akan menjelaskan semua pro dan kontra dari perpustakaan di atas: jaringan penuh dengan informasi tentang ini. Di sini, misalnya, adalah salah satu tautan yang relatif baru:
Appium vs Espresso. Apa yang harus dipilih dan bagaimana cara menggunakannya?Jadi, Espresso. Bukan alat yang buruk, tapi apinya agak terbalik. Lihatlah kode sederhana:
@Test fun espressoTest() { onView(allOf(allOf(withId(R.id.espresso), isDescendantOfA(withId(R.id.coffee_variates))), isDescendantOfA(withId(R.id.content)))) .check(matches(withEffectiveVisibility(View.VISIBLE))) }
Anda harus berpikir untuk mencari tahu, kan?
Dewa-dewa dari Thailand dan Australia memberi kami perpustakaan
Kakao , yang dapat Anda pahami sekilas tentang apa yang terjadi dalam ujian Anda. Ini kode yang sama, tetapi dengan Kakao:
@Test fun kakaoTest() { mainScreen { myView.isVisible() } }
Jauh lebih baik. Tetapi sekarang bayangkan Anda telah mengotomatiskan seluruh kotak uji. Seperti apa kodenya?
@RunWith(AndroidJUnit4::class) class OpenHomeScreenTest: TestCase() { @Test fun test() { MainScreen() { homeButton.click() } HomeScreen() { title { isVisible() hasAnyText() } } } }
Masalah utama adalah bahwa, melihat tes ini, sulit untuk menghubungkannya dengan test case yang Anda otomatiskan. Anda dapat, tentu saja, menambahkan log atau sesuatu seperti itu. Atau masukkan dsl, yang segera mengubah tampilan tes Anda:
@RunWith(AndroidJUnit4::class) class OpenHomeScreenTest: TestCase() { @Test fun test() { step(“1. Open Home screen”) { MainScreen() { homeButton.click() } } step(“2. Check Home title”) { HomeScreen() { title { isVisible() hasAnyText() } } } } }
Setuju, itu terlihat sangat berbeda.
Stabilitas
Pustaka untuk tes ui gagal. Tindakan yang sama dapat dilakukan 50 kali dengan sukses, dan pada istirahat ke-51 tanpa alasan yang jelas. Dan pada putaran ke-52, semuanya baik-baik saja lagi. Dan "kepanikan" seperti itu bisa merusak saraf Anda.
Kami berpikir, mengapa tidak mencoba mencegat semua tindakan Kakao-Espresso, dan sudah menambahkan perilaku tambahan di sana yang bertujuan menangani kesalahan acak tersebut.
Begitulah cara
versi 2.1 perpustakaan Kakao lahir, memungkinkan Anda untuk mengintegrasikan ke semua panggilan Espresso.
Selain itu, kami membuat pencegat kami sendiri, yang dengannya Anda dapat mengubah perilaku di dial-peer atau, misalnya, cukup login. Selain itu, pencegat ini dapat disesuaikan, sehingga Anda dapat menyesuaikannya agar sesuai dengan kebutuhan Anda. Baca lebih lanjut di
dok .
Khususnya, sebagai bagian dari pertarungan melawan tes yang tidak jelas - jika beberapa tindakan Anda membuat pengecualian, maka Kaspresso akan mencoba:
- Gulir. Mungkin tampilan Anda tidak terlihat di layar.
- Hapus dialog sistem yang bisa datang dari Tuhan yang tahu di mana.
- Ulangi panggilan terputus selama dua detik.
Dengan langkah-langkah ini, kami sepenuhnya menyelesaikan masalah dengan tes serpihan!
Penebangan
Salah satu masalah utama yang menyertai autotest adalah kurangnya penebangan yang dapat dipahami, yang khususnya tidak cukup ketika tes crash. Duduk dan bertanya-tanya apa dan bagaimana telah jatuh di sini.
Berkat intersep yang disebutkan di atas, kami dapat membangun sistem logging yang cukup luas.
Mari kita lihat sebuah contoh:


Secara default, Kaspresso mencatat semua tindakan Anda, memilih setiap langkah tes, menampilkan waktu eksekusi, dll.
Adb Lengkap dalam Tes Espresso
Awalnya, adb tidak tersedia dalam tes Espresso. Ya, ada
adb shell , tetapi ada fungsi jauh lebih sedikit daripada di
adb penuh. Tetapi ada begitu banyak hal di dalamnya yang dapat berguna dalam ujian.
Kami telah membuat pustaka
AdbServer terpisah yang akan mengembalikan
adb penuh ke pengujian Anda! Video di atas merinci bagaimana kami berjuang dan apa yang kami lalui untuk itu (
satu dan
dua ).
Bekerja dengan OS Android
Kekhususan tes di Kaspersky Lab adalah kita harus banyak bekerja dengan OS Android: mengatur beberapa pengaturan, mengunggah file ke sistem, dll. Semua ini mendorong kita untuk membakukan semua pekerjaan kita dengan sistem, membuat satu set antarmuka yang jelas, dapat diakses melalui satu titik entri - kelas
Perangkat .
Apa antarmuka ini dan apa yang mereka lakukan? Biarkan saya memberi Anda beberapa slide dari presentasi Yegor sebagai ilustrasi:




Dokumentasinya ada di
sini .
Di bawah tenda, AdbServer dan UiAutomator terutama digunakan.
Tapi! Jika Anda tiba-tiba tidak puas dengan implementasi antarmuka, Anda dapat mengatur implementasi melalui Configurator.
Cuplikan layar untuk DocLoc (Dokumentasi dan Pelokalan)
Semua proyek di mana ada pelokalan, sering kali ada kebutuhan untuk mengambil tangkapan layar dalam berbagai bahasa untuk memberikannya kepada penerjemah sebagai ilustrasi. Lagi pula, sangat sulit untuk membuat terjemahan yang benar tanpa melihat di mana dan bagaimana suatu baris tertentu digunakan. Karena itu, saya ingin dapat mengambil tangkapan layar dengan cepat dan segera dalam semua bahasa. Termasuk tangkapan layar dialog sistem. Anda juga mungkin memerlukan tangkapan layar di layar lawas, dan tanpa refactoring global.
Semua ini memungkinkan Anda untuk membuat Kaspresso keluar dari kotak. Baca lebih lanjut di
dokumentasi .
Arsitektur dan praktik terbaik
Salah satu tugas utama Kaspresso adalah membuat dsl yang akan mendorong Anda ke arsitektur tes yang benar dan penulisan yang benar.
Banyak salinan yang rusak pada topik ini, karena Anda, sayangnya, tidak akan menemukan aturan seperti itu di mana pun. Yang paling banyak Anda temukan adalah artikel di
Halaman Obyek .
Oleh karena itu, kami tidak berusaha dan menyoroti masalah ini dalam
dokumentasi , dan dalam
video satu kali dan
video dua .
Selain itu, Sasha Blinov menulis
artikel yang bagus
tentang Kotlin DSL dan tes elegan . Dsl yang dijelaskan dalam artikel ini disediakan oleh Kaspresso.
Kembali ke Mobius, kami mengusulkan opsi tentang cara mempercepat dampak autotest dan dengan cepat mengintegrasikannya ke dalam PullRequest, melewati masalah infrastruktur yang tak terhindarkan. Kami membicarakan hal ini secara lebih rinci di
sini .
Bagaimana menghubungkan dan mengkonfigurasi Kaspresso jika Anda sudah memiliki banyak tes
Pesona utama adalah bahwa jika Anda sudah memiliki banyak tes yang ditulis dalam Kakao dan Anda ingin menerapkan Kaspresso, maka Anda tidak perlu menulis ulang apa pun! Cukup mewarisi kelas tes Anda dari kelas TestCase khusus. Dan itu saja!
Itu:
@RunWith(AndroidJUnit4::class) class OpenHomeScreenTest { private val mainScreen = MainScreen() private val homeScreen = HomeScreen() @get:Rule val activityTestRule = ActivityTestRule(MainActivity::class.java, true, false) @Test fun test() { ... } }
Itu menjadi:
@RunWith(AndroidJUnit4::class) class OpenHomeScreenTest : TestCase() { private val mainScreen = MainScreen() private val homeScreen = HomeScreen() @get:Rule val activityTestRule = ActivityTestRule(MainActivity::class.java, true, false) @Test fun test() { ... } }
Dan jika Anda tidak menyukai warisan, gunakan kelas
TestRule yang serupa.
Seperti yang telah kami sebutkan, Kaspresso adalah kerangka kerja yang sangat fleksibel dan dapat disesuaikan. Semua pengaturan tersedia melalui kelas
Kaspresso dengan nama yang sama.
Pengaturan standar adalah default. Jika Anda ingin menyesuaikan sesuatu, itu akan terlihat seperti ini:
@RunWith(AndroidJUnit4::class) class OpenHomeScreenTest : TestCase( Kaspresso.Builder.default().apply { viewBehaviorInterceptors.add(MyInterceptor()) flakySafetyParams.timeoutMs = 1_000 } ) { private val mainScreen = MainScreen() private val homeScreen = HomeScreen() @get:Rule val activityTestRule = ActivityTestRule(MainActivity::class.java, true, false) @Test fun test() { ... } }
Yaitu,
Kaspresso.Builder tersedia melalui
konstruktor TestCase , di mana Anda mengatur semua pengaturan yang Anda butuhkan. Rincian tentang konfigurator ditulis dalam
dokumentasi .
Rencana segera
Dalam waktu dekat kami berencana untuk menambahkan hal-hal berikut:
Tampilkan langkah-langkah pengujian di Allure (halo kepada teman-teman dari HeadHunter)
Melalui pencegat khusus, kami menyiapkan data untuk
Marathon . Ini memungkinkan kami untuk melihat laporan Allure yang bersifat berikut:

Detail dalam
PR # 4PS PR sudah dalam versi 1.0.1, sekarang kami sedang mempersiapkan PR yang sesuai di
Marathon .
Ps. Ada ide untuk melampirkan sepotong log tertentu untuk setiap langkah, dan menambahkan tangkapan layar ke langkah "jatuh".
Menguji skrip pemutakhiran
Seringkali perlu untuk memeriksa kebenaran dari peningkatan aplikasi. Ya, beberapa cek dapat ditransfer ke unit test. Tetapi kami ingin tenang untuk seluruh aplikasi secara keseluruhan.
Sayangnya, pada Espresso murni tidak mungkin untuk melakukan ini, karena jika kita menginstal ulang apk yang diuji, tes akan gagal. Entah bagaimana Anda dapat mencoba menipu pelari, tetapi sulit bagi saya untuk membayangkan bagaimana perbaikan akan terlihat dan seberapa stabil mereka nantinya.
Oleh karena itu, di Kaspresso, kami sedang menyiapkan solusi untuk masalah ini, berdasarkan UiAutomator. Namun, di bagian atas Anda akan memiliki semua dsl akrab yang sama mencuat, sangat mirip dengan Kakao dan dengan dukungan yang sama untuk menyadap.
Tautan yang bermanfaat
KaspressoAdbServerObrolan , di mana kami akan selalu dengan senang hati menjawab semua pertanyaan Anda
Ucapan Terima Kasih
Terima kasih khusus kepada semua orang yang berpartisipasi dalam pengembangan proyek.
Itu sangat sulit, tetapi sangat keren!


Alih-alih sebuah kesimpulan
Kami percaya bahwa Kaspresso dan AdbServer akan membuat hidup Anda lebih baik.
Kami menyambut umpan balik Anda, rekomendasi, Yishuyam dan PulRequest!
Dan jangan lupa untuk menaruh tanda bintang!
PS Dan di akhir jajak pendapat kecil =)