Tips Pengujian Supercharged untuk 2019: Tutorial Pengujian Otomatisasi Java
Diterbitkan: 2022-03-11Setiap tahun, teknisi otomasi pengujian dari seluruh dunia akan meneliti alat dan teknik terbaru untuk membuat kerangka kerja otomasi pengujian mereka lebih stabil, lebih cepat, dan lebih mudah digunakan dan dipelihara. Hal ini penting untuk memastikan adopsi berkelanjutan yang meluas dari kerangka kerja mereka di dalam perusahaan mereka. Secara umum, kerangka kerja yang kembung dan ketinggalan zaman dengan cepat menjadi ketinggalan zaman.
Dalam artikel ini, kita akan melihat beberapa cara Anda dapat memperbarui kerangka kerja Anda untuk tahun 2019 dan bagaimana mempersiapkannya untuk tahun 2020. Untuk meningkatkan kerangka kerja saya, saya selalu berkonsentrasi pada "titik sakit". Ini adalah area yang rumit untuk diatur atau paling banyak menyebabkan kegagalan. Saya mengidentifikasi tiga bidang utama yang ingin saya sederhanakan atau tingkatkan:
- Selenium Grid
- Menunggu
- Alat Pengembang Chrome
Selenium Grid terkenal sulit diatur dan bisa gagal tanpa peringatan. Saya ingin melihat apa, jika ada, yang telah ditingkatkan di sini. Saya juga ingin menyelidiki apakah ada waktu waits
baru telah ditambahkan ke Selenium API untuk meningkatkan stabilitas tes yang saya buat. Terakhir, saya ingin melihat apakah saya dapat mulai berinteraksi dengan Chrome DevTools melalui Selenium, yang telah menjadi bagian penting dari perangkat penguji mana pun.
Tip #1: Dockerize Selenium Grid Anda
Selenium Grid terkenal sulit untuk diatur, tidak stabil, dan sulit untuk diterapkan, atau kontrol versi, pada saluran CI. Cara yang jauh lebih mudah, stabil, dan dapat dipelihara adalah dengan menggunakan gambar Selenium Docker yang sudah dibuat sebelumnya.
Catatan: Satu-satunya kelemahan dari metode ini adalah IE (Internet Explorer) tidak didukung, karena sistem operasi Windows belum dapat menampungnya.
Persiapan
Untuk memulai dan menjalankan, pertama-tama Anda harus menginstal Docker dan Docker Compose di mesin Anda. Jika Anda menjalankan Windows 10 atau Mac, keduanya akan diinstal melalui Docker Desktop.
Memulai Grid Anda
Repositori Selenium resmi di Docker Hub berisi gambar Docker yang dibuat sebelumnya untuk Selenium Hub dan Firefox serta Chrome Nodes Anda.
Cara termudah untuk menggunakan ini di Selenium Grid lokal adalah dengan membuat file Docker Compose di dalam direktori root proyek Anda. Beri nama file docker-compose.yml
agar semuanya tetap sederhana.
Saya telah menyertakan contoh di bawah ini yang membuat Grid berikut:
- Satu Hub Selenium
- Satu simpul Chrome
- Satu simpul Firefox
#docker-compose.yml version: "3" services: selenium-hub: image: selenium/hub:3.141.59-neon container_name: selenium-hub ports: - "4444:4444" chrome: image: selenium/node-chrome:3.141.59-neon volumes: - /dev/shm:/dev/shm depends_on: - selenium-hub environment: - HUB_HOST=selenium-hub - HUB_PORT=4444 firefox: image: selenium/node-firefox:3.141.59-neon volumes: - /dev/shm:/dev/shm depends_on: - selenium-hub environment: - HUB_HOST=selenium-hub - HUB_PORT=4444
File Docker Compose menjelaskan pengaturan Grid Anda. Untuk informasi lebih lanjut tentang membuat file Docker Compose, silakan lihat dokumentasi resmi.
Untuk memulai Grid Anda, cukup gunakan jendela terminal apa pun (jendela powershell
atau cmd
di Windows) untuk menjalankan perintah berikut dari direktori root proyek Anda:
docker-compose up
Menghubungkan ke Grid
Anda dapat terhubung ke Selenium Grid Anda dengan cara yang persis sama seperti biasanya, karena Hub mendengarkan pada port 4444 mesin lokal Anda. Berikut adalah contoh di mana kami mengatur Driver kami untuk menggunakan Chrome Node.js kami.
// Driver.java protected static RemoteWebDriver browser; DesiredCapabilities cap = new DesiredCapabilities(); ChromeOptions chromeOptions = new ChromeOptions(); cap.setCapability(ChromeOptions.CAPABILITY, chromeOptions); cap.setBrowserName("chrome"); driver = new RemoteWebDriver(cap);
Anda kemudian dapat menggunakan perpustakaan TestNG untuk menjalankan pengujian Anda pada beberapa node secara paralel seperti biasa.
Perlu dicatat bahwa dimungkinkan untuk menjalankan beberapa browser di setiap node. Namun hal ini tidak disarankan, dan menggunakan satu browser per node dianggap sebagai praktik terbaik untuk kinerja yang optimal.
Tips dan Trik Tambahan
Jika Anda ingin melihat apa yang terjadi pada browser sehingga Anda dapat men-debug pengujian Anda, maka ada baiknya memiliki versi debug
dari file docker-compose.yml
Anda yang mendownload node browser debug
. Ini berisi server VNC sehingga Anda dapat melihat browser saat pengujian berjalan.
Ini juga memungkinkan untuk menjalankan browser tanpa kepala untuk meningkatkan kecepatan (cara biasa) dan Selenium juga menyediakan versi base
gambar sehingga Anda dapat membuat gambar sendiri jika Anda memerlukan perangkat lunak tambahan yang diinstal.
Untuk membuat versi Grid yang stabil untuk pipeline CI Anda, Anda juga dapat men-deploy Grid Anda ke Kubernetes atau Swarm. Ini memastikan bahwa setiap Docker dengan cepat dipulihkan atau diganti jika gagal.
Tip #2: Menunggu dengan Cerdas
Seperti yang diketahui oleh insinyur otomasi pengujian, waits
sangat penting untuk stabilitas kerangka kerja otomasi pengujian Anda. Mereka juga dapat mempercepat pengujian Anda dengan membuat sleeps
atau pauses
yang berlebihan dan mengatasi masalah jaringan dan lintas-browser yang lambat. Berikut adalah beberapa tips untuk membuat waits
Anda lebih tangguh.
Tutorial Pengujian Otomatisasi Java #2: Operator Logika dalam Menunggu: Spesifik dengan Waktu Tunggu Anda
Kelas ExpectedConditions
telah berkembang dari waktu ke waktu dan sekarang mencakup hampir setiap situasi yang bisa dibayangkan. Meskipun ExpectedConditions.presenceOfElementLocated(locator)
sudah cukup sering, praktik terbaiknya adalah menggunakan metode dalam kelas ExpectedCondition
untuk mencakup setiap tindakan pengguna dengan menyematkannya ke dalam kelas Actions.java
Anda. Ini akan membuktikan pengujian Anda terhadap sebagian besar masalah lintas-browser atau situs web yang lambat.
Misalnya , jika mengeklik tautan akan membuka tab baru, gunakan ExpectedConditions.numberOfWindowsToBe(2)
. Ini akan memastikan bahwa tab ada di sana sebelum mencoba beralih ke sana.
Anda juga dapat menggunakan wait
untuk memastikan bahwa Anda menangkap semua elemen yang ada di halaman saat menggunakan findElements
. Ini bisa sangat berguna jika halaman search
membutuhkan waktu untuk mengembalikan hasilnya. Misalnya, baris ini:
List<WebElement> results = driver.findElements(locators.RESULTS);
Ini dapat menghasilkan larik List
kosong jika hasil pencarian Anda belum dimuat. Sebagai gantinya, lebih baik menggunakan kondisi yang diharapkan numberOfElementsToBeMoreThan
untuk menunggu hasilnya lebih dari nol. Sebagai contoh:
WebElement searchButton = driver.findElement(locators.SEARCH_BUTTON); searchButton.click(); new WebDriverWait(driver, 30) .until(ExpectedConditions .numberOfElementsToBeMoreThan(locators.RESULTS, 0)); List<WebElement> results = driver.findElements(locators.RESULTS); results.get(0).click();
Sekarang, perintah findElements
Anda hanya akan berjalan setelah hasil pencarian dikembalikan.
wait
ini juga berguna untuk menemukan elemen tunggal saat Anda berurusan dengan front end yang tidak cocok dengan Selenium (mis., situs web Angular). Membuat metode seperti ini akan melindungi pengujian Anda, membuatnya jauh lebih stabil.
protected static WebElement waitForElement(By locator){ try { new WebDriverWait(browser, 30) .until(ExpectedConditions .numberOfElementsToBeMoreThan(locator, 0)); } catch (TimeoutException e){ e.printStackTrace(); Assert.fail("Timeout: The element couldn't be found in " + WAIT + " seconds!"); } catch (Exception e){ e.printStackTrace(); Assert.fail("Something went wrong!"); } return browser.findElement(locator); }
Bahkan mungkin menunggu elemen tidak lagi terlihat. Ini sangat berguna jika Anda menunggu pop-up menghilang setelah Anda mengklik tombol OK
atau Save
sebelum melanjutkan pengujian Anda.
WebElement okButton = driver.findElement(locators.OK_BUTTON); okButton.click(); new WebDriverWait(driver, 30) .until( ExpectedConditions .invisibilityOfElementLocated(locators.POPUP_TITLE) );
Semua metode yang dijelaskan di atas dan lebih banyak lagi tercantum dalam dokumentasi resmi. Sebaiknya luangkan waktu sepuluh menit untuk membaca semua kemungkinan dan meningkatkan stabilitas kerangka kerja Anda.
Tutorial Pengujian Otomatisasi Java #2: Operator Logika di Waits
Cara yang baik untuk membangun ketahanan dalam waits
Anda adalah dengan menggunakan operator logika. Misalnya, jika Anda ingin memeriksa apakah suatu elemen telah ditemukan DAN dapat diklik, Anda akan menggunakan kode berikut (harap perhatikan bahwa contoh ini mengembalikan nilai boolean):
wait.until(ExpectedConditions.and( ExpectedConditions.presenceOfElementLocated(locator), ExpectedConditions.elementToBeClickable(locator) ) );
Operator OR akan sesuai jika Anda tidak yakin apakah judul halaman akan berubah atau tidak. Kemudian Anda dapat menyertakan pemeriksaan URL jika kondisi pertama gagal, untuk mengonfirmasi bahwa Anda benar-benar berada di halaman yang benar.

