Tangkapan layar iOS otomatis menggunakan XCTestplan dan Xcode 11

Raiffeisenbank memiliki beberapa aplikasi seluler yang harus berjalan di berbagai perangkat dan sistem operasi, jadi kami mencoba mengotomatiskan proses rutin dalam pengujian. Artikel ini sepertinya bermanfaat bagi kami, dan kami memutuskan untuk menerjemahkannya. sumber foto: unsplash.com Jika aplikasi Anda multibahasa, universal, dan dirancang untuk perangkat yang berbeda, maka Anda dapat menghabiskan banyak waktu membuat tangkapan layar untuk setiap konfigurasi. Bayangkan Anda memiliki empat bahasa, dukungan untuk iPad dan iPhone dan Anda harus menyimpan masing-masing 4 layar - ini adalah 32 tangkapan layar. Prosesnya harus otomatis agar tidak membuang waktu setiap kali antarmuka diperbarui.






Alat XCTestPlan, yang muncul di Xcode 11, memungkinkan kita untuk membuat beberapa konfigurasi untuk pengujian. Saat ini, konfigurasi paling sering digunakan untuk menentukan bagaimana tes akan berjalan, termasuk pilihan bahasa untuk aplikasi. Pada artikel ini, Anda akan belajar cara menggunakan XCTestPlan untuk mengotomatisasi tangkapan layar.

Luncurkan XCTestplan


Mari kita buat target UITests terpisah untuk mengotomatiskan pembuatan tangkapan layar, yang sangat berguna jika Anda tidak berencana untuk menjalankan tes utama Anda dengan konfigurasi ini. Untuk membuat target baru, pilih File -> Baru -> Target dan buat Bundel Pengujian UI baru . Setelah itu, Anda perlu menambahkan XCTestplan baru ke target ini. Untuk melakukan ini, Anda dapat menggunakan menu Produk -> Rencana Tes -> Rencana Tes Baru , atau dalam Editor Skema pilih Konversi untuk menggunakan Rencana Tes . Jika Anda melakukan ini melalui menu, Anda perlu memastikan bahwa target baru ada di tab `Test`.

Karena kami hanya ingin mengonfigurasi pengaturan bahasa, kami dapat membiarkan Pengaturan Bersama tidak berubah dan cukup menambahkan konfigurasi baru untuk setiap bahasa yang kami dukung. Seperti inilah pengaturan untuk aplikasi yang mendukung bahasa Inggris, Jerman, dan Prancis:

gambar

Ini semua pengaturan yang diperlukan dan peluncuran XCTestplan.

Screenshot Automation


Tes UI Anda yang membuat tangkapan layar praktis tidak akan berbeda dari tes yang biasa Anda lakukan, kecuali bahwa itu akan membuat lampiran. Anda juga dapat menambahkan pemeriksaan XCTAssert sehingga pengujian gagal jika terjadi kesalahan.

Poin penting lainnya: Anda mungkin harus menunggu Exppectations jika UI Anda tidak siap pada saat screenshot diambil ( tampilkan / sembunyikan keyboard, akhiri animasi).

Di bawah ini adalah contoh dengan semua metode pembantu:

func testScreenshots() {
    let app = XCUIApplication()
    let searchButton = app.buttons["search"]
    searchButton.tap()
    
    let keyboard = app.keyboards.firstMatch
    waitForExistence(of: keyboard)
    app.typeText("Cupertino")
    add(takePromoShot(name: "Search"))
    
    let firstResult = app.cells.firstMatch
    firstResult.tap()
    waitForDisappearance(of: keyboard)
    add(takePromoShot(name: "Result"))
}

func waitForExistence(of element: XCUIElement) {
    let predicate = NSPredicate(format: "exists == TRUE")
    expectation(for: predicate, evaluatedWith: element, handler: nil)
    waitForExpectations(timeout: 5.0, handler: nil)
}

func waitForDisappearance(of element: XCUIElement) {
    let predicate = NSPredicate(format: "exists == FALSE")
    expectation(for: predicate, evaluatedWith: element, handler: nil)
    waitForExpectations(timeout: 5.0, handler: nil)
}

