Busur derajat - Panduan Cepat
Bab ini memberi Anda pengantar Busur derajat, di mana Anda akan belajar tentang asal mula kerangka pengujian ini dan mengapa Anda harus memilih ini, cara kerja dan batasan alat ini.
Apa itu busur derajat?
Busur derajat adalah kerangka pengujian ujung ke ujung open source untuk aplikasi Angular dan AngularJS. Itu dibuat oleh Google di atas WebDriver. Ini juga berfungsi sebagai pengganti kerangka kerja pengujian AngularJS E2E yang ada yang disebut "Angular Scenario Runner".
Ia juga berfungsi sebagai integrator solusi yang menggabungkan teknologi canggih seperti NodeJS, Selenium, Jasmine, WebDriver, Cucumber, Mocha dll. Seiring dengan pengujian aplikasi AngularJS, ia juga menulis uji regresi otomatis untuk aplikasi web normal. Ini memungkinkan kita untuk menguji aplikasi kita seperti pengguna sungguhan karena menjalankan pengujian menggunakan browser yang sebenarnya.
Diagram berikut akan memberikan gambaran singkat tentang busur derajat -
Perhatikan bahwa pada diagram di atas, kita memiliki -
Protractor - Seperti dibahas sebelumnya, ini adalah pembungkus WebDriver JS yang dirancang khusus untuk aplikasi sudut.
Jasmine- Ini pada dasarnya adalah kerangka kerja pengembangan yang digerakkan oleh perilaku untuk menguji kode JavaScript. Kami dapat menulis tes dengan mudah dengan Jasmine.
WebDriver JS - Ini adalah implementasi binding Node JS untuk selenium 2.0 / WebDriver.
Selenium - Ini hanya mengotomatiskan browser.
Asal
Seperti yang dikatakan sebelumnya, Busur derajat adalah pengganti kerangka kerja pengujian AngularJS E2E yang ada yang disebut "Angular Scenario Runner". Pada dasarnya, asal Busur derajat dimulai dengan akhir dari Skenario Runner. Pertanyaan yang muncul disini adalah mengapa kita perlu membangun busur derajat? Untuk memahami ini, pertama-tama kita perlu memeriksa pendahulunya - Scenario Runner.
Awal Busur Derajat
Julie Ralph, kontributor utama pengembangan Protractor, memiliki pengalaman berikut dengan Angular Scenario Runner di proyek lain dalam Google. Ini semakin menjadi motivasi untuk membangun Busur Derajat, khususnya untuk mengisi celah -
“Kami mencoba menggunakan Scenario Runner dan kami menemukan bahwa itu benar-benar tidak dapat melakukan hal-hal yang perlu kami uji. Kami perlu menguji hal-hal seperti login. Halaman login Anda bukan halaman Angular, dan Scenario Runner tidak bisa mengatasinya. Dan tidak dapat menangani hal-hal seperti munculan dan banyak jendela, menavigasi riwayat browser, hal-hal seperti itu. ”
Keuntungan terbesar dari Busur Derajat adalah kematangan proyek Selenium dan ia menyimpulkan metodenya sehingga dapat dengan mudah digunakan untuk proyek Angular. Desain busur derajat dibangun sedemikian rupa sehingga menguji semua lapisan seperti UI web, layanan backend, lapisan persistensi, dan sebagainya dari suatu aplikasi.
Mengapa Busur Derajat?
Seperti yang kita ketahui bahwa hampir semua aplikasi menggunakan JavaScript untuk pengembangannya. Tugas penguji menjadi sulit ketika JavaScript bertambah besar dan menjadi kompleks untuk aplikasi karena meningkatnya jumlah aplikasi itu sendiri. Seringkali menjadi sangat sulit untuk menangkap elemen web dalam aplikasi AngularJS, menggunakan sintaks HTML yang diperluas untuk mengekspresikan komponen aplikasi web, dengan menggunakan JUnit atau Selenium WebDriver.
Pertanyaannya di sini adalah mengapa Selenium Web Driver tidak dapat menemukan elemen web AngularJS? Alasannya adalah karena aplikasi AngularJS memiliki beberapa atribut HTML tambahan seperti ng-repeater, ng-controller dan ng-model dll. Yang tidak termasuk dalam pencari Selenium.
Di sini, pentingnya Busur Derajat muncul karena Busur Derajat di atas Selenium dapat menangani dan mengontrol elemen HTML yang diperluas tersebut dalam aplikasi web AngularJS. Itulah mengapa kami dapat mengatakan bahwa sebagian besar kerangka kerja fokus pada melakukan pengujian unit untuk aplikasi AngularJS, Busur derajat digunakan untuk melakukan pengujian fungsionalitas sebenarnya dari suatu aplikasi.
Kerja Busur Derajat
Busur derajat, kerangka pengujian, bekerja bersama dengan Selenium untuk menyediakan infrastruktur pengujian otomatis untuk mensimulasikan interaksi pengguna dengan aplikasi AngularJS yang berjalan di browser atau perangkat seluler.
Cara kerja busur derajat dapat dipahami dengan bantuan langkah-langkah berikut -
Step 1- Pada langkah pertama, kita perlu menulis tes. Itu bisa dilakukan dengan bantuan Jasmine atau Mocha atau Cucumber.
Step 2- Sekarang, kita perlu menjalankan tes yang bisa dilakukan dengan bantuan Busur derajat. Ini juga disebut pelari uji.
Step 3 - Pada langkah ini, server Selenium akan membantu untuk mengatur browser.
Step 4 - Akhirnya, API browser dipanggil dengan bantuan Selenium WebDriver.
Keuntungan
Kerangka kerja pengujian ujung ke ujung open source ini menawarkan keuntungan berikut -
Alat open source, Busur derajat sangat mudah dipasang dan diatur.
Bekerja dengan baik dengan framework Jasmine untuk membuat pengujian.
Mendukung pengembangan yang digerakkan oleh pengujian (TDD).
Berisi menunggu otomatis yang berarti kami tidak perlu menambahkan waktu tunggu dan tidur secara eksplisit ke pengujian kami.
Menawarkan semua keunggulan Selenium WebDriver.
Mendukung pengujian paralel melalui beberapa browser.
Memberikan manfaat sinkronisasi otomatis.
Memiliki kecepatan pengujian yang sangat baik.
Batasan
Kerangka kerja pengujian ujung ke ujung open source ini memiliki batasan berikut -
Tidak menemukan vertikal apa pun dalam otomatisasi browser karena ini adalah pembungkus untuk WebDriver JS.
Pengetahuan tentang JavaScript sangat penting bagi pengguna, karena hanya tersedia untuk JavaScript.
Hanya menyediakan pengujian front-end karena ini adalah alat pengujian yang digerakkan oleh UI.
Karena pengetahuan JavaScript sangat penting untuk bekerja dengan Busur derajat, dalam bab ini, mari kita pahami konsep pengujian JavaScript secara rinci.
Pengujian dan Otomatisasi JavaScript
JavaScript adalah bahasa skrip yang paling populer diketik dan ditafsirkan secara dinamis, tetapi tugas yang paling menantang adalah menguji kodenya. Itu karena, tidak seperti bahasa terkompilasi lainnya seperti JAVA, dan C ++, tidak ada langkah kompilasi dalam JavaScript yang dapat membantu penguji untuk mengetahui kesalahan. Selain itu, pengujian berbasis browser sangat memakan waktu; oleh karena itu, diperlukan alat yang mendukung pengujian otomatis untuk JavaScript.
Konsep Pengujian Otomatis
Menulis pengujian selalu merupakan praktik yang baik karena membuat kode menjadi lebih baik; masalah dengan pengujian manual adalah proses ini memakan waktu sedikit dan rawan kesalahan. Proses pengujian manual juga cukup membosankan bagi programmer karena mereka perlu mengulang proses, menulis spesifikasi pengujian, mengubah kode, dan menyegarkan browser beberapa kali. Selain itu, pengujian manual juga memperlambat proses pengembangan.
Karena alasan di atas, selalu berguna untuk memiliki beberapa alat yang dapat mengotomatiskan pengujian ini dan membantu pemrogram untuk menyingkirkan langkah berulang dan membosankan ini. Apa yang harus dilakukan pengembang untuk membuat proses pengujian otomatis?
Pada dasarnya, pengembang dapat mengimplementasikan set alat di CLI (Command Line Interpreter) atau di IDE pengembangan (Lingkungan pengembangan terintegrasi). Kemudian, pengujian ini akan terus berjalan dalam proses terpisah meskipun tanpa masukan dari pengembang. Pengujian otomatis JavaScript juga bukanlah hal baru dan banyak alat seperti Karma, Busur derajat, CasperJS, dll. Telah dikembangkan.
Jenis Pengujian JavaScript
Mungkin ada tes yang berbeda untuk tujuan yang berbeda. Misalnya, beberapa pengujian ditulis untuk memeriksa perilaku fungsi dalam suatu program, sementara beberapa pengujian lainnya ditulis untuk menguji aliran modul atau fitur. Jadi, kami memiliki dua jenis pengujian berikut -
Pengujian Unit
Pengujian dilakukan pada bagian terkecil yang dapat diuji dari program yang disebut unit. Unit pada dasarnya diuji secara terpisah tanpa ketergantungan apa pun dari unit tersebut pada bagian lain. Dalam kasus JavaScript, metode atau fungsi individu yang memiliki perilaku tertentu dapat menjadi unit kode dan unit kode ini harus diuji secara terpisah.
Salah satu keuntungan dari pengujian unit adalah pengujian unit dapat dilakukan dalam urutan apa pun karena unit tersebut tidak bergantung satu sama lain. Keuntungan lain dari pengujian unit yang benar-benar diperhitungkan adalah dapat menjalankan pengujian kapan saja sebagai berikut -
- Dari awal proses pengembangan.
- Setelah menyelesaikan pengembangan modul / fitur apa pun.
- Setelah memodifikasi modul / fitur apa pun.
- Setelah menambahkan fitur baru di aplikasi yang ada.
Untuk pengujian unit otomatis aplikasi JavaScript, kita dapat memilih dari banyak alat pengujian dan kerangka kerja seperti Mocha, Jasmine, dan QUnit.
Pengujian End-to-End
Ini dapat didefinisikan sebagai metodologi pengujian yang digunakan untuk menguji apakah aliran aplikasi dari awal hingga akhir (dari satu ujung ke ujung lainnya) berfungsi dengan baik sesuai desain.
Pengujian ujung ke ujung juga disebut pengujian fungsi / aliran. Tidak seperti pengujian unit, pengujian ujung ke ujung menguji bagaimana masing-masing komponen bekerja bersama sebagai sebuah aplikasi. Inilah perbedaan utama antara pengujian unit dan pengujian ujung ke ujung.
Misalnya, jika kita memiliki modul pendaftaran di mana pengguna perlu memberikan beberapa informasi yang valid untuk menyelesaikan pendaftaran, maka pengujian E2E untuk modul tersebut akan mengikuti langkah-langkah berikut untuk menyelesaikan pengujian -
- Pertama, itu akan memuat / mengkompilasi formulir atau modul.
- Sekarang, itu akan mendapatkan DOM (Model objek dokumen) dari elemen formulir.
- Selanjutnya, picu acara klik tombol kirim untuk memeriksa apakah itu berfungsi atau tidak.
- Sekarang, untuk tujuan validasi, kumpulkan nilai dari kolom input.
- Selanjutnya, bidang masukan harus divalidasi.
- Untuk tujuan pengujian, panggil API palsu untuk menyimpan data.
Setiap langkah memberikan hasil masing-masing yang akan dibandingkan dengan hasil yang diharapkan.
Sekarang, pertanyaan yang muncul adalah, sementara E2E atau pengujian fungsional semacam ini juga dapat dilakukan secara manual, mengapa kita perlu otomatisasi untuk ini? Alasan utamanya adalah otomatisasi akan mempermudah proses pengujian ini. Beberapa alat yang tersedia yang dapat dengan mudah diintegrasikan dengan aplikasi apapun, untuk tujuan ini adalah Selenium, PhantomJS dan Protractor.
Alat & Kerangka Pengujian
Kami memiliki berbagai alat pengujian dan kerangka kerja untuk pengujian Angular. Berikut ini adalah beberapa alat dan kerangka kerja yang terkenal -
Karma
Karma, dibuat oleh Vojta Jina, adalah pelari uji coba. Awalnya proyek ini disebut Testacular. Ini bukan kerangka kerja pengujian, yang berarti memberi kita kemampuan untuk dengan mudah dan otomatis menjalankan pengujian unit JavaScript di browser nyata. Karma dibangun untuk AngularJS karena sebelum Karma tidak ada alat pengujian otomatis untuk pengembang JavaScript berbasis web. Di sisi lain, dengan otomatisasi yang disediakan oleh Karma, pengembang dapat menjalankan satu perintah sederhana dan menentukan apakah seluruh rangkaian pengujian telah lulus atau gagal.
Kelebihan menggunakan Karma
Berikut ini adalah beberapa kelebihan menggunakan Karma dibandingkan dengan proses manual -
- Mengotomatiskan pengujian di beberapa browser serta perangkat.
- Memantau kesalahan file dan memperbaikinya.
- Memberikan dukungan dan dokumentasi online.
- Memudahkan integrasi dengan server integrasi berkelanjutan.
Kontra Menggunakan Karma
Berikut ini adalah beberapa kekurangan dalam menggunakan Karma -
Kerugian utama dari penggunaan Karma adalah membutuhkan alat tambahan untuk mengkonfigurasi dan memelihara.
Jika Anda menggunakan runner pengujian Karma dengan Jasmine, maka lebih sedikit dokumentasi yang tersedia untuk menemukan informasi tentang menyiapkan CSS Anda jika memiliki beberapa id untuk satu elemen.
Melati
Jasmine, kerangka kerja pengembangan berbasis perilaku untuk menguji kode JavaScript, dikembangkan di Pivotal Labs. Sebelum framework Jasmine dikembangkan secara aktif, framework pengujian unit serupa bernama JsUnit juga dikembangkan oleh Pivotal Labs, yang memiliki runner pengujian bawaan. Pengujian browser dapat dijalankan melalui pengujian Jasmine dengan menyertakan file SpecRunner.html atau dengan menggunakannya sebagai runner pengujian baris perintah juga. Dapat digunakan dengan atau tanpa Karma juga.
Kelebihan Menggunakan Jasmine
Berikut ini adalah beberapa keuntungan menggunakan Jasmine -
Kerangka kerja yang tidak bergantung pada browser, platform, dan bahasa.
Mendukung pengembangan yang didorong oleh tes (TDD) bersama dengan pengembangan yang didorong perilaku.
Memiliki integrasi default dengan Karma.
Sintaks yang mudah dipahami.
Menyediakan fungsi mata-mata uji, pemalsuan, dan penerusan yang membantu pengujian sebagai fungsi tambahan.
Kontra Menggunakan Jasmine
Berikut ini adalah tipuan menggunakan Jasmine -
Pengujian harus dikembalikan oleh pengguna saat berubah karena tidak ada fitur menonton file yang tersedia di Jasmine saat menjalankan pengujian.
Moka
Mocha, ditulis untuk aplikasi Node.js, adalah kerangka kerja pengujian tetapi juga mendukung pengujian browser. Ini sangat mirip dengan Jasmine tetapi perbedaan utama di antara mereka adalah Mocha membutuhkan beberapa plugin dan pustaka karena tidak dapat berjalan mandiri sebagai kerangka kerja pengujian. Di sisi lain, Jasmine berdiri sendiri. Namun, Mocha lebih fleksibel digunakan daripada Jasmine.
Kelebihan menggunakan Mocha
Berikut ini adalah beberapa keuntungan menggunakan Mocha -
- Mocha sangat mudah dipasang dan dikonfigurasi.
- Dokumentasi yang ramah pengguna dan sederhana.
- Berisi plugin dengan beberapa proyek node.
Kontra menggunakan Mocha
Berikut ini adalah beberapa kekurangan penggunaan Mocha -
- Perlu modul terpisah untuk pernyataan, mata-mata, dll.
- Ini juga membutuhkan konfigurasi tambahan untuk digunakan dengan Karma.
Hentikan
QUint, awalnya dikembangkan oleh John Resig pada tahun 2008 sebagai bagian dari jQuery, adalah rangkaian pengujian unit JavaScript yang kuat namun mudah digunakan. Ini dapat digunakan untuk menguji kode JavaScript umum apa pun. Meskipun berfokus pada pengujian JavaScript di browser, namun sangat nyaman digunakan oleh pengembang.
Kelebihan menggunakan QUnit
Berikut ini adalah beberapa keuntungan menggunakan QUnit -
- Mudah dipasang dan dikonfigurasi.
- Dokumentasi yang ramah pengguna dan sederhana.
Kontra menggunakan QUnit
Berikut ini adalah tipuan menggunakan QUnit -
- Ini terutama dikembangkan untuk jQuery dan karenanya tidak begitu baik untuk digunakan dengan kerangka kerja lain.
Selenium
Selenium, awalnya dikembangkan oleh Jason Huggins pada tahun 2004 sebagai alat internal di ThoughtWorks, adalah alat otomatisasi pengujian open source. Selenium mendefinisikan dirinya sebagai “Selenium mengotomatiskan browser. Itu dia!". Otomatisasi browser berarti bahwa pengembang dapat berinteraksi dengan browser dengan sangat mudah.
Kelebihan menggunakan Selenium
Berikut ini adalah beberapa keuntungan menggunakan Selenium -
- Berisi set fitur besar.
- Mendukung pengujian terdistribusi.
- Memiliki dukungan SaaS melalui layanan seperti Sauce Labs.
- Mudah digunakan dengan dokumentasi sederhana dan sumber daya yang kaya tersedia.
Kontra menggunakan Selenium
Berikut ini adalah beberapa kekurangan dalam menggunakan Selenium -
- Kerugian utama menggunakan Selenium adalah harus dijalankan sebagai proses terpisah.
- Konfigurasi agak rumit karena pengembang perlu mengikuti beberapa langkah.
Pada bab sebelumnya, kita telah mempelajari dasar-dasar busur derajat. Di bab ini, mari kita pelajari cara menginstal dan mengkonfigurasinya.
Prasyarat
Kami perlu memenuhi prasyarat berikut sebelum menginstal Busur Derajat di komputer Anda -
Node.js
Busur derajat adalah modul Node.js, oleh karena itu prasyarat yang sangat penting adalah kita harus menginstal Node.js di komputer kita. Kami akan menginstal paket Protractor menggunakan npm (manajer paket JavaScript), yang disertakan dengan Node.js.
Untuk menginstal Node.js silakan ikuti tautan resmi - https://nodejs.org/en/download/. Setelah menginstal Node.js, Anda dapat memeriksa versi Node.js dan npm dengan menulis perintahnode --version dan npm --version di command prompt seperti yang ditunjukkan di bawah ini -
Chrome
Google Chrome, browser web yang dibangun oleh Google, akan digunakan untuk menjalankan tes ujung-ke-ujung di Protractor tanpa memerlukan server Selenium. Anda dapat mengunduh chrome dengan mengklik tautan -https://www.google.com/chrome/.
Selenium WebDriver untuk Chrome
Alat ini dilengkapi dengan modul busur derajat npm dan memungkinkan kita untuk berinteraksi dengan aplikasi web.
Memasang Busur Derajat
Setelah menginstal Node.js di komputer kita, kita dapat menginstal Protractor dengan bantuan perintah berikut -
npm install -g protractor
Setelah busur derajat berhasil dipasang, kita dapat memeriksa versinya dengan menulis protractor --version perintah di command prompt seperti yang ditunjukkan di bawah ini -
Memasang WebDriver untuk Chrome
Setelah menginstal Protractor, kita perlu menginstal Selenium WebDriver for Chrome. Itu dapat diinstal dengan bantuan perintah berikut -
webdriver-manager update
Perintah di atas akan membuat direktori Selenium yang berisi driver Chrome yang diperlukan untuk digunakan dalam proyek.
Mengonfirmasi Instalasi & Konfigurasi
Kita dapat mengkonfirmasi instalasi dan konfigurasi Busur derajat dengan melakukan sedikit mengubah conf.js yang disediakan dalam contoh setelah menginstal Protractor. Anda dapat menemukan file conf.js ini di direktori rootnode_modules/Protractor/example.
Untuk ini, pertama buat file baru bernama testingconfig.js di direktori yang sama yaitu node_modules/Protractor/example.
Sekarang, di file conf.js, di bawah parameter deklarasi file sumber, tulis testingconfig.js.
Selanjutnya, simpan dan tutup semua file dan buka command prompt. Jalankan file conf.js seperti yang ditunjukkan pada gambar di bawah ini.
Konfigurasi dan instalasi Busur Derajat berhasil jika Anda mendapatkan output seperti yang ditunjukkan di bawah ini -
Output di atas menunjukkan bahwa tidak ada spesifikasi karena kami menyediakan file kosong di parameter deklarasi file sumber di file conf.js. Tetapi dari keluaran di atas, kita dapat melihat bahwa busur derajat dan WebDriver berjalan dengan sukses.
Masalah dalam penginstalan & konfigurasi
Saat menginstal dan mengonfigurasi Protractor dan WebDriver, kami mungkin menemukan masalah umum berikut -
Selenium tidak terpasang dengan benar
Ini adalah masalah paling umum saat menginstal WebDriver. Masalah ini muncul jika Anda tidak memperbarui WebDriver. Perhatikan bahwa kita harus memperbarui WebDriver, jika tidak, kita tidak akan bisa mereferensikannya ke instalasi Protractor.
Tidak dapat menemukan tes
Masalah umum lainnya adalah setelah menjalankan Busur derajat, itu menunjukkan bahwa tidak dapat menemukan tes. Untuk ini, kita harus memastikan bahwa jalur relatif, nama file atau ekstensi sudah benar. Kita juga perlu menulis file conf.js dengan sangat hati-hati karena ini dimulai dengan file konfigurasi itu sendiri.
Seperti dibahas sebelumnya, Protractor adalah open source, kerangka pengujian end-to-end untuk aplikasi Angular dan AngularJS. Ini adalah program Node.js. Di sisi lain, Selenium adalah kerangka kerja otomatisasi browser yang mencakup Server Selenium, API WebDriver, dan driver browser WebDriver.
Busur derajat dengan Selenium
Jika kita berbicara tentang hubungan busur derajat dan selenium, busur derajat dapat bekerja dengan server selenium untuk menyediakan infrastruktur pengujian otomatis. Infrastruktur dapat mensimulasikan interaksi pengguna dengan aplikasi sudut yang berjalan di browser atau perangkat seluler. Hubungan Protractor dan Selenium dapat dibagi menjadi tiga partisi yaitu test, server dan Browser, seperti yang ditunjukkan pada diagram berikut -
Proses Selenium WebDriver
Seperti yang telah kita lihat pada diagram di atas, pengujian menggunakan Selenium WebDriver melibatkan tiga proses berikut -
- Skrip uji
- Server
- Browser
Pada bagian ini, mari kita bahas komunikasi antara ketiga proses ini.
Komunikasi antara Skrip Tes & Server
Komunikasi antara dua proses pertama - skrip pengujian dan server bergantung pada cara kerja Selenium Server. Dengan kata lain, dapat dikatakan bahwa cara kerja server Selenium akan memberikan bentuk pada proses komunikasi antara skrip uji dan server.
Server Selenium dapat berjalan secara lokal di mesin kami sebagai Server Selenium mandiri (selenium-server-standalone.jar) atau dapat berjalan dari jarak jauh melalui layanan (Sauce Labs). Dalam kasus server Selenium mandiri, akan ada komunikasi http antara Node.js dan server selenium.
Komunikasi antara server dan browser
Seperti yang kita ketahui bahwa server bertanggung jawab untuk meneruskan perintah ke browser setelah menafsirkan hal yang sama dari skrip pengujian. Itulah sebabnya server dan browser juga membutuhkan media komunikasi dan disini komunikasi dilakukan dengan bantuanJSON WebDriver Wire Protocol. Browser diperluas dengan Driver Browser yang digunakan untuk menafsirkan perintah.
Konsep di atas tentang proses Selenium WebDriver dan komunikasinya dapat dipahami dengan bantuan diagram berikut -
Saat bekerja dengan Protractor, proses pertama, yaitu skrip uji dijalankan menggunakan Node.js tetapi sebelum melakukan tindakan apa pun di browser, ia akan mengirimkan perintah tambahan untuk memastikan bahwa aplikasi yang diuji sudah stabil.
Menyiapkan Server Selenium
Selenium Server bertindak seperti server proxy di antara skrip pengujian kami dan driver browser. Ini pada dasarnya meneruskan perintah dari skrip pengujian kami ke WebDriver dan mengembalikan respons dari WebDriver ke skrip pengujian kami. Ada opsi berikut untuk mengatur server Selenium yang termasuk di dalamnyaconf.js file skrip uji -
Server Selenium Mandiri
Jika kita ingin menjalankan server di mesin lokal kita, kita perlu menginstal server selenium mandiri. Prasyarat untuk menginstal server selenium mandiri adalah JDK (Java Development Kit). Kita harus menginstal JDK di mesin lokal kita. Kita dapat memeriksanya dengan menjalankan perintah berikut dari baris perintah -
java -version
Sekarang, kami memiliki opsi untuk menginstal dan memulai Server Selenium secara manual atau dari skrip uji.
Menginstal dan memulai server Selenium secara manual
Untuk menginstal dan memulai server Selenium secara manual, kita perlu menggunakan alat baris perintah WebDriver-Manager yang disertakan dengan Protractor. Langkah-langkah untuk menginstal dan memulai server Selenium adalah sebagai berikut -
Step 1- Langkah pertama adalah menginstal server Selenium dan ChromeDriver. Itu dapat dilakukan dengan bantuan menjalankan perintah berikut -
webdriver-manager update
Step 2- Selanjutnya, kita perlu memulai server. Itu dapat dilakukan dengan bantuan menjalankan perintah berikut -
webdriver-manager start
Step 3- Akhirnya kita perlu mengatur seleniumAddress di file config ke alamat server yang sedang berjalan. Alamat defaultnya adalahhttp://localhost:4444/wd/hub.
Memulai server Selenium dari Test Script
Untuk memulai server Selenium dari Test Script, kita perlu mengatur opsi berikut di file konfigurasi kita -
Location of jar file - Kita perlu mengatur lokasi file jar untuk server Selenium mandiri di file konfigurasi dengan mengatur seleniumServerJar.
Specifying the port- Kami juga perlu menentukan port yang akan digunakan untuk memulai Server Selenium mandiri. Ini dapat ditentukan dalam file konfigurasi dengan mengatur seleniumPort. Port default adalah 4444.
Array of command line options- Kami juga perlu mengatur larik opsi baris perintah untuk diteruskan ke server. Ini dapat ditentukan dalam file konfigurasi dengan mengatur seleniumArgs. Jika Anda membutuhkan daftar lengkap dari berbagai perintah, maka mulai server dengan-help bendera.
Bekerja dengan Server Selenium Jarak Jauh
Pilihan lain untuk menjalankan pengujian kami adalah menggunakan server Selenium dari jarak jauh. Prasyarat untuk menggunakan server jarak jauh adalah kita harus memiliki akun dengan layanan yang menghosting server. Saat bekerja dengan Protractor, kami memiliki dukungan bawaan untuk layanan berikut yang menghosting server -
TestObject
Untuk menggunakan TestObject sebagai Server Selenium jarak jauh, kita perlu mengatur testobjectUser, nama pengguna akun TestObject kita dan testobjectKey, kunci API dari akun TestObject kita.
BrowserStack
Untuk menggunakan BrowserStack sebagai Server Selenium jarak jauh, kita perlu mengatur browserstackUser, nama pengguna akun BrowserStack dan browserstackKey, kunci API dari akun BrowserStack kita.
Lab Saus
Untuk menggunakan Sauce Labs sebagai Remote Selenium Server, kita perlu mengatur sauceUser, nama pengguna akun Sauce Labs dan SauceKey, kunci API dari akun Sauce Labs kita.
Kobiton
Untuk menggunakan Kobiton sebagai Server Selenium jarak jauh kita perlu mengatur kobitonUser, nama pengguna akun Kobiton kita dan kobitonKey, kunci API dari akun Kobiton kita.
Langsung terhubung ke Driver Browser tanpa menggunakan Server Selenium
Satu lagi pilihan untuk menjalankan pengujian kami adalah menghubungkan ke Driver Browser secara langsung tanpa menggunakan server Selenium. Busur derajat dapat menguji secara langsung, tanpa menggunakan Server Selenium, terhadap Chrome dan Firefox dengan mengatur directConnect: true di file konfigurasi.
Menyiapkan Browser
Sebelum mengkonfigurasi dan mengatur browser, kita perlu mengetahui browser mana yang didukung oleh Protractor. Berikut ini adalah daftar browser yang didukung oleh Busur derajat -
- ChromeDriver
- FirefoxDriver
- SafariDriver
- IEDriver
- Appium-iOS/Safari
- Appium-Android/Chrome
- Selendroid
- PhantomJS
Untuk setting dan konfigurasi browser, kita perlu pindah ke file config Protractor karena setup browser dilakukan di dalam objek kapabilitas file config.
Menyiapkan Chrome
Untuk menyiapkan Browser Chrome, kita perlu menyetel objek kemampuan sebagai berikut
capabilities: {
'browserName': 'chrome'
}
Kami juga dapat menambahkan opsi Khusus Chrome yang bersarang di chromeOptions dan daftar lengkapnya dapat dilihat di https://sites.google.com/a/chromium.org/chromedriver/capabilities.
Misalnya, jika Anda ingin menambahkan penghitung FPS di kanan atas, maka dapat dilakukan seperti berikut di file konfigurasi -
capabilities: {
'browserName': 'chrome',
'chromeOptions': {
'args': ['show-fps-counter=true']
}
},
Menyiapkan Firefox
Untuk mengatur browser Firefox, kita perlu mengatur objek kemampuan sebagai berikut -
capabilities: {
'browserName': 'firefox'
}
Kami juga dapat menambahkan opsi Khusus Firefox yang bersarang di objek moz: firefoxOptions dan daftar lengkapnya dapat dilihat di https://github.com/mozilla/geckodriver#firefox-capabilities.
Misalnya, jika Anda ingin menjalankan pengujian di Firefox dalam mode aman, maka dapat dilakukan seperti berikut di file konfigurasi -
capabilities: {
'browserName': 'firefox',
'moz:firefoxOptions': {
'args': ['—safe-mode']
}
},
Menyiapkan browser lain
Untuk menyiapkan peramban selain Chrome atau Firefox, kita perlu memasang biner terpisah dari https://docs.seleniumhq.org/download/.
Menyiapkan PhantonJS
Sebenarnya, PhantomJS tidak lagi didukung karena masalah kerusakannya. Daripada itu, disarankan untuk menggunakan Chrome tanpa kepala atau Firefox tanpa kepala. Mereka dapat diatur sebagai berikut -
Untuk menyiapkan Chrome tanpa kepala, kita perlu memulai Chrome dengan –panji tanpa kepala sebagai berikut -
capabilities: {
'browserName': 'chrome',
'chromeOptions': {
'args': [“--headless”, “--disable-gpu”, “--window-size=800,600”]
}
},
Untuk menyiapkan Firefox tanpa kepala, kita perlu memulai Firefox dengan –headless tandai sebagai berikut -
capabilities: {
'browserName': 'firefox',
'moz:firefoxOptions': {
'args': [“--headless”]
}
},
Menyiapkan beberapa browser untuk pengujian
Kami juga dapat menguji beberapa browser. Untuk ini kita perlu menggunakan opsi konfigurasi multiCapabilities sebagai berikut -
multiCapabilities: [{
'browserName': 'chrome'
},{
'browserName': 'firefox'
}]
Kerangka yang mana?
Dua kerangka kerja pengujian BDD (Behavior driven development), Jasmine dan Mocha didukung oleh Protractor. Kedua kerangka kerja tersebut didasarkan pada JavaScript dan Node.js. Sintaks, report dan scaffolding, yang diperlukan untuk menulis dan mengelola tes, disediakan oleh framework ini.
Selanjutnya, kita melihat bagaimana kita dapat menginstal berbagai kerangka kerja -
Kerangka Jasmine
Ini adalah kerangka uji default untuk Busur derajat. Saat Anda menginstal Protractor, Anda akan mendapatkan versi Jasmine 2.x dengannya. Kami tidak perlu menginstalnya secara terpisah.
Kerangka mocha
Mocha adalah kerangka pengujian JavaScript lain yang pada dasarnya berjalan di Node.js. Untuk menggunakan Mocha sebagai framework pengujian kami, kami perlu menggunakan antarmuka BDD (Behavior driven development) dan pernyataan Chai dengan Chai As Promised. Instalasi dapat dilakukan dengan bantuan perintah berikut -
npm install -g mocha
npm install chai
npm install chai-as-promised
Seperti yang Anda lihat, opsi -g digunakan saat menginstal mocha, itu karena kami telah menginstal Protractor secara global menggunakan opsi -g. Setelah menginstalnya, kami perlu meminta dan menyiapkan Chai di dalam file pengujian kami. Itu dapat dilakukan sebagai berikut -
var chai = require('chai');
var chaiAsPromised = require('chai-as-promised');
chai.use(chaiAsPromised);
var expect = chai.expect;
Setelah ini, kita dapat menggunakan Chai As Promised seperti itu -
expect(myElement.getText()).to.eventually.equal('some text');
Sekarang, kita perlu mengatur properti framework ke mocha file config dengan menambahkan framework: 'mocha'. Opsi seperti 'reporter' dan 'slow' untuk mocha dapat ditambahkan dalam file konfigurasi sebagai berikut -
mochaOpts: {
reporter: "spec", slow: 3000
}
Kerangka Mentimun
Untuk menggunakan Ketimun sebagai kerangka pengujian kami, kami perlu mengintegrasikannya dengan Busur derajat dengan opsi kerangka kerja custom. Instalasi dapat dilakukan dengan bantuan perintah berikut
npm install -g cucumber
npm install --save-dev protractor-cucumber-framework
Seperti yang Anda lihat, opsi -g digunakan saat memasang Ketimun, karena kami telah memasang Busur Derajat secara global yaitu dengan opsi -g. Selanjutnya, kita perlu mengatur properti framework kecustom file config dengan menambahkan framework: 'custom' dan frameworkPath: 'Protractor-cucumber-framework' ke file konfigurasi bernama cucumberConf.js.
Kode contoh yang ditunjukkan di bawah ini adalah file cucumberConf.js dasar yang dapat digunakan untuk menjalankan file fitur mentimun dengan Busur derajat -
exports.config = {
seleniumAddress: 'http://localhost:4444/wd/hub',
baseUrl: 'https://angularjs.org/',
capabilities: {
browserName:'Firefox'
},
framework: 'custom',
frameworkPath: require.resolve('protractor-cucumber-framework'),
specs: [
'./cucumber/*.feature'
],
// cucumber command line options
cucumberOpts: {
require: ['./cucumber/*.js'],
tags: [],
strict: true,
format: ["pretty"],
'dry-run': false,
compiler: []
},
onPrepare: function () {
browser.manage().window().maximize();
}
};
Dalam bab ini, mari kita pahami bagaimana menulis tes pertama di Busur derajat.
File dibutuhkan oleh Busur derajat
Busur derajat membutuhkan dua file berikut untuk dijalankan -
Spec atau file tes
Ini adalah salah satu file penting untuk menjalankan Protractor. Di file ini, kami akan menulis kode pengujian kami yang sebenarnya. Kode pengujian ditulis dengan menggunakan sintaks kerangka pengujian kami.
Misalnya, jika kita menggunakan Jasmine framework, maka kode uji akan ditulis dengan menggunakan sintaks Jasmine. File ini akan berisi semua aliran fungsional dan pernyataan pengujian.
Dengan kata sederhana, kita dapat mengatakan bahwa file ini berisi logika dan pelacak untuk berinteraksi dengan aplikasi.
Contoh
Berikut ini adalah skrip sederhana, TestSpecification.js, dengan kasus uji untuk menavigasi ke URL dan memeriksa judul halaman -
//TestSpecification.js
describe('Protractor Demo', function() {
it('to check the page title', function() {
browser.ignoreSynchronization = true;
browser.get('https://www.tutorialspoint.com/tutorialslibrary.htm');
browser.driver.getTitle().then(function(pageTitle) {
expect(pageTitle).toEqual('Free Online Tutorials and Courses');
});
});
});
Penjelasan Kode
Kode file spesifikasi diatas dapat dijelaskan sebagai berikut -
Browser
Ini adalah variabel global yang dibuat oleh Busur derajat untuk menangani semua perintah tingkat browser. Ini pada dasarnya adalah pembungkus di sekitar instance WebDriver. browser.get () adalah metode Selenium sederhana yang akan memberi tahu Protractor untuk memuat halaman tertentu.
describe dan it- Keduanya adalah sintaks kerangka uji Jasmine. Itu’Describe’ digunakan untuk menampung aliran ujung ke ujung dari kasus uji kami sedangkan ‘it’berisi beberapa skenario pengujian. Kami dapat memiliki lebih dari satu‘it’ blok dalam program kasus uji kami.
Expect - Ini adalah pernyataan di mana kami membandingkan judul halaman web dengan beberapa data yang telah ditentukan sebelumnya.
ignoreSynchronization- Ini adalah tag browser yang digunakan saat kami mencoba menguji situs web non-sudut. Busur derajat mengharapkan untuk bekerja dengan situs web sudut saja tetapi jika kita ingin bekerja dengan situs web non-sudut, maka tag ini harus disetel ke“true”.
File Konfigurasi
Seperti namanya, file ini memberikan penjelasan untuk semua opsi konfigurasi Busur Derajat. Ini pada dasarnya memberi tahu Busur derajat berikut ini -
- Di mana menemukan file pengujian atau spesifikasi
- Browser mana yang harus dipilih
- Framework pengujian mana yang akan digunakan
- Tempat berbicara dengan Server Selenium
Contoh
Berikut ini adalah skrip sederhana, config.js, yang sedang diuji
// config.js
exports.config = {
directConnect: true,
// Capabilities to be passed to the webdriver instance.
capabilities: {
'browserName': 'chrome'
},
// Framework to use. Jasmine is recommended.
framework: 'jasmine',
// Spec patterns are relative to the current working directory when
// protractor is called.
specs: ['TestSpecification.js'],
Penjelasan Kode
Kode file konfigurasi di atas yang memiliki tiga parameter dasar, dapat dijelaskan sebagai berikut -
Parameter Kemampuan
Parameter ini digunakan untuk menentukan nama browser. Itu dapat dilihat pada blok kode berikut dari file conf.js -
exports.config = {
directConnect: true,
// Capabilities to be passed to the webdriver instance.
capabilities: {
'browserName': 'chrome'
},
Seperti yang terlihat di atas, nama browser yang diberikan di sini adalah 'chrome' yang merupakan browser default untuk Protractor. Kami juga dapat mengubah nama browser.
Parameter Kerangka
Parameter ini digunakan untuk menentukan nama kerangka pengujian. Itu dapat dilihat di blok kode berikut dari file config.js -
exports.config = {
directConnect: true,
// Framework to use. Jasmine is recommended.
framework: 'jasmine',
Di sini kami menggunakan kerangka uji 'jasmine'.
Parameter Deklarasi File Sumber
Parameter ini digunakan untuk menentukan nama deklarasi file sumber. Itu dapat dilihat pada blok kode berikut dari file conf.js -
exports.config = {
directConnect: true,
// Spec patterns are relative to the current working
directory when protractor is called.
specs: ['TsetSpecification.js'],
Seperti yang terlihat di atas, nama deklarasi file sumber yang diberikan di sini adalah ‘TestSpecification.js’. Itu karena, untuk contoh ini kami telah membuat file spesifikasi dengan namaTestSpecification.js.
Menjalankan kode
Karena kita telah mendapatkan pemahaman dasar tentang file yang diperlukan dan pengkodeannya untuk menjalankan Protractor, mari kita coba menjalankan contoh. Kita dapat mengikuti langkah-langkah berikut untuk menjalankan contoh ini -
Step 1 - Pertama, buka command prompt.
Step 2 - Selanjutnya, kita perlu pergi ke direktori tempat kita menyimpan file kita yaitu config.js dan TestSpecification.js.
Step 3 - Sekarang, jalankan file config.js dengan menjalankan perintah Protrcator config.js.
Tangkapan layar yang ditunjukkan di bawah ini akan menjelaskan langkah-langkah di atas untuk menjalankan contoh -
Terlihat di screen shot bahwa tes telah lulus.
Sekarang, misalkan jika kita menguji situs web non-sudut dan tidak meletakkan tag ignoreSynchronization ke true maka setelah menjalankan kode kita akan mendapatkan kesalahan "Angular tidak dapat ditemukan pada halaman".
Itu bisa dilihat pada screen shot berikut -
Pembuatan Laporan
Sampai sekarang, kita telah membahas tentang file yang diperlukan dan pengkodeannya untuk menjalankan kasus uji. Busur derajat juga dapat menghasilkan laporan untuk kasus uji. Untuk tujuan ini, mendukung Jasmine. JunitXMLReporter dapat digunakan untuk menghasilkan laporan eksekusi uji secara otomatis.
Tetapi sebelum itu, kita perlu menginstal reporter Jasmine dengan bantuan perintah berikut -
npm install -g jasmine-reporters
Seperti yang Anda lihat, opsi -g digunakan saat menginstal Jasmine Reporters, karena kami telah menginstal Protractor secara global, dengan opsi -g.
Setelah berhasil menginstal jasmine-reporter, kita perlu menambahkan kode berikut ke file config.js yang kita gunakan sebelumnya -
onPrepare: function(){ //configure junit xml report
var jasmineReporters = require('jasmine-reporters');
jasmine.getEnv().addReporter(new jasmineReporters.JUnitXmlReporter({
consolidateAll: true,
filePrefix: 'guitest-xmloutput',
savePath: 'test/reports'
}));
Sekarang, file config.js baru kita adalah sebagai berikut -
// An example configuration file.
exports.config = {
directConnect: true,
// Capabilities to be passed to the webdriver instance.
capabilities: {
'browserName': 'chrome'
},
// Framework to use. Jasmine is recommended.
framework: 'jasmine',
// Spec patterns are relative to the current working directory when
// protractor is called.
specs: ['TestSpecification.js'],
//framework: "jasmine2", //must set it if you use JUnitXmlReporter
onPrepare: function(){ //configure junit xml report
var jasmineReporters = require('jasmine-reporters');
jasmine.getEnv().addReporter(new jasmineReporters.JUnitXmlReporter({
consolidateAll: true,
filePrefix: 'guitest-xmloutput',
savePath: 'reports'
}));
},
};
Setelah menjalankan file config di atas dengan cara yang sama, yang telah kita jalankan sebelumnya, akan menghasilkan file XML yang berisi laporan di bawah direktori root di reportsmap. Jika tes berhasil, laporannya akan terlihat seperti di bawah ini -
Tetapi, jika tes gagal, laporan akan terlihat seperti di bawah ini -
Busur derajat - Inti APIS
Bab ini memungkinkan Anda memahami berbagai API inti yang merupakan kunci fungsi busur derajat.
Pentingnya API Busur Derajat
Busur derajat memberi kami berbagai macam API yang sangat penting untuk melakukan tindakan berikut untuk mendapatkan keadaan situs web saat ini -
- Mendapatkan elemen DOM dari halaman web yang akan kita uji.
- Berinteraksi dengan elemen DOM.
- Menetapkan tindakan untuk mereka.
- Berbagi informasi kepada mereka.
Untuk melakukan tugas di atas, sangat penting untuk memahami API Protractor.
Berbagai API Busur Derajat
Seperti yang kita ketahui bahwa Protractor adalah pembungkus di sekitar Selenium-WebDriver yang merupakan binding WebDriver untuk Node.js. Busur derajat memiliki API berikut -
Browser
Ini adalah pembungkus di sekitar contoh WebDriver yang digunakan untuk menangani perintah tingkat browser seperti navigasi, informasi seluruh halaman, dll. Misalnya, metode browser.get memuat halaman.
Elemen
Ini digunakan untuk mencari dan berinteraksi dengan elemen DOM di halaman yang kami uji. Untuk tujuan ini, diperlukan satu parameter untuk menemukan elemen.
Locators (oleh)
Ini adalah kumpulan strategi pelacak elemen. Elemen, misalnya, dapat ditemukan oleh pemilih CSS, ID atau atribut lain yang terikat dengan ng-model.
Selanjutnya, kita akan membahas secara detail tentang API ini dan fungsinya.
API browser
Seperti yang dibahas di atas, ini adalah pembungkus di sekitar contoh WebDriver untuk menangani perintah level browser. Itu melakukan berbagai fungsi sebagai berikut -
Fungsi dan Deskripsinya
Fungsi ProtractorBrowser API adalah sebagai berikut-
browser.angularAppRoot
Fungsi API Peramban ini menetapkan pemilih CSS untuk elemen yang akan kita temukan Angular. Biasanya, fungsi ini ada di 'body', tetapi dalam kasus jika ng-app kita, itu ada di sub-bagian halaman; mungkin juga sub-elemen.
browser.waitForAngularEnabled
Fungsi API Browser ini dapat disetel ke benar atau salah. Seperti namanya, jika fungsi ini diset ke false maka Busur derajat tidak akan menunggu Angular$http and $tugas waktu tunggu untuk diselesaikan sebelum berinteraksi dengan browser. Kita juga bisa membaca keadaan saat ini tanpa mengubahnya dengan memanggil waitForAngularEnabled () tanpa meneruskan nilai.
browser.getProcessedConfig
Dengan bantuan fungsi API browser ini kita bisa mendapatkan objek konfigurasi yang diproses, termasuk spesifikasi & kapabilitas, yang sedang dijalankan.
browser.forkNewDriverInstance
Seperti namanya, fungsi ini akan mem-fork instance lain dari browser untuk digunakan dalam tes interaktif. Ini dapat dijalankan dengan aliran kontrol diaktifkan dan dinonaktifkan. Contoh diberikan di bawah untuk kedua kasus -
Example 1
Lari browser.forkNewDriverInstance() dengan aliran kontrol diaktifkan -
var fork = browser.forkNewDriverInstance();
fork.get(‘page1’);
Example 2
Lari browser.forkNewDriverInstance() dengan aliran kontrol dinonaktifkan -
var fork = await browser.forkNewDriverInstance().ready;
await forked.get(‘page1’);
browser.restart
Seperti namanya, ini akan memulai ulang browser dengan menutup instance browser dan membuat yang baru. Itu juga dapat berjalan dengan aliran kontrol diaktifkan dan dinonaktifkan. Contoh diberikan di bawah untuk kedua kasus -
Example 1 - Lari browser.restart() dengan aliran kontrol diaktifkan -
browser.get(‘page1’);
browser.restart();
browser.get(‘page2’);
Example 2 - Lari browser.forkNewDriverInstance() dengan aliran kontrol dinonaktifkan -
await browser.get(‘page1’);
await browser.restart();
await browser.get(‘page2’);
browser.restartSync
Ini mirip dengan fungsi browser.restart (). Satu-satunya perbedaan adalah ia mengembalikan instance browser baru secara langsung daripada mengembalikan janji penyelesaian ke instance browser baru. Itu hanya dapat berjalan ketika aliran kontrol diaktifkan.
Example - Lari browser.restartSync() dengan aliran kontrol diaktifkan -
browser.get(‘page1’);
browser.restartSync();
browser.get(‘page2’);
browser.useAllAngular2AppRoots
Seperti namanya, ini hanya kompatibel dengan Angular2. Ini akan mencari melalui semua aplikasi sudut yang tersedia di halaman sambil menemukan elemen atau menunggu stabilitas.
browser.waitForAngular
Fungsi API browser ini menginstruksikan WebDriver untuk menunggu sampai Angular selesai rendering dan tidak ada yang beredar $http or $panggilan batas waktu sebelum melanjutkan.
browser.findElement
Seperti namanya, fungsi API browser ini menunggu Angular menyelesaikan rendering sebelum mencari elemen.
browser.isElementPresent
Seperti namanya, fungsi API browser ini akan menguji apakah elemen tersebut ada di halaman atau tidak.
browser.addMockModule
Ini akan menambahkan modul untuk dimuat sebelum Angular setiap kali metode Protractor.get dipanggil.
Example
browser.addMockModule('modName', function() {
angular.module('modName', []).value('foo', 'bar');
});
browser.clearMockModules
tidak seperti browser.addMockModule, itu akan menghapus daftar modul tiruan terdaftar.
browser.removeMockModule
Seperti namanya, itu akan menghapus modul tiruan register. Contoh: browser.removeMockModule ('modName');
browser.getRegisteredMockModules
Berlawanan dengan browser.clearMockModule, itu akan mendapatkan daftar modul tiruan terdaftar.
browser.get
Kita bisa menggunakan browser.get () untuk menavigasi browser ke alamat web tertentu dan memuat modul tiruan untuk halaman itu sebelum Angular dimuat.
Example
browser.get(url);
browser.get('http://localhost:3000');
// This will navigate to the localhost:3000 and will load mock module if needed
browser.refresh
Seperti namanya, ini akan memuat ulang halaman saat ini dan memuat modul tiruan sebelum Angular.
browser.navigate
Seperti namanya, ini digunakan untuk menggabungkan metode navigasi kembali ke objek navigasi sehingga dipanggil seperti sebelumnya. Contoh: driver.navigate (). Refresh ().
browser.setLocation
Ini digunakan untuk menjelajahi halaman lain menggunakan navigasi dalam halaman.
Example
browser.get('url/ABC');
browser.setLocation('DEF');
expect(browser.getCurrentUrl())
.toBe('url/DEF');
Ini akan menavigasi dari ABC ke halaman DEF.
browser.debugger
Seperti namanya, ini harus digunakan dengan debug busur derajat. Fungsi ini pada dasarnya menambahkan tugas ke aliran kontrol untuk menjeda pengujian dan menyuntikkan fungsi pembantu ke browser sehingga debugging dapat dilakukan di konsol browser.
browser.pause
Ini digunakan untuk men-debug pengujian WebDriver. Kita bisa gunakanbrowser.pause() dalam pengujian kami untuk memasukkan debugger busur derajat dari titik tersebut di aliran kontrol.
Example
element(by.id('foo')).click();
browser.pause();
// Execution will stop before the next click action.
element(by.id('bar')).click();
browser.controlFlowEnabled
Ini digunakan untuk menentukan apakah aliran kontrol diaktifkan atau tidak.
Busur derajat - Inti APIS (CONTD…)
Dalam bab ini, mari kita pelajari beberapa API inti Protractor.
Elemen API
Elemen adalah salah satu fungsi global yang diekspos oleh busur derajat. Fungsi ini mengambil locater dan mengembalikan yang berikut ini -
- ElementFinder, yang menemukan satu elemen berdasarkan pelacak.
- ElementArrayFinder, yang menemukan larik elemen berdasarkan locator.
Kedua metode rantai dukungan di atas seperti yang dibahas di bawah ini.
Fungsi rantai dari ElementArrayFinder dan deskripsinya
Berikut ini adalah fungsi dari ElementArrayFinder -
element.all(locator).clone
Seperti namanya, fungsi ini akan membuat salinan dangkal dari larik elemen yaitu ElementArrayFinder.
element.all(locator).all(locator)
Fungsi ini pada dasarnya mengembalikan ElementArrayFinder baru yang bisa kosong atau berisi elemen turunan. Ini dapat digunakan untuk memilih beberapa elemen sebagai array sebagai berikut
Example
element.all(locator).all(locator)
elementArr.all(by.css(‘.childselector’));
// it will return another ElementFindArray as child element based on child locator.
element.all(locator).filter(filterFn)
Seperti namanya, setelah menerapkan fungsi filter ke setiap elemen dalam ElementArrayFinder, ia mengembalikan ElementArrayFinder baru dengan semua elemen yang meneruskan fungsi filter. Ini pada dasarnya memiliki dua argumen, pertama adalah ElementFinder dan kedua adalah indeks. Ini juga dapat digunakan di objek halaman.
Example
View
<ul class = "items">
<li class = "one">First</li>
<li class = "two">Second</li>
<li class = "three">Third</li>
</ul>
Code
element.all(by.css('.items li')).filter(function(elem, index) {
return elem.getText().then(function(text) {
return text === 'Third';
});
}).first().click();
element.all(locator).get(index)
Dengan bantuan ini, kita bisa mendapatkan elemen dalam ElementArrayFinder menurut indeks. Perhatikan bahwa indeks dimulai dari 0 dan indeks negatif dibungkus.
Example
View
<ul class = "items">
<li>First</li>
<li>Second</li>
<li>Third</li>
</ul>
Code
let list = element.all(by.css('.items li'));
expect(list.get(0).getText()).toBe('First');
expect(list.get(1).getText()).toBe('Second');
element.all(locator).first()
Seperti namanya, ini akan mendapatkan elemen pertama untuk ElementArrayFinder. Itu tidak akan mengambil elemen yang mendasarinya.
Example
View
<ul class = "items">
<li>First</li>
<li>Second</li>
<li>Third</li>
</ul>
Code
let first = element.all(by.css('.items li')).first();
expect(first.getText()).toBe('First');
element.all(locator).last()
Seperti namanya, ini akan mendapatkan elemen terakhir untuk ElementArrayFinder. Itu tidak akan mengambil elemen yang mendasarinya.
Example
View
<ul class = "items">
<li>First</li>
<li>Second</li>
<li>Third</li>
</ul>
Code
let first = element.all(by.css('.items li')).last();
expect(last.getText()).toBe('Third');
element.all(locator).all(selector)
Ini digunakan untuk menemukan larik elemen dalam induk ketika panggilan ke $$ mungkin dirantai.
Example
View
<div class = "parent">
<ul>
<li class = "one">First</li>
<li class = "two">Second</li>
<li class = "three">Third</li>
</ul>
</div>
Code
let items = element(by.css('.parent')).$$('li');
element.all(locator).count()
Seperti namanya, ini akan menghitung jumlah elemen yang diwakili oleh ElementArrayFinder. Itu tidak akan mengambil elemen yang mendasarinya.
Example
View
<ul class = "items">
<li>First</li>
<li>Second</li>
<li>Third</li>
</ul>
Code
let list = element.all(by.css('.items li'));
expect(list.count()).toBe(3);
element.all(locator).isPresent()
Ini akan mencocokkan elemen dengan finder. Ini bisa mengembalikan benar atau salah. True, jika ada elemen yang cocok dengan finder dan False sebaliknya.
Example
expect($('.item').isPresent()).toBeTruthy();
element.all(locator).locator
Seperti namanya, ini akan mengembalikan pencari lokasi yang paling relevan.
Example
$('#ID1').locator();
// returns by.css('#ID1')
$('#ID1').$('#ID2').locator();
// returns by.css('#ID2')
$$('#ID1').filter(filterFn).get(0).click().locator();
// returns by.css('#ID1')
element.all(locator).then(thenFunction)
Ini akan mengambil elemen yang diwakili oleh ElementArrayFinder.
Example
View
<ul class = "items">
<li>First</li>
<li>Second</li>
<li>Third</li>
</ul>
Code
element.all(by.css('.items li')).then(function(arr) {
expect(arr.length).toEqual(3);
});
element.all(locator).each(eachFunction)
Seperti namanya, ini akan memanggil fungsi input pada setiap ElementFinder yang diwakili oleh ElementArrayFinder.
Example
View
<ul class = "items">
<li>First</li>
<li>Second</li>
<li>Third</li>
</ul>
Code
element.all(by.css('.items li')).each(function(element, index) {
// It will print First 0, Second 1 and Third 2.
element.getText().then(function (text) {
console.log(index, text);
});
});
element.all(locator).map(mapFunction)
Seperti namanya, ini akan menerapkan fungsi peta pada setiap elemen dalam ElementArrayFinder. Ini memiliki dua argumen. Pertama adalah ElementFinder dan kedua adalah indeks.
Example
View
<ul class = "items">
<li>First</li>
<li>Second</li>
<li>Third</li>
</ul>
Code
let items = element.all(by.css('.items li')).map(function(elm, index) {
return {
index: index,
text: elm.getText(),
class: elm.getAttribute('class')
};
});
expect(items).toEqual([
{index: 0, text: 'First', class: 'one'},
{index: 1, text: 'Second', class: 'two'},
{index: 2, text: 'Third', class: 'three'}
]);
element.all(locator).reduce(reduceFn)
Seperti namanya, ini akan menerapkan fungsi pengurangan terhadap akumulator dan setiap elemen yang ditemukan menggunakan pencari lokasi. Fungsi ini akan mereduksi setiap elemen menjadi satu nilai.
Example
View
<ul class = "items">
<li>First</li>
<li>Second</li>
<li>Third</li>
</ul>
Code
let value = element.all(by.css('.items li')).reduce(function(acc, elem) {
return elem.getText().then(function(text) {
return acc + text + ' ';
});
}, '');
expect(value).toEqual('First Second Third ');
element.all(locator).evaluate
Seperti namanya, itu akan mengevaluasi input apakah itu dalam lingkup elemen yang mendasari saat ini atau tidak.
Example
View
<span class = "foo">{{letiableInScope}}</span>
Code
let value =
element.all(by.css('.foo')).evaluate('letiableInScope');
element.all(locator).allowAnimations
Seperti namanya, ini akan menentukan apakah animasi diizinkan pada elemen yang mendasari saat ini atau tidak.
Example
element(by.css('body')).allowAnimations(false);
Fungsi rantai dari ElementFinder dan deskripsinya
Fungsi rantai dari ElementFinder dan deskripsinya -
element(locator).clone
Seperti namanya, fungsi ini akan membuat salinan ElementFinder yang dangkal.
element(locator).getWebElement()
Ini akan mengembalikan WebElement yang diwakili oleh ElementFinder ini dan kesalahan WebDriver akan muncul jika elemen tidak ada.
Example
View
<div class="parent">
some text
</div>
Code
// All the four following expressions are equivalent.
$('.parent').getWebElement();
element(by.css('.parent')).getWebElement();
browser.driver.findElement(by.css('.parent'));
browser.findElement(by.css('.parent'));
element(locator).all(locator)
Ini akan menemukan array elemen dalam induk.
Example
View
<div class = "parent">
<ul>
<li class = "one">First</li>
<li class = "two">Second</li>
<li class = "three">Third</li>
</ul>
</div>
Code
let items = element(by.css('.parent')).all(by.tagName('li'));
element(locator).element(locator)
Ini akan menemukan elemen dalam induk.
Example
View
<div class = "parent">
<div class = "child">
Child text
<div>{{person.phone}}</div>
</div>
</div>
Code
// Calls Chain 2 element.
let child = element(by.css('.parent')).
element(by.css('.child'));
expect(child.getText()).toBe('Child text\n981-000-568');
// Calls Chain 3 element.
let triple = element(by.css('.parent')).
element(by.css('.child')).
element(by.binding('person.phone'));
expect(triple.getText()).toBe('981-000-568');
element(locator).all(selector)
Ini akan menemukan larik elemen dalam induk saat panggilan ke $$ mungkin dirantai.
Example
View
<div class = "parent">
<ul>
<li class = "one">First</li>
<li class = "two">Second</li>
<li class = "three">Third</li>
</ul>
</div>
Code
let items = element(by.css('.parent')).$$('li'));
element(locator).$(locator)
Ini akan menemukan elemen dalam induk ketika panggilan ke $ mungkin dirantai.
Example
View
<div class = "parent">
<div class = "child">
Child text
<div>{{person.phone}}</div>
</div>
</div>
Code
// Calls Chain 2 element.
let child = element(by.css('.parent')).
$('.child')); expect(child.getText()).toBe('Child text\n981-000-568'); // Calls Chain 3 element. let triple = element(by.css('.parent')). $('.child')).
element(by.binding('person.phone'));
expect(triple.getText()).toBe('981-000-568');
element(locator).isPresent()
Ini akan menentukan apakah elemen disajikan di halaman atau tidak.
Example
View
<span>{{person.name}}</span>
Code
expect(element(by.binding('person.name')).isPresent()).toBe(true);
// will check for the existence of element
expect(element(by.binding('notPresent')).isPresent()).toBe(false);
// will check for the non-existence of element
element(locator).isElementPresent()
Ini sama dengan elemen (locator) .isPresent (). Satu-satunya perbedaan adalah ia akan memeriksa apakah elemen yang diidentifikasi oleh sublocator ada daripada pencari elemen saat ini.
element.all(locator).evaluate
Seperti namanya, itu akan mengevaluasi input apakah itu dalam lingkup elemen yang mendasari saat ini atau tidak.
Example
View
<span id = "foo">{{letiableInScope}}</span>
Code
let value = element(by.id('.foo')).evaluate('letiableInScope');
element(locator).allowAnimations
Seperti namanya, ini akan menentukan apakah animasi diperbolehkan pada elemen yang mendasari saat ini atau tidak.
Example
element(by.css('body')).allowAnimations(false);
element(locator).equals
Seperti namanya, ini akan membandingkan elemen kesetaraan.
Locators (oleh) API
Ini pada dasarnya adalah kumpulan strategi pelacak elemen yang menyediakan cara menemukan elemen dalam aplikasi Angular dengan mengikat, model, dll.
Functions and their descriptions
Fungsi ProtractorLocators API adalah sebagai berikut -
by.addLocator(locatorName,fuctionOrScript)
Ini akan menambahkan locator ke instance ProtrcatorBy ini yang selanjutnya dapat digunakan dengan elemen (by.locatorName (args)).
Example
View
<button ng-click = "doAddition()">Go!</button>
Code
// Adding the custom locator.
by.addLocator('buttonTextSimple',
function(buttonText, opt_parentElement, opt_rootSelector) {
var using = opt_parentElement || document,
buttons = using.querySelectorAll('button');
return Array.prototype.filter.call(buttons, function(button) {
return button.textContent === buttonText;
});
});
element(by.buttonTextSimple('Go!')).click();// Using the custom locator.
by.binding
Seperti namanya, ia akan menemukan elemen dengan pengikatan teks. Pencocokan parsial akan dilakukan sehingga setiap elemen yang terikat ke variabel yang berisi string input akan dikembalikan.
Example
View
<span>{{person.name}}</span>
<span ng-bind = "person.email"></span>
Code
var span1 = element(by.binding('person.name'));
expect(span1.getText()).toBe('Foo');
var span2 = element(by.binding('person.email'));
expect(span2.getText()).toBe('[email protected]');
by.exactbinding
Seperti namanya, ia akan menemukan elemen dengan pengikatan yang tepat.
Example
View
<spangt;{{ person.name }}</spangt;
<span ng-bind = "person-email"gt;</spangt;
<spangt;{{person_phone|uppercase}}</span>
Code
expect(element(by.exactBinding('person.name')).isPresent()).toBe(true);
expect(element(by.exactBinding('person-email')).isPresent()).toBe(true);
expect(element(by.exactBinding('person')).isPresent()).toBe(false);
expect(element(by.exactBinding('person_phone')).isPresent()).toBe(true);
expect(element(by.exactBinding('person_phone|uppercase')).isPresent()).toBe(true);
expect(element(by.exactBinding('phone')).isPresent()).toBe(false);
by.model(modelName)
Seperti namanya, ia akan menemukan elemen dengan ekspresi model-ng.
Example
View
<input type = "text" ng-model = "person.name">
Code
var input = element(by.model('person.name'));
input.sendKeys('123');
expect(input.getAttribute('value')).toBe('Foo123');
by.buttonText
Seperti namanya, ia akan menemukan tombol demi teks.
Example
View
<button>Save</button>
Code
element(by.buttonText('Save'));
by.partialButtonText
Seperti namanya, ia akan menemukan tombol dengan teks parsial.
Example
View
<button>Save my file</button>
Code
element(by.partialButtonText('Save'));
by.repeater
Seperti namanya, ia akan menemukan elemen di dalam ng-repeat.
Example
View
<div ng-repeat = "cat in pets">
<span>{{cat.name}}</span>
<span>{{cat.age}}</span>
<</div>
<div class = "book-img" ng-repeat-start="book in library">
<span>{{$index}}</span>
</div>
<div class = "book-info" ng-repeat-end>
<h4>{{book.name}}</h4>
<p>{{book.blurb}}</p>
</div>
Code
var secondCat = element(by.repeater('cat in
pets').row(1)); // It will return the DIV for the second cat.
var firstCatName = element(by.repeater('cat in pets').
row(0).column('cat.name')); // It will return the SPAN for the first cat's name.
by.exactRepeater
Seperti namanya, ia akan menemukan elemen dengan repeater yang tepat.
Example
View
<li ng-repeat = "person in peopleWithRedHair"></li>
<li ng-repeat = "car in cars | orderBy:year"></li>
Code
expect(element(by.exactRepeater('person in
peopleWithRedHair')).isPresent())
.toBe(true);
expect(element(by.exactRepeater('person in
people')).isPresent()).toBe(false);
expect(element(by.exactRepeater('car in cars')).isPresent()).toBe(true);
by.cssContainingText
Seperti namanya, itu akan menemukan elemen, berisi string yang tepat, oleh CSS
Example
View
<ul>
<li class = "pet">Dog</li>
<li class = "pet">Cat</li>
</ul>
Code
var dog = element(by.cssContainingText('.pet', 'Dog'));
// It will return the li for the dog, but not for the cat.
by.options(optionsDescriptor)
Seperti namanya, ia akan menemukan elemen dengan ekspresi ng-options.
Example
View
<select ng-model = "color" ng-options = "c for c in colors">
<option value = "0" selected = "selected">red</option>
<option value = "1">green</option>
</select>
Code
var allOptions = element.all(by.options('c for c in colors'));
expect(allOptions.count()).toEqual(2);
var firstOption = allOptions.first();
expect(firstOption.getText()).toEqual('red');
by.deepCSS(selector)
Seperti namanya, ia akan menemukan elemen oleh pemilih CSS di dalam shadow DOM.
Example
View
<div>
<span id = "outerspan">
<"shadow tree">
<span id = "span1"></span>
<"shadow tree">
<span id = "span2"></span>
</>
</>
</div>
Code
var spans = element.all(by.deepCss('span'));
expect(spans.count()).toEqual(3);
Busur derajat - Benda
Bab ini membahas secara detail tentang objek-objek di Busur derajat.
Apa itu Objek Halaman?
Objek halaman adalah pola desain yang telah menjadi populer untuk menulis tes e2e untuk meningkatkan pemeliharaan tes dan mengurangi duplikasi kode. Ini dapat didefinisikan sebagai kelas berorientasi objek yang berfungsi sebagai antarmuka ke halaman AUT Anda (aplikasi yang sedang diuji). Namun, sebelum mendalami objek halaman, kita harus memahami tantangan dengan pengujian UI otomatis dan cara menanganinya.
Tantangan dengan pengujian UI otomatis
Berikut adalah beberapa tantangan umum dengan pengujian UI otomatis -
Perubahan UI
Masalah yang paling umum saat bekerja dengan pengujian UI adalah perubahan yang terjadi di UI. Misalnya, ini sering terjadi ketika tombol atau kotak teks, dll. Biasanya berubah dan menimbulkan masalah untuk pengujian UI.
Kurangnya dukungan DSL (Domain Specific Language)
Masalah lain dengan pengujian UI adalah kurangnya dukungan DSL. Dengan masalah ini, menjadi sangat sulit untuk memahami apa yang sedang diuji.
Banyak pengulangan / duplikasi Kode
Masalah umum berikutnya dalam pengujian UI adalah banyaknya pengulangan atau duplikasi kode. Ini dapat dipahami dengan bantuan baris kode berikut -
element(by.model(‘event.name’)).sendKeys(‘An Event’);
element(by.model(‘event.name’)).sendKeys(‘Module 3’);
element(by.model(‘event.name’));
Perawatan yang sulit
Karena tantangan di atas, perawatannya jadi pusing. Itu karena kita harus mencari semua instance, ganti dengan nama baru, selector & kode lain. Kami juga perlu menghabiskan banyak waktu untuk menjaga agar pengujian sejalan dengan pemfaktoran ulang.
Tes rusak
Tantangan lain dalam pengujian UI adalah terjadinya banyak kegagalan dalam pengujian.
Cara Menangani Tantangan
Kami telah melihat beberapa tantangan umum dalam pengujian UI. Beberapa cara untuk menangani tantangan tersebut adalah sebagai berikut -
Memperbarui Referensi Secara Manual
Opsi pertama untuk menangani tantangan di atas adalah memperbarui referensi secara manual. Masalah dengan opsi ini adalah kita harus melakukan perubahan manual pada kode serta pengujian kita. Ini dapat dilakukan ketika Anda memiliki satu atau dua file tes tetapi bagaimana jika Anda memiliki ratusan file tes dalam sebuah proyek?
Menggunakan Objek Halaman
Pilihan lain untuk menangani tantangan di atas adalah menggunakan objek halaman. Objek halaman pada dasarnya adalah JavaScript biasa yang merangkum properti template Angular. Misalnya, file spesifikasi berikut ditulis tanpa dan dengan objek halaman untuk memahami perbedaannya -
Without Page Objects
describe('angularjs homepage', function() {
it('should greet the named user', function() {
browser.get('http://www.angularjs.org');
element(by.model('yourName')).sendKeys('Julie');
var greeting = element(by.binding('yourName'));
expect(greeting.getText()).toEqual('Hello Julie!');
});
});
With Page Objects
Untuk menulis kode dengan Objek Halaman, hal pertama yang perlu kita lakukan adalah membuat Objek Halaman. Karenanya, Objek Halaman untuk contoh di atas bisa terlihat seperti ini -
var AngularHomepage = function() {
var nameInput = element(by.model('yourName'));
var greeting = element(by.binding('yourName'));
this.get = function() {
browser.get('http://www.angularjs.org');
};
this.setName = function(name) {
nameInput.sendKeys(name);
};
this.getGreetingText = function() {
return greeting.getText();
};
};
module.exports = new AngularHomepage();
Menggunakan Objek Halaman untuk Mengatur Pengujian
Kami telah melihat penggunaan objek halaman pada contoh di atas untuk menangani tantangan pengujian UI. Selanjutnya, kita akan membahas bagaimana kita dapat menggunakannya untuk mengatur tes. Untuk ini kita perlu memodifikasi skrip uji tanpa mengubah fungsionalitas skrip uji.
Contoh
Untuk memahami konsep ini kita mengambil file konfigurasi di atas dengan objek halaman. Kita perlu memodifikasi skrip pengujian sebagai berikut -
var angularHomepage = require('./AngularHomepage');
describe('angularjs homepage', function() {
it('should greet the named user', function() {
angularHomepage.get();
angularHomepage.setName('Julie');
expect(angularHomepage.getGreetingText()).toEqual
('Hello Julie!');
});
});
Di sini, perhatikan bahwa jalur ke objek halaman akan sesuai dengan spesifikasi Anda.
Pada catatan yang sama, kami juga dapat memisahkan rangkaian pengujian kami ke dalam berbagai rangkaian pengujian. File konfigurasi kemudian dapat diubah sebagai berikut
exports.config = {
// The address of a running selenium server.
seleniumAddress: 'http://localhost:4444/wd/hub',
// Capabilities to be passed to the webdriver instance.
capabilities: {
'browserName': 'chrome'
},
// Spec patterns are relative to the location of the spec file. They may
// include glob patterns.
suites: {
homepage: 'tests/e2e/homepage/**/*Spec.js',
search: ['tests/e2e/contact_search/**/*Spec.js',
'tests/e2e/venue_search/**/*Spec.js']
},
// Options to be passed to Jasmine-node.
jasmineNodeOpts: {
showColors: true, // Use colors in the command line report.
}
};
Sekarang, kita dapat dengan mudah beralih antara menjalankan satu atau rangkaian pengujian lainnya. Perintah berikut hanya akan menjalankan bagian beranda pengujian -
protractor protractor.conf.js --suite homepage
Demikian pula, kita dapat menjalankan rangkaian pengujian tertentu dengan perintah sebagai berikut -
protractor protractor.conf.js --suite homepage,search
Busur derajat - Debugging
Sekarang kita telah melihat semua konsep busur derajat di bab-bab sebelumnya, mari kita memahami konsep debugging secara mendetail di bab ini.
pengantar
Tes ujung-ke-ujung (e2e) sangat sulit untuk di-debug karena bergantung pada seluruh ekosistem aplikasi itu. Kami telah melihat bahwa mereka bergantung pada berbagai tindakan atau khususnya kami dapat mengatakannya pada tindakan sebelumnya seperti login dan terkadang mereka bergantung pada izin. Kesulitan lain dalam men-debug tes e2e adalah ketergantungannya pada WebDriver karena tindakannya berbeda dengan sistem operasi dan browser yang berbeda. Terakhir, debugging tes e2e juga menghasilkan pesan kesalahan yang panjang dan menyulitkan untuk memisahkan masalah terkait browser dan kesalahan proses pengujian.
Jenis Kegagalan
Ada berbagai alasan untuk kegagalan rangkaian pengujian dan berikut ini adalah beberapa jenis kegagalan yang terkenal -
Kegagalan WebDriver
Jika perintah tidak dapat diselesaikan, kesalahan terjadi oleh WebDriver. Misalnya, browser tidak bisa mendapatkan alamat yang ditentukan, atau elemen tidak ditemukan seperti yang diharapkan.
WebDriver gagal mendadak
Peramban yang tidak terduga dan kegagalan terkait OS terjadi saat gagal memperbarui pengelola driver web.
Kegagalan busur derajat untuk Angular
Kegagalan busur derajat untuk sudut terjadi ketika busur derajat tidak menemukan sudut di perpustakaan seperti yang diharapkan.
Kegagalan busur derajat 2
Dalam jenis kegagalan ini, Protractor akan gagal jika parameter useAllAngular2AppRoots tidak ditemukan dalam konfigurasi. Itu terjadi karena, tanpa ini, proses pengujian akan melihat satu elemen root tunggal sambil mengharapkan lebih dari satu elemen dalam proses.
Kegagalan busur derajat untuk batas waktu
Jenis kegagalan ini terjadi ketika spesifikasi pengujian mencapai loop atau pool yang panjang dan gagal mengembalikan data tepat waktu.
Kegagalan ekspektasi
Salah satu kegagalan pengujian paling umum yang menunjukkan seperti apa kegagalan ekspektasi normal.
Mengapa debugging penting di Protractor?
Misalkan, jika Anda telah menulis kasus uji dan gagal maka sangat penting untuk mengetahui cara men-debug kasus uji tersebut karena akan sangat sulit untuk menemukan tempat yang tepat di mana kesalahan telah terjadi. Saat bekerja dengan Busur derajat, Anda akan mendapatkan beberapa kesalahan panjang dalam font warna merah di baris perintah.
Menjeda dan Men-debug Pengujian
Cara untuk men-debug di Busur derajat dijelaskan di sini & miuns;
Metode Jeda
Menggunakan metode jeda untuk men-debug kasus uji di Busur derajat adalah salah satu cara termudah. Kita dapat mengetikkan perintah berikut di tempat kita ingin menghentikan sementara kode pengujian kita & miuns;
browser.pause();
Ketika kode yang sedang berjalan mengenai perintah di atas, itu akan menghentikan program yang sedang berjalan pada saat itu. Setelah itu kami dapat memberikan perintah berikut sesuai dengan preferensi kami -
Ketik C untuk Bergerak Maju
Setiap kali perintah habis, kita harus mengetik C untuk bergerak maju. Jika Anda tidak mengetik C, pengujian tidak akan menjalankan kode lengkap dan akan gagal karena error waktu habis Jasmine.
Ketik repl untuk memasuki mode interaktif
Manfaat dari mode interaktif adalah kita dapat mengirim perintah WebDriver ke browser kita. Jika kita ingin masuk ke mode interaktif, maka ketikrepl.
Ketik Ctrl-C untuk keluar dan melanjutkan pengujian
Untuk keluar dari pengujian dari status jeda dan melanjutkan pengujian dari tempat berhenti, kita perlu mengetik Ctrl-C.
Contoh
Dalam contoh ini, kami memiliki file spesifikasi di bawah ini bernama example_debug.js, busur derajat mencoba mengidentifikasi elemen dengan pelacak by.binding('mmmm') tetapi URL (https://angularjs.org/ halaman tidak memiliki elemen dengan pelacak yang ditentukan.
describe('Suite for protractor debugger',function(){
it('Failing spec',function(){
browser.get("http://angularjs.org");
element(by.model('yourName')).sendKeys('Vijay');
//Element doesn't exist
var welcomeText =
element(by.binding('mmmm')).getText();
expect('Hello '+welcomeText+'!').toEqual('Hello Ram!')
});
});
Sekarang, untuk menjalankan pengujian di atas kita perlu menambahkan kode browser.pause (), di mana Anda ingin menghentikan sementara pengujian, dalam file spesifikasi di atas. Ini akan terlihat sebagai berikut -
describe('Suite for protractor debugger',function(){
it('Failing spec',function(){
browser.get("http://angularjs.org");
browser.pause();
element(by.model('yourName')).sendKeys('Vijay');
//Element doesn't exist
var welcomeText =
element(by.binding('mmmm')).getText();
expect('Hello '+welcomeText+'!').toEqual('Hello Ram!')
});
});
Tetapi sebelum menjalankan, kita perlu melakukan beberapa perubahan pada file konfigurasi juga. Kami melakukan perubahan berikut di file konfigurasi yang digunakan sebelumnya, bernamaexample_configuration.js di bab sebelumnya -
// An example configuration file.
exports.config = {
directConnect: true,
// Capabilities to be passed to the webdriver instance.
capabilities: {
'browserName': 'chrome'
},
// Framework to use. Jasmine is recommended.
framework: 'jasmine',
// Spec patterns are relative to the current working directory when
// protractor is called.
specs: ['example_debug.js'],
allScriptsTimeout: 999999,
jasmineNodeOpts: {
defaultTimeoutInterval: 999999
},
onPrepare: function () {
browser.manage().window().maximize();
browser.manage().timeouts().implicitlyWait(5000);
}
};
Sekarang, jalankan perintah berikut -
protractor example_configuration.js
Debugger akan dimulai setelah perintah di atas.
Metode Debugger
Menggunakan metode jeda untuk men-debug kasus uji di Protractor adalah cara yang sedikit lebih maju. Kita dapat mengetikkan perintah berikut di tempat kita ingin memecahkan kode tes kita -
browser.debugger();
Ini menggunakan node debugger untuk men-debug kode pengujian. Untuk menjalankan perintah di atas, kita harus mengetikkan perintah berikut di command prompt terpisah yang dibuka dari lokasi proyek uji -
protractor debug protractor.conf.js
Dalam metode ini, kita juga perlu mengetik C di terminal untuk melanjutkan kode pengujian. Tetapi berlawanan dengan metode pause, dalam metode ini metode ini hanya diketik satu kali.
Contoh
Dalam contoh ini, kami menggunakan file spesifikasi yang sama bernama bexample_debug.js, digunakan di atas. Satu-satunya perbedaan adalah bahwa alih-alihbrowser.pause(), kita perlu menggunakan browser.debugger()di mana kami ingin memecahkan kode tes. Ini akan terlihat sebagai berikut -
describe('Suite for protractor debugger',function(){
it('Failing spec',function(){
browser.get("http://angularjs.org");
browser.debugger();
element(by.model('yourName')).sendKeys('Vijay');
//Element doesn't exist
var welcomeText = element(by.binding('mmmm')).getText();
expect('Hello '+welcomeText+'!').toEqual('Hello Ram!')
});
});
Kami menggunakan file konfigurasi yang sama, example_configuration.js, digunakan dalam contoh di atas.
Sekarang, jalankan uji busur derajat dengan opsi baris perintah debug berikut
protractor debug example_configuration.js
Debugger akan dimulai setelah perintah di atas.
Busur derajat - Panduan Gaya Untuk Busur Derajat
Dalam bab ini, mari kita pelajari secara mendetail tentang panduan gaya busur derajat.
pengantar
Panduan gaya dibuat oleh dua insinyur perangkat lunak bernama, Carmen Popoviciu, insinyur front-end di ING dan Andres Dominguez, insinyur perangkat lunak di Google. Karenanya, panduan gaya ini juga disebut Carmen Popoviciu dan panduan gaya Google untuk busur derajat.
Panduan gaya ini dapat dibagi menjadi lima titik tombol berikut -
- Aturan umum
- Struktur Proyek
- Strategi pencari lokasi
- Objek Halaman
- Suite uji
Aturan Umum
Berikut ini adalah beberapa aturan umum yang harus diperhatikan saat menggunakan busur derajat untuk pengujian -
Jangan uji ujung-ke-ujung apa yang telah diuji unit
Ini adalah aturan umum pertama yang diberikan oleh Carmen dan Andres. Mereka menyarankan agar kita tidak melakukan tes e2e pada kode yang sudah diuji unit. Alasan utama di baliknya adalah bahwa tes unit jauh lebih cepat daripada tes e2e. Alasan lainnya adalah kita harus menghindari tes duplikat (jangan melakukan pengujian unit dan e2e) untuk menghemat waktu kita.
Gunakan hanya satu file konfigurasi
Hal penting lainnya yang direkomendasikan adalah kita harus menggunakan hanya satu file konfigurasi. Jangan buat file konfigurasi untuk setiap lingkungan yang Anda uji. Kamu dapat memakaigrunt-protractor-coverage untuk mengatur lingkungan yang berbeda.
Hindari menggunakan logika untuk pengujian Anda
Kita harus menghindari penggunaan pernyataan IF atau pengulangan FOR dalam kasus pengujian kita karena jika kita melakukannya maka pengujian dapat lulus tanpa menguji apapun atau mungkin berjalan sangat lambat.
Buat pengujian independen di tingkat file
Busur derajat dapat menjalankan pengujian secara paralel saat berbagi diaktifkan. File-file ini kemudian dijalankan di berbagai browser saat dan ketika tersedia. Carmen dan Andres merekomendasikan untuk membuat tes independen setidaknya pada level file karena urutan mereka akan dijalankan oleh busur derajat tidak pasti dan selain itu cukup mudah untuk menjalankan tes secara terpisah.
Struktur Proyek
Poin kunci penting lainnya mengenai panduan gaya Busur Derajat adalah struktur proyek Anda. Berikut ini adalah rekomendasi tentang struktur proyek -
Uji meraba-raba e2e dalam struktur yang masuk akal
Carmen dan Andres merekomendasikan agar kami mengelompokkan pengujian e2e kami dalam struktur yang sesuai dengan struktur proyek Anda. Alasan di balik rekomendasi ini adalah menemukan file menjadi lebih mudah dan struktur folder lebih mudah dibaca. Langkah ini juga akan memisahkan tes e2e dari tes unit. Mereka merekomendasikan bahwa jenis struktur berikut harus dihindari -
|-- project-folder
|-- app
|-- css
|-- img
|-- partials
home.html
profile.html
contacts.html
|-- js
|-- controllers
|-- directives
|-- services
app.js
...
index.html
|-- test
|-- unit
|-- e2e
home-page.js
home-spec.js
profile-page.js
profile-spec.js
contacts-page.js
contacts-spec.js
Di sisi lain, mereka merekomendasikan jenis struktur berikut -
|-- project-folder
|-- app
|-- css
|-- img
|-- partials
home.html
profile.html
contacts.html
|-- js
|-- controllers
|-- directives
|-- services
app.js
...
index.html
|-- test
|-- unit
|-- e2e
|-- page-objects
home-page.js
profile-page.js
contacts-page.js
home-spec.js
profile-spec.js
contacts-spec.js
Strategi Penunjuk Lokasi
Berikut ini adalah beberapa strategi pelacak yang harus diperhatikan saat menggunakan busur derajat untuk pengujian -
Jangan pernah menggunakan XPATH
Ini adalah strategi pelacak pertama yang direkomendasikan dalam panduan gaya busur derajat. Alasan di balik hal yang sama adalah XPath membutuhkan banyak perawatan karena markup sangat mudah berubah. Selain itu, ekspresi XPath adalah yang paling lambat dan sangat sulit untuk di-debug.
Selalu pilih lokasi khusus busur derajat seperti by.model dan by.binding
Lokasi busur derajat khusus seperti by.model dan by.binding pendek, spesifik dan mudah dibaca. Dengan bantuan mereka, sangat mudah untuk menulis locator kami juga.
Contoh
View
<ul class = "red">
<li>{{color.name}}</li>
<li>{{color.shade}}</li>
<li>{{color.code}}</li>
</ul>
<div class = "details">
<div class = "personal">
<input ng-model = "person.name">
</div>
</div>
Untuk kode di atas, disarankan untuk menghindari hal berikut -
var nameElement = element.all(by.css('.red li')).get(0);
var personName = element(by.css('.details .personal input'));
Di sisi lain, berikut ini disarankan untuk digunakan -
var nameElement = element.all(by.css('.red li')).get(0);
var personName = element(by.css('.details .personal input'));
var nameElement = element(by.binding('color.name'));
var personName = element(by.model('person.name'));
Jika tidak ada pencari busur derajat yang tersedia, maka disarankan untuk memilih by.id dan by.css.
Selalu hindari pencari teks karena sering mengubah teks
Kita harus menghindari pencari berbasis teks seperti by.linkText, by.buttonText, dan by.cssContaningText karena teks untuk tombol, tautan, dan label sering berubah seiring waktu.
Objek Halaman
Seperti yang dibahas sebelumnya, objek halaman merangkum informasi tentang elemen-elemen pada halaman aplikasi kami dan karenanya membantu kami menulis kasus pengujian yang lebih bersih. Keuntungan yang sangat berguna dari objek halaman adalah bahwa mereka dapat digunakan kembali di beberapa pengujian dan jika template aplikasi kita telah diubah, kita hanya perlu memperbarui objek halaman. Berikut ini adalah beberapa rekomendasi objek halaman yang harus diperhatikan saat menggunakan busur derajat untuk pengujian -
Untuk berinteraksi dengan halaman yang sedang diuji, gunakan objek halaman
Sebaiknya gunakan objek halaman untuk berinteraksi dengan halaman yang sedang diuji karena objek tersebut dapat merangkum informasi tentang elemen pada halaman yang diuji dan dapat digunakan kembali juga.
Selalu nyatakan objek satu halaman per file
Kita harus mendefinisikan setiap objek halaman dalam filenya sendiri karena ini menjaga kode tetap bersih dan menemukan banyak hal menjadi mudah.
Di akhir file objek halaman selalu menggunakan satu module.exports
Direkomendasikan bahwa setiap objek halaman harus mendeklarasikan satu kelas sehingga kita hanya perlu mengekspor satu kelas. Misalnya, penggunaan file objek berikut harus dihindari -
var UserProfilePage = function() {};
var UserSettingsPage = function() {};
module.exports = UserPropertiesPage;
module.exports = UserSettingsPage;
Namun di sisi lain, berikut ini disarankan untuk digunakan -
/** @constructor */
var UserPropertiesPage = function() {};
module.exports = UserPropertiesPage;
Deklarasikan semua modul yang diperlukan di bagian atas
Kita harus mendeklarasikan semua modul yang diperlukan di bagian atas objek halaman karena itu membuat dependensi modul menjadi jelas dan mudah ditemukan.
Buat instance semua objek halaman di awal rangkaian pengujian
Direkomendasikan untuk membuat instance semua objek halaman di awal rangkaian pengujian karena ini akan memisahkan dependensi dari kode pengujian serta membuat dependensi tersedia untuk semua spesifikasi rangkaian.
Jangan gunakan ekspektasi () di objek halaman
Kita tidak boleh menggunakan ekspektasi () dalam objek halaman, yaitu kita tidak boleh membuat pernyataan apa pun di objek halaman karena semua pernyataan harus dilakukan dalam kasus pengujian.
Alasan lain adalah bahwa pembaca tes harus dapat memahami perilaku aplikasi hanya dengan membaca kasus uji.