wait.until(ExpectedConditions.or( ExpectedConditions.titleIs(expectedTitle), ExpectedConditions.urlToBe(expectedUrl) ) );
Atau jika Anda ingin memastikan bahwa kotak centang tidak lagi diaktifkan setelah tindakan dilakukan pada halaman, maka operator NOT sesuai.
wait.until(ExpectedConditions.not( ExpectedConditions.elementToBeClickable(locator) ) );
Menggunakan operator dapat membuat waits
Anda lebih tangguh dan menghasilkan pengujian yang tidak terlalu rapuh.
Tip #3: Chrome DevTools: Mensimulasikan Kondisi Jaringan
Menjalankan aplikasi web Anda di localhost atau di jaringan lokal dapat memberikan kesan yang salah tentang kinerjanya saat berjalan di alam liar. Kemampuan untuk membatasi berbagai kecepatan unggah dan unduh akan memberi Anda gambaran yang lebih baik tentang bagaimana aplikasi Anda akan berjalan melalui internet, di mana batas waktu dapat menyebabkan tindakan gagal. Kita dapat mulai mensimulasikan ini menggunakan kekuatan DevTools Chrome.
Kode berikut akan membuka beranda Toptal menggunakan kecepatan unduh dan unggah yang berbeda. Pertama, kami akan menyimpan kecepatan kami di penyedia data TestNG menggunakan kode berikut:
import org.testng.annotations.DataProvider; public class ExcelDataProvider { @DataProvider(name = "networkConditions") public static Object[][] networkConditions() throws Exception { return new Object[][] { // Upload Speed, Dowload Speed in kb/s and latency in ms. { 5000 , 5000, 5 }, { 10000, 7000, 5 }, { 15000, 9000, 5 }, { 20000, 10000, 5 }, { 0, 0 }, }; } }
Catatan: Pembatasan unggah dan unduh dalam kb/s
dan latensi dalam ms
.
Kemudian, kami dapat menggunakan data ini untuk menjalankan pengujian kami di bawah kondisi jaringan yang berbeda. Dalam pengujian, CommandExecutor
akan menjalankan perintah di sesi browser saat ini. Ini pada gilirannya akan mengaktifkan pengaturan yang diperlukan di fungsi Alat Pengembang Chrome untuk mensimulasikan jaringan kami yang lambat. Kode di dalam pernyataan if
dapat disertakan dalam metode @BeforeClass
saat menjalankan serangkaian pengujian.
import org.testng.annotations.Test; import com.google.common.collect.ImmutableMap; import java.io.IOException; import java.util.HashMap; import java.util.Map; import org.openqa.selenium.remote.Command; import org.openqa.selenium.remote.CommandExecutor; import org.openqa.selenium.remote.Response; public class TestClass { // load our data provider @Test(dataProvider = "networkConditions") public void test(int download, int upload, int latency) throws IOException { // only run if the network is throttled if (download > 0 && upload > 0) { CommandExecutor executor = driver.getCommandExecutor(); // create a hashmap of the required network conditions Map map = new HashMap(); // you can even test 'offline' behaviour map.put("offline", false); map.put("latency", latency); map.put("download_throughput", downloadThroughput); map.put("upload_throughput", uploadThroughput); // execute our code Response response = executor.execute( new Command(driver.getSessionId(), "setNetworkConditions", ImmutableMap.of("network_conditions", ImmutableMap.copyOf(map)))); } // Open the website driver.get("https://www.toptal.com/"); // You can then check that elements are loaded etc. // Don't forget to use waits! } }
Kiat Bonus: Cara Mengelola Cookie Anda
Cookie browser dapat menyebabkan perilaku yang berbeda dalam aplikasi Anda, tergantung pada apakah cookie tersebut telah disimpan dari sesi sebelumnya atau tidak (mis., aplikasi mungkin dimuat dengan pengguna yang sudah login). Ini praktik yang baik untuk menghapus cookie Anda sebelum setiap pengujian dijalankan untuk memastikan bahwa mereka tidak menimbulkan masalah.
Kode di bawah ini memungkinkan Anda untuk menghapus semua cookie Anda:
driver.manage().deleteAllCookies();
Anda juga dapat menghapus cookie berdasarkan nama:
driver.manage().deleteCookieNamed("CookieName");
Atau dapatkan konten cookie:
String myCookie = driver.manage().getCookieNamed("CookieName").getValue();
Atau dapatkan semua cookie:
List<Cookie> cookies = driver.manage().getCookies();
Uji Otomasi pada tahun 2020: Menatap Masa Depan
Selenium 4 akan dirilis dalam beberapa bulan ke depan. Ini masih dalam pengembangan, tetapi karena versi alfa telah dirilis, ada baiknya melihat peningkatan apa yang akan ditawarkannya.
Catatan: Anda dapat melacak kemajuan mereka dengan melihat peta jalan.
Standarisasi WebDriver W3C
Selenium tidak lagi perlu berkomunikasi dengan browser melalui protokol kabel JSON; sebagai gantinya, pengujian otomatis akan berkomunikasi langsung dengan browser. Ini harus mengatasi sifat terkelupas yang terkenal dari tes Selenium, termasuk melindungi terhadap peningkatan versi browser. Semoga kecepatan tes akan meningkat juga.
Kisi Selenium yang Lebih Sederhana
Selenium Grid akan lebih stabil dan lebih mudah untuk diatur dan dikelola di Selenium 4. Pengguna tidak perlu lagi mengatur dan memulai hub dan node secara terpisah karena grid akan bertindak sebagai node dan hub gabungan. Plus, akan ada dukungan yang lebih baik untuk Docker, pengujian paralel akan disertakan secara asli, dan itu akan memberikan UI yang lebih informatif. Permintaan pelacakan dengan Hooks juga akan membantu Anda men-debug grid Anda.
Dokumentasi
Dokumentasi Selenium akan mendapatkan perbaikan yang sangat dibutuhkan, karena belum diperbarui sejak rilis Selenium 2.0.
Perubahan pada API
Dukungan untuk browser Opera dan PhantomJS akan dihapus. Menjalankan tanpa kepala dapat dilakukan dengan Chrome atau Firefox, dan Opera dibangun di atas Chromium dan oleh karena itu pengujian Chromium dianggap cukup untuk browser ini.
WebElement.getSize()
dan WebElement.getLocation()
sekarang diganti dengan metode tunggal WebElement.getRect()
. Namun, karena ini sering digunakan untuk membuat tangkapan layar dari satu elemen, perlu diketahui bahwa juga akan ada perintah API untuk menangkap tangkapan layar dari suatu elemen di Selenium 4.
Untuk WebDriver Window
, metode getPosition
dan getSize
akan diganti dengan metode getRect
dan metode setPosition
dan setSize
akan diganti dengan metode setRect
. metode fullscreen
dan minimize
akan tersedia, sehingga tindakan ini dapat dilakukan dalam pengujian Anda.
Perubahan Penting lainnya:
- Kelas
Options
untuk setiap browser sekarang akan memperluas kelasCapabilities
. - Metode
driver.switchTo().parentFrame()
telah ditambahkan untuk mempermudah navigasi bingkai. - pencari yang
nice
akan disertakan yang beroperasi pada tingkat yang lebih tinggi dari yang sekarang. Mereka akan menjadi subclass dariBy
. - Akan ada implementasi
DevTools
API, yang memungkinkan pengguna memanfaatkan fitur yang ditawarkan dengan menggunakan Protokol Debugging Chrome (dan yang setara di browser lain). Ini termasuk:- Tangkapan layar halaman penuh (termasuk elemen di luar layar).
- Log streaming.
- Menunggu acara mutasi di halaman.
- Banyak metode dan kelas yang tidak digunakan lagi juga akan dihapus.
Catatan: Anda bisa mendapatkan Selenium 4 versi Alpha dari repositori Maven. Sangat disarankan untuk mencoba ini terhadap kerangka kerja Anda saat ini (idealnya di cabang kotak pasir), jadi Anda siap untuk perubahan.
Kesimpulan
Dalam artikel ini, saya telah membahas beberapa area di mana saya telah meningkatkan kerangka kerja otomatisasi pengujian saya menjadi lebih baik. Sekarang lebih stabil dan dapat digunakan daripada sebelumnya, yang akan berdampak positif pada semua orang yang terlibat dalam siklus hidup pengiriman perangkat lunak.
Membuat perubahan yang telah saya uraikan di atas adalah awal yang baik, namun, saya sangat menyarankan Anda meninjau seluruh kerangka kerja Anda untuk "poin masalah", karena mungkin ada perbaikan yang dapat Anda lakukan yang belum saya bahas. Misalnya, apakah Anda menggunakan WebDriver Manager untuk mengelola driver Anda atau apakah Anda masih memperbaruinya secara manual?
Saya juga merekomendasikan untuk menetapkan tanggal untuk melakukan ini setidaknya setahun sekali, meskipun idealnya setiap enam bulan. Dalam artikel, saya telah menyertakan perubahan yang akan datang di Selenium 4.0. Harap tinjau sendiri versi alpha
Selenium. Perubahannya akan dramatis dan Anda harus siap. Saya harap Anda telah menemukan ini berguna. Jika Anda menemukan metode atau teknik baru saat melakukan sedikit pembersihan pegas pada kerangka kerja Anda, silakan bagikan dengan pembaca lain di blog ini dengan menambahkannya ke bagian komentar di bawah.
Juga, jika Anda ingin melihat pengujian otomatis di Selenium, dan bagaimana Anda dapat menggunakan model Objek Halaman untuk menulis rutinitas pengujian yang dapat dipelihara dan digunakan kembali, lihat Otomatisasi di Selenium: Model Objek Halaman dan Pabrik Halaman .