func takePromoShot(name: String) -> XCTAttachment {
    let lang = Locale.preferredLanguages[0]
    let screenshot = XCUIScreen.main.screenshot()
    let attachment = XCTAttachment(screenshot: screenshot)
    attachment.lifetime = .keepAlways
    attachment.name = "\(lang)-\(name)"
    return attachment
}

Perhatikan fitur terbaru. Dibutuhkan nama snapshot, menambahkan pengidentifikasi bahasa, mengambil tangkapan layar dan mengembalikan lampiran XCTA dengan nilai parameter .keepAlways . Ini penting karena secara default, tangkapan layar yang diambil selama pengujian dihapus jika pengujian berhasil. Lifiteme adalah parameter penting karena memastikan tangkapan layar disimpan setelah tes selesai. Selama pengujian UI, tangkapan layar diambil secara konstan. Mereka sangat berguna ketika Anda perlu menentukan mengapa dan kapan tes jatuh; tetapi secara default tangkapan layar akan dihapus jika tes berhasil. Jadi, ketika testScreenshots () berhasil, Anda hanya akan memiliki tangkapan layar yang diperlukan.

Bilah status kebiasaan


Sebagian besar pengembang lebih suka melihat di bilah layar bilah status dengan waktu yang tepat, sinyal jaringan lengkap, dan detail lainnya. Dalam Xcode 11, ini menjadi lebih mudah. Ada utilitas xcrun simctl status_bar , yang memungkinkan Anda menentukan pengaturan ini. Ini dapat ditambahkan sebagai Build Phase :

xcrun simctl status_bar booted override --time 9:41 --operatorName ' ' --cellularMode active --cellularBar 4 --wifiBars 3 --batteryState charged

Setelah perintah ini, bilah status akan terlihat sama seperti di materi pemasaran Apple. Sayangnya, tim tidak akan bekerja pada perangkat nyata, hanya di simulator. Juga harus dicatat bahwa simulator yang Anda gunakan harus berjalan sebelum Anda memulai tes untuk mengumpulkan tangkapan layar.

Mengumpulkan tangkapan layar yang dihasilkan


Sekarang kita dapat menjalankan tes UI kami. Ketika mereka lewat, kita akan melihat hasilnya di Report Navigator di Xcode. Juga akan ada tes yang mengandung prosedur yang dikelompokkan berdasarkan konfigurasi bahasa. Prosedur yang memiliki lampiran ditandai dengan klip kertas. Gambar sendiri dapat dibuka di QuickLook .

gambar

Mengumpulkan semua gambar yang dihasilkan secara terpisah bisa sangat memakan waktu, terutama jika aplikasi Anda mendukung banyak bahasa. Sayangnya, lampiran ini tidak muncul sebagai png atau jpg di antara hasil tes (perubahan lain dalam Xcode 11). Tetapi Anda dapat menguraikan hasil tes dan menemukan JSON yang menunjuk ke lampiran nyata dan mengumpulkannya. Ini dapat dilakukan dengan menggunakan utilitas xcparse.. Itu diinstal menggunakan Homebrew dan diluncurkan oleh perintah:

xcparse screenshots /path/to/Test.xcresult /path/to/outputDirectory

Bendera tambahan akan mengelompokkan file berdasarkan perangkat, OS, atau konfigurasi. Nama-nama file kami berisi pengidentifikasi bahasa, sehingga Anda bisa mengurutkannya berdasarkan nama.

Kesimpulan


Pendekatan yang dijelaskan telah memungkinkan kami untuk menghemat waktu yang cukup, terutama dalam situasi di mana ada persyaratan untuk mendukung perangkat dengan resolusi baru atau antarmuka diperbarui secara signifikan. Di WWDC20, saya ingin melihat pilihan perangkat sebagai bagian dari konfigurasi XCTestplan, tetapi untuk sekarang, Anda harus memilih secara manual atau menggunakan skrip yang mengumpulkan tangkapan layar yang diperlukan di AppStore.

All Articles