2.6.2 Penerapan OOP dalam Struktur Kerangka Kerja Automated Testing
Dalam dunia modern pengujian perangkat lunak, automated test framework adalah fondasi utama untuk menjalankan pengujian skala besar dengan efisien. Tanpa framework yang kokoh dan terstruktur, pengujian otomatis akan cepat menjadi sulit dikelola karena adanya duplikasi kode, sulitnya perawatan, dan kurangnya fleksibilitas saat aplikasi berkembang.
Di sinilah Object-Oriented Programming (OOP) memainkan peran penting. OOP memberikan pendekatan terstruktur dengan memecah sistem pengujian menjadi komponen modular, reusable, dan berbasis konsep nyata, layaknya cara kita membangun aplikasi perangkat lunak. Dalam konteks ini, kita bukan sekedar menulis test script, tetapi membangun “software untuk menguji software”, yang memerlukan desain arsitektur yang baik.
⬛ Mengapa OOP Penting dalam Automation Framework?
Ketika QA Engineer mulai membuat automated test tanpa prinsip OOP, biasanya mereka langsung menulis langkah-langkah test case ke dalam satu file skrip panjang. Misalnya, untuk menguji login, semua locator, tindakan klik, dan verifikasi ditulis dalam satu test case. Lalu, ketika ada 50 test cases lain yang perlu login, kode login yang sama akan di-copy-paste. Akibatnya, ketika ada perubahan kecil pada field login (misalnya ID input diubah oleh developer), QA harus memperbarui puluhan file test script.
Dengan OOP, kita mengelompokkan logika tersebut menjadi class dan method yang mudah digunakan ulang. Misalnya:
● Kita bisa membuat class LoginPage yang berisi semua fungsi login.
● Setiap test case yang butuh login cukup memanggil loginPage.login(username, password).
● Jika ID elemen login berubah, kita cukup mengubahnya sekali di LoginPage.java, bukan di seluruh test case.
⬛ Pilar OOP di Framework Testing
Keempat pilar OOP (Encapsulation, Inheritance, Polymorphism, dan Abstraction) diterapkan secara alami dalam automation framework:
- Encapsulation:
○ Locator atau detail interaksi dengan elemen UI tidak diekspos langsung di test case.
○ Semua detail teknis disembunyikan di dalam Page Object Class (misalnya LoginPage), sehingga test case tetap bersih dan fokus pada logika bisnis.
- Inheritance:
○ Framework biasanya memiliki BaseTest class yang mengatur pengaturan WebDriver, laporan (reporting), dan hook untuk setup/teardown.
○ Semua test class (LoginTest, CheckoutTest) cukup mewarisi (extends) BaseTest agar tidak perlu menulis ulang konfigurasi setiap kali.
- Polymorphism:
○ Membuat framework fleksibel dengan interface dan implementasi berbeda. Misalnya, metode pembayaran PaymentStrategy bisa memiliki implementasi CreditCardPayment, BankTransferPayment, dan EWalletPayment.
○ Test dapat menggunakan strategi pembayaran apapun tanpa mengubah struktur test case.
- Abstraction:
○ Lapisan abstraction menyembunyikan kompleksitas Selenium/WebDriver. Misalnya, QA hanya menulis productPage.addToCart("T-shirt"), tanpa tahu detail locator mana yang diklik di belakang layar.
○ Abstraction juga membantu memisahkan lapisan business logic dari detail teknis.
⬛ Contoh Penerapan OOP dalam Framework E-Commerce
Misalkan kita memiliki e-commerce. Test automation kita akan sering berinteraksi dengan fitur login, pencarian produk, menambahkan produk ke keranjang, hingga pembayaran. Dengan OOP:
● Encapsulation memastikan setiap aksi seperti login() atau addToCart() dibungkus dalam class halaman masing-masing.
● Inheritance memungkinkan CheckoutTest menggunakan pengaturan driver dan data dari BaseTest.
● Polymorphism dapat digunakan untuk menguji berbagai metode pembayaran dengan satu antarmuka umum.
● Abstraction memisahkan detail teknis seperti locator Selenium dari test case utama, sehingga test lebih mirip dokumen skenario bisnis daripada kode teknis.
⬛ Manfaat Nyata dari Pendekatan OOP
- Reusability (Kode Dapat Digunakan Ulang)
QA cukup menulis loginPage.login("user", "pass") di banyak test, bukan menulis ulang langkah login. - Maintainability (Mudah Dirawat)
Jika ID tombol “Login” diubah oleh developer, QA hanya perlu memperbarui 1 locator di LoginPage, bukan ratusan test script. - Scalability (Mudah Berkembang)
Ingin menambahkan metode pembayaran baru (misalnya QRIS)? Tinggal tambahkan QrisPayment sebagai implementasi PaymentStrategy tanpa memodifikasi test case yang sudah ada. - Readability (Mudah Dibaca)
Test case lebih mirip instruksi manusia:
loginPage.login("user@mail.com", "password"); |
⬛ Bagaimana QA Mulai Menggunakan OOP?
- Gunakan BaseTest untuk setup driver Selenium dan reporting.
- Gunakan utilities untuk fungsi umum (misalnya WaitHelper, ScreenshotUtil).
- Jika sudah mahir, pisahkan locator dan aksi di file berbeda (mulai dengan Page Object) dan gunakan konsep interface dan polymorphism untuk mendukung test yang dinamis (misalnya strategi pembayaran atau metode login).
⬛ Prinsip-prinsip OOP yang diterapkan dalam test automation framework:
● Class dan Object
○ Setiap halaman web direpresentasikan sebagai sebuah class.
○ Objek dari class tersebut digunakan dalam test case.
Contoh: LoginPage loginPage = new LoginPage(driver);
● Encapsulation
○ Locator dan logika aksi (seperti klik, input) tidak ditulis langsung di test case, tetapi dibungkus dalam method.
○ Contoh: loginPage.enterUsername("user"), maka akan menyembunyikan detail driver.findElement(By.id("username")).
● Inheritance
BaseTest mengandung inisialisasi driver, logger, dan teardown. Semua test class mewarisi ini.
Contoh:
public class BaseTest { |
● Polymorphism
○ Interface PaymentMethod memiliki berbagai implementasi: CreditCardPayment, GopayPayment, BankTransferPayment.
○ Dapat ditukar-tukar tanpa ubah struktur test case.
Contoh:
PaymentMethod payment = new GopayPayment(); |
● Abstraction
○ Test case hanya melihat method-level interaction (misalnya addToCart()), bukan detail element.
○ Test menjadi fokus pada apa yang diuji, bukan bagaimana caranya.
⬛ Studi Kasus
Sebuah tim QA di perusahaan digital sedang menyusun fondasi awal untuk automated test framework menggunakan bahasa Java. Tujuannya adalah membuat struktur yang terorganisir, reusable, dan scalable. Meskipun belum menggunakan Selenium atau library testing lainnya, tim mulai merancang pondasi framework dengan pendekatan Object-Oriented Programming (OOP).
Struktur Class Java
1. BaseTest.java
Tujuan: Menyediakan struktur dasar untuk setup dan teardown yang bisa diwarisi oleh test lain.
Konsep OOP: Inheritance
public class BaseTest { |
2. TestData.java
Tujuan: Mengelola data yang diperlukan untuk test.
Konsep OOP: Encapsulation
public class TestData { |
3. LoginService.java
Tujuan: Mensimulasikan proses login sebagai bagian dari business logic.
Konsep OOP: Abstraction
public class LoginService { |
4. LoginTest.java
Tujuan: Melakukan test untuk proses login dengan menggunakan komponen yang sudah dipisah.
Konsep OOP: Inheritance (dari BaseTest), Composition (menggunakan LoginService dan TestData)
public class LoginTest extends BaseTest { |
⬛ Penjelasan Prinsip OOP yang Diterapkan
Pilar OOP |
Contoh Implementasi |
Encapsulation |
TestData menyembunyikan data user dan hanya menyediakan akses lewat getter. |
Abstraction |
LoginService menyembunyikan logika otentikasi agar test tidak perlu tahu detail. |
Inheritance |
LoginTest mewarisi setup() dan teardown() dari BaseTest. |
Polymorphism |
Belum diterapkan, bisa dikembangkan nanti (misalnya dengan strategi login berbeda). |