Modul 10 - End-to-End Testing Dengan Pytest Dan Selenium
Modul 10 - End-to-End Testing Dengan Pytest Dan Selenium
Dengan kata lain, E2E testing bertujuan untuk melihat bagaimana berbagai komponen
sistem bekerja sama untuk mendukung tindakan yang dilakukan pengguna. Secara garis
besar, pengujian dilakukan dengan:
Pada modul ini, pengujian ditargetkan pada sebuah aplikasi web. Dengan melakukan
E2E testing, kita dapat mensimulasikan interaksi user dan internal sistem untuk
memastikan seluruh fungsionalitas aplikasi web yang dikembangkan berjalan
sebagaimana mestinya.
Salah satu aplikasi populer yang umum digunakan bersamaan dengan Pytest untuk
pengujian E2E adalah Selenium (https://www.selenium.dev). Selenium adalah sebuah
framework open-source yang digunakan untuk melakukan automated testing pada
aplikasi web. Selenium memungkinkan tester untuk merekam dan memutar ulang
interaksi pengguna dengan web app, seperti mengisi formulir, mengklik tombol, dan
menavigasi antar halaman. Perlu diingat, dengan segala macam fitur yang disediakan
oleh Selenium, pengujian manual dan eksplorasi oleh human-tester tetap diperlukan
untuk memastikan cakupan pengujian yang menyeluruh dan menemukan bug yang
tidak terduga.
driver = webdriver.Chrome()
driver.get("https://www.python.org/")
time.sleep(3) #nunggu 3 detik
Kelemahan utama dari metode By.LINK_TEXT adalah metode ini dapat menyebabkan
ambigu karena mungkin ada navigasi lainnya dengan nama About. Oleh karena itu, cara
yang direkomendasikan adalah dengan menggunakan XPATH seperti berikut ini:
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
driver = webdriver.Chrome()
//a: Ini adalah cara kita memberi tahu XPath untuk mencari elemen <a> di dalam halaman
web. Tanda dua garis miring miring // berarti kita ingin mencari elemen ini di seluruh dokumen
HTML, tidak peduli seberapa dalam elemen tersebut tertanam.
[@href='/about/']: Bagian ini memberi tahu XPath bahwa kita hanya tertarik pada elemen-
elemen <a> yang memiliki atribut href dengan nilai '/about/'. Dalam konteks ini, @href berarti
kita ingin memeriksa nilai atribut href, dan '/'about/' adalah nilai yang ingin kita cocokkan.
Jadi, XPath ini mencari semua tautan (<a>) di halaman web yang mengarah ke URL '/about/'.
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://google.com/")
time.sleep(3) #nunggu 3 detik
Buat database dengan nama dbpolibatam lalu import file dbpolibatam.sql yang ada
pada file zip. Hasil database akan terlihat seperti berikut ini:
Selanjutnya, karena pada contoh ini kita akan menggunakan Chrome, maka pastikan
pula anda telah mendownload chrome di sistem anda masing-masing:
https://www.google.com/chrome/
Aplikasi webflask yang telah disediakan perlu dijalankan melalui beberapa library
Python. Oleh karena itu, lakukan instalasi library tersebut dengan perintah berikut ini:
Pada command prompt atau terminal. jalankan perintah:
pip install flask pymysql requests
Jika database dan file telah selesai disiapkan, maka jalankan web dengan menjalankan
perintah:
python app.py
atau
Untuk menguji fitur ini secara otomatis menggunakan selenium, Buat sebuah file
dengan nama test_01_uji-login.py lalu salin kode berikut ini:
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
@pytest.fixture(scope="module")
def driver():
driver = webdriver.Chrome()
driver.maximize_window()
yield driver
driver.quit()
def test_login_and_logout(driver):
login_url = 'http://127.0.0.1:9999/'
email = '[email protected]'
password = 'rahasia123'
driver.get(login_url)
email_field.send_keys(email)
time.sleep(2)
password_field.send_keys(password)
time.sleep(2)
login_button.click()
time.sleep(2)
current_url = driver.current_url
if '/dashboard' in current_url:
assert True, "Login berhasil"
time.sleep(3)
logout = driver.find_element(By.XPATH, "//a[@href='/logout']")
logout.click()
Dari contoh kode diatas, perlu diperhatikan bahwa saat ingin melakukan uji coba terkait
fitur yang dilindungi oleh autentikasi, maka dengan perspektif user, kita sebaiknya
memulai langkah pengujian E2E dari login hingga proses pengujian yang diinginkan
terpenuhi (dalam hal ini: tambah mahasiswa).
Pada kode diatas, kita akan menggunakan Selenium untuk mengotomatisasi pengujian
pada halaman web. Pertama, skrip akan dijalankan menggunakan Chrome WebDriver
untuk mengontrol browser Chrome yang ada di sistem. Kemudian, diarahkan untuk
mengakses URL "http://127.0.0.1:9999/mahasiswa/tambah" di browser tersebut.
Buat file dengan nama test_02_tambah-mhs.py lalu salin kode dibawah ini:
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
@pytest.fixture(scope="module")
def driver():
driver = webdriver.Chrome()
driver.maximize_window()
yield driver
driver.quit()
def test_add_new_student(driver):
try:
login_url = 'http://127.0.0.1:9999/'
driver.get(login_url)
email_field.send_keys('[email protected]')
time.sleep(2)
password_field.send_keys('rahasia123')
time.sleep(2)
login_button.click()
time.sleep(2)
except Exception as e:
pytest.fail(f"Terjadi kesalahan: {e}")
Kode pada fungsi driver selalu digunakan dalam mempersiapkan pengujian E2E
menggunakan pytest, apakah itu???
@pytest.fixture(scope="module"): decorator untuk mendefinisikan sebuah
fixture. scope="module" adalah parameter opsional yang menunjukkan cakupan atau
ruang lingkup dari fixture. Dalam hal ini, scope="module" berarti fixture ini akan
berlaku untuk semua tes dalam satu modul (file) pengujian.
def driver():: Ini adalah nama dari fixture. Kita dapat menggunakan nama apa pun
untuk fixture Anda.
driver = webdriver.Chrome(): Di dalam fungsi fixture, kode ini membuat sebuah
instance dari WebDriver untuk browser. WebDriver adalah API yang digunakan untuk
mengotomatisasi browser web (dalam hal ini Chrome)
driver.maximize_window(): metode yang digunakan untuk memaksimalkan jendela
browser.
yield driver: Ini adalah bagian terpenting dari fixture. yield digunakan untuk
memberikan nilai kembali ke pemanggil fixture (tes yang menggunakan fixture ini).
driver.quit(): Setelah semua tes yang menggunakan fixture ini selesai dijalankan,
bagian ini akan dieksekusi untuk membersihkan dan menutup browser.
@pytest.fixture(scope="module")
def driver():
driver = webdriver.Chrome()
driver.maximize_window()
yield driver
driver.quit()
def test_update_student_info(driver):
try:
login_url = 'http://127.0.0.1:9999/'
driver.get(login_url)
nama_input.clear()
time.sleep(2)
nama_input.send_keys("Fulan")
time.sleep(5)
alamat_input.clear()
time.sleep(2)
alamat_input.send_keys("Batu Aji")
time.sleep(3)
except Exception as e:
pytest.fail(f"Terjadi kesalahan: {e}")
//table[@class='table
table-striped']//tr[position()=1]//a[text()='Ubah'])[1]")
Dalam kode XPATH ini, kita mencari elemen <a> yang memiliki teks
"Ubah" di dalam tabel dengan atribur class "table table-striped",
dimana elemennya harus terletak dalam baris pertama (position()=1)
dari tabel.
@pytest.fixture(scope="module")
def setup():
driver = webdriver.Chrome()
driver.maximize_window()
yield driver
driver.quit()
def test_delete_first_student(setup):
driver = setup
try:
login_url = 'http://127.0.0.1:9999/'
driver.get(login_url)
email_field.send_keys('[email protected]')
time.sleep(2)
password_field.send_keys('rahasia123')
time.sleep(2)
login_button.click()
time.sleep(2)
except Exception as e:
pytest.fail(f"Terjadi kesalahan: {e}")
Selanjutnya, dari terminal masuk ke dalam folder testing dan jalankan perintah: pytest
Tugas 1: Pada folder testing, buatlah fitur pengujian untuk tambah, edit dan hapus
Matakuliah. Salin kode jawaban anda disini:
test_05_uji-tambah-makul.py
test_06_uji-ubah-makul.py
test_07_uji-hapus-makul.py
Tugas 2: Pada folder testing, buatlah fitur pengujian untuk navigasi ke dalam menu
Joke of the Day. Salin kode jawaban anda disini:
test_08_joke.py
Tugas 3: Pada folder testing, buatlah fitur pengujian untuk navigasi ke dalam menu
Tentang. Salin kode jawaban anda disini:
test_09_tentang.py
Jalankan ulang semua file yang ada di folder testing, Screenshot hasilnya disini:
- Selamat Mengerjakan -