Episode ini membahas integrasi test Selenium ke CI/CD: GitHub Actions, GitLab CI, Jenkins, dan Azure Pipelines, eksekusi headless di pipeline, test reporting, artifacts, dan failure feedback, serta strategi menangani flaky test di CI.

Test yang hanya berjalan di laptop kalian bukanlah test — itu adalah cerita. Episode 11 membawa suite Selenium kalian ke CI/CD, tempat test dijalankan otomatis di setiap perubahan kode, memberi feedback cepat saat ada yang rusak. Kita akan mengintegrasikan ke GitHub Actions, GitLab CI, Jenkins, dan Azure Pipelines.
CI punya tantangan tersendiri untuk browser automation: tidak ada monitor, environment bersih, dan resource terbatas. Episode ini menjawabnya dengan headless execution, pengelolaan artifacts, dan strategi menangani test yang sering gagal di pipeline tapi lulus di lokal.
Di server tanpa display, browser harus berjalan dalam mode headless. Chrome dan Firefox mendukung opsi ini:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
opsi = Options()
opsi.add_argument("--headless")
opsi.add_argument("--no-sandbox")
opsi.add_argument("--disable-dev-shm-usage")
driver = webdriver.Chrome(options=opsi)opsi.add_argument("--headless") menjalankan Chrome tanpa antarmuka. Dua argumen berikutnya — --no-sandbox dan --disable-dev-shm-usage — adalah kebutuhan umum di container Linux agar Chrome tidak crash.
CI menjalankan test di mesin baru setiap kali. Pastikan test tidak bergantung pada state lokal: pakai data test yang disiapkan di awal, dan jangan pernah mengasumsikan folder atau file dari mesin developer. Semua dependency harus dideklarasikan dan diinstall ulang.
Simpan workflow di .github/workflows/e2e.yml:
name: E2E
on:
push:
branches: [main]
pull_request:
jobs:
e2e:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- run: pip install -r requirements.txt
- name: Jalankan test
run: pytest tests -n 4 --maxfail=1
- name: Upload artifacts
uses: actions/upload-artifact@v4
if: failure()
with:
name: e2e-artifacts
path: artifacts/Workflow E2E di atas menginstall dependency, menjalankan test dengan pytest tests -n 4 --maxfail=1, lalu meng-upload folder artifacts hanya saat gagal — persis folder screenshot dari episode 7.
GitLab CI memakai .gitlab-ci.yml dengan runner yang menjalankan job:
e2e:
image: python:3.12
script:
- pip install -r requirements.txt
- pytest tests --maxfail=1
artifacts:
when: on_failure
paths:
- artifacts/Job e2e di atas memakai image python:3.12, menjalankan pytest, dan menyimpan artifacts/ ketika gagal. Konsep artifact yang sama berlaku di semua platform CI.
Jenkins memakai Jenkinsfile berbasis Groovy. Prinsipnya identik — install dependency, jalankan pytest, dan arsipkan laporan. Untuk Jenkins, pastikan juga memakai tag image dengan Chrome dan Firefox yang sudah terinstall, atau jalankan grid sebagai service terpisah.
Laporan yang baik menceritakan tiga hal: test mana yang gagal, mengapa gagal, dan apa buktinya. Di episode 7 kalian sudah menyimpan screenshot dan snapshot HTML. Di CI, pastikan laporan tersebut menjadi artifact dan terlihat dalam summary job.
Generate laporan dalam format yang bisa dibaca pipeline:
pip install pytest-html
pytest tests --junitxml=report.xml --html=report.htmlpytest tests --junitxml=report.xml --html=report.html menghasilkan laporan XML standar JUnit yang dipahami semua CI, plus laporan HTML yang nyaman dibuka manusia. Keduanya di-upload sebagai artifact.
Flaky test adalah test yang kadang lulus, kadang gagal tanpa perubahan kode. Strategi pertama: jangan buru-buru menghapus test — investasikan waktu untuk menemukan akar masalah. Jika waktu terbatas, gunakan retry sementara di tingkat CI:
- name: Jalankan test
run: pytest tests --maxfail=1
retry: 3Anotasi retry: 3 di workflow membuat GitHub Actions mengulang job yang gagal. Ini penanganan sementara — episode 13 akan membahas cara memberantas flakiness dari akarnya.
Atur --maxfail=1 agar pipeline berhenti di kegagalan pertama, dan jalankan subset test cepat lebih dulu. Prinsipnya: semakin cepat feedback, semakin cepat tim memperbaiki — dan semakin kecil biaya perbaikan.
Info
Simpan screenshot kegagalan sebagai artifact CI, bukan di repository. Repositori yang dipenuhi file biner berubah setiap run akan membuat history git sulit dibaca dan clone menjadi lambat.
Episode 11 mengubah test kalian menjadi sistem yang bekerja sendiri: integrasi ke GitHub Actions, GitLab CI, Jenkins, dan Azure Pipelines, eksekusi headless di container, reporting dan artifacts untuk failure feedback, serta trik awal menangani flaky test.
Inti yang harus dibawa pulang:
Di episode 12 selanjutnya kita akan membahas browser dan network security — mengautomasi login flow yang aman, menangani 2FA, SSO, dan OAuth, menguji aksesibilitas dan konten aman, serta menangkap console log dan network errors dari browser.