Berikut adalah dokumentasi untuk template “Katalon Professional Foundation”, yaitu template siap pakai yang didalamnya termasuk:
✓ Folder rapih, siap scale
✓ Profiles: SIT / UAT / Prod
✓ Test Data: CSV & Excel
✓ Parameterized Objects
✓ Custom Keywords
✓ Test Suites siap run
✓ Readable reporting ready di export ke HTML/PDF
Untuk cek template-nya, silahkan klik disini.
Login
Login Test Case
Disediakan 10 Test Case – positif dan negatif case untuk Login, dan mengikuti Test Scenario sebagai berikut:
| TC ID | Case Type | Test Scenario Title | Expected Result |
| Login001 | Positive | Login dengan credential valid | Berhasil login dan redirect ke halaman |
| Login002 | Negative | Login dengan email dikosongkan | System memberikan validasi field perlu diisi |
| Login003 | Negative | Login dengan password dikosongkan | System memberikan validasi field perlu diisi |
| Login004 | Negative | Login dengan email dan password dikosongkan | System memberikan validasi field perlu diisi |
| Login005 | Negative | Login dengan email tidak terdaftar | System memberikan validasi credential invalid |
| Login006 | Negative | Login dengan format email invalid | System memberikan validasi format email salah |
| Login007 | Negative | Login dengan password invalid | System memberikan validasi credential invalid |
| Login008 | Negative | Login dengan email dan password invalid | System memberikan validasi credential invalid |
| Login009 | Positive | Login menggunakan test data CSV | Sesuai expected result (status) dari setiap baris data |
| Login010 | Positive | Login menggunakan test data EXCEL | Sesuai expected result (status) dari setiap baris data |
Setiap Test Case mengikuti struktur sebagai berikut:
- Persiapan data test
- Open & maximize browser
- Panggil Custom Keyword Login
- Verifikasi expected result
- Panggil Custom Keyword takeScreenshotWithText(), dengan parameter:
- String fileName -> nama file screenshot. Jika file berada di dalam folder, folder harus exist
- String text -> text di dalam screenshot
- int positionX -> posisi X untuk text di screenshot. Posisi X=0 berada di kiri atas halaman. X++ ke kanan
- int positionY -> posisi Y untuk text di screenshot. Posisi Y=0 berada di kiri atas halaman. Y++ ke bawah
- int fontSize -> font size untuk text di screenshot
- String textColor -> color code untuk text di screenshot, contohnya “#FF0000” = merah
- Tutup browser
Login Methods / Keywords
@Keyword
def login(String email, String password) {
KeywordUtil.logInfo('Proses login...')
WebUI.setText(findTestObject('Login Page/Login Section/txt_email'), email)
WebUI.setText(findTestObject('Login Page/Login Section/txt_password'), password)
WebUI.click(findTestObject('Login Page/Login Section/btn_login'))
}
Keyword “Login” digunakan untuk mesimplifikasi proses login. Di dalam Test Case langsung dipanggil keyword ini untuk Login. Tujuan mensimplifikasi proses Login adalah agar terlihat lebih rapi dalam report.
@Keyword
def useTestDataToLoginAndVerify(String TestDataName, int columnEmail, int columnPassword, int columnStatus) {
...
}
Keyword “useTestDataToLoginAndVerify” digunakan untuk mengakses Data Test dan melakukan looping untuk semua data credential yang ada di dalam Data Test. Pada template ini, Data Test yang digunakan bernama “loginCredentialsData-CSV” atau “loginCredentialsData-EXCEL”.
@Keyword
def verifyUserIsLoggedIn() {
WebUI.waitForPageLoad(10)
WebUI.verifyElementPresent(findTestObject('Dashboard Page/lbl_loggedInAs'), 2)
}
def Logout() {
WebUI.click(findTestObject('Dashboard Page/lbl_logout'))
WebUI.waitForPageLoad(10)
}
Keyword “verifyUserIsLoggedIn()” digunakan untuk verifikasi apakah sudah sudah login atau belum. Verifikasi dilakukan dengan mendeteksi (menggunakan method WebUI.verifyElementPresent()) object “lbl_loggedInAs”.
Keyword “Logout()” digunakan untuk mensimplifikasikan proses logout. Keyword ini tidak diberikan tag “@Keywords” karena tidak dipanggil di Test Case, melainkan hanya dipanggil dalam method “useTestDataToLoginAndVerify()”, agar setiap proses looping data credential dari CSV/ Excel tidak perlu open & close browser.
@Keyword
def verifyValidationIsPresentForInvalidCredential() {
...
}
Keyword “verifyValidationIsPresentForInvalidCredential()” digunakan di dalam negative Test Case, untuk memverifikasikan validasi jika credential invalid. Proses ini di simplifikasikan ke dalam method / keyword agar lebih mudah di baca di dalam report view.
Login Test Suite & Report View
Berikut contoh hasil running Test Suite, Report View dalam format HTML.


Script Test Case dibuat supaya menghasilkan report yang readable, dan disertakan screenshot dan text-nya.
Search Product
Search Product Test Case
Disediakan 10 Test Case – positif dan negatif case untuk Search product, dan mengikuti Test Scenario sebagai berikut:
| TC ID | Case Type | Test Scenario Title | Expected Result |
| SearchProduct001 | Positive | Search nama lengkap produk | Berhasil search produk |
| SearchProduct002 | Positive | Search separuh nama produk | Berhasil search produk |
| SearchProduct003 | Negative | Search tanpa huruf besar | Berhasil search produk |
| SearchProduct004 | Negative | Search dengan semua huruf besar | Berhasil search produk |
| SearchProduct005 | Negative | Search nama produk diawali dengan spasi | Gagal search produk |
| SearchProduct006 | Negative | Search nama produk diakhiri dengan spasi | Berhasil search produk |
| SearchProduct007 | Negative | Search tanpa input | System menampilkan semua produk |
| SearchProduct008 | Negative | Search produk yang tidak exist | Gagal search produk |
| SearchProduct009 | Negative | Search lalu hapus dan search kembali | Berhasil search produk untuk kedua kalinya |
| SearchProduct010 | Negative | Search lalu klik produk untuk lihat detail produk | System akan redirect ke halaman detail produk |
Setiap Test Case mengikuti struktur sebagai berikut:
- Persiapan data test
- Open & maximize browser
- Panggil Custom Keyword Search Product
- Verifikasi expected result
- Panggil Custom Keyword takeScreenshotWithText()
- Tutup browser
Search Product Methods / Keywords
@Keyword
def searchProductName(String productName) {
WebUI.click(findTestObject('Product Page/txt_search'))
WebUI.setText(findTestObject('Product Page/txt_search'), productName)
WebUI.click(findTestObject('Product Page/btn_search'))
}
Keyword “searchProductName()” digunakan untuk mensimplifikasikan proses search produk dengan menggunakan parameter productName (nama produk). Proses ini di simplifikasikan ke dalam method / keyword agar lebih mudah di baca di dalam report view.
Search Product Objects
- btn_firstProduct_viewProductDetails
(//div[@class='product-image-wrapper'])[1]//li
XPath ini akan mengambil tombol “View Detail Product” pada product pertama yang muncul di dalam list

//div[@class='product-image-wrapper']
XPath ini mengarah kepada div setiap produk, dan ada 34 produk dalam halaman ini. Maka kita perlu mengambil div pertama (produk pertama), dengan menambahkan pada XPath sebelumnya, menjadi:
(//div[@class='product-image-wrapper'])[1]

Untuk mendapatkan tombol “View Product” yang berada di dalam div produk, XPath yang digunakan adalah:
(//div[@class='product-image-wrapper'])[1]//li

- btn_search
//button[@type='button' and @id='submit_search']
XPath ini mengarah kepada tombol Search di Search bar, yang di klik saat mencari produk.
- lbl_firstProduct_productName
((//div[@class='product-image-wrapper'])[1]//p)[1]

XPath ini mengarah kepada nama produk pertama. Berikut adalah contoh cara mengambil nama produk pertama dan memverifikasikannya:
String firstProductName = WebUI.getText(findTestObject('Product Page/lbl_firstProduct_productName'))
WebUI.verifyMatch(firstProductName, 'Blue Top', false)
- lbl_productByPosition_productName
((//div[@class='product-image-wrapper'])[${position}]//p)[1]
XPath ini adalah XPath dynamic. Saat memanggil object ini, kita harus memberikan value pada variable ${position}. Sebagai contoh, jika variable diberikan value = 2, maka XPath akan menjadi:
((//div[@class='product-image-wrapper'])[2]//p)[1]

Maka XPath akan mengarah ke nama produk kedua dari list produk. Jadi, kita dapat mengatur value “position” untuk mengarahkan ke nama produk sesuai dengan posisinya di dalam list.
Cara memanggil dynamic object di dalam Test Case adalah sebagai berikut:
String valuePosition = '2'
WebUI.verifyElementPresent(findTestObject('Product Page/lbl_productByPosition_productName', [('position') : valuePosition]), 5)
“(‘position’)” -> nama variable di dalam object
“valuePosition” -> nama variable yang berisikan value position
“5” -> adalah lama maximal timeout untuk verify elemen present
- lbl_productName
(//div[@class='product-image-wrapper']//p[contains(text(),'${productName}')])[1]
XPath lbl_productName juga merupakan dynamic object, yang mempunyai parameter ${productName}. Sebagai contoh, jika parameter ini diberikan value “Sleeveless Dress”, maka XPath akan mengarah ke produk “Sleeveless Dress” yang exist di dalam list produk.

Untuk memanggil dynamic object ini di dalam Test Case, bisa dengan cara:
WebUI.verifyElementPresent(findTestObject('Product Page/lbl_productName', [('productName'):productName]), 5)
- txt_Search
//input[@type='text' and @id='search_product']
XPath ini mengarah kepada textbox Search yang berada di halaman Produk.
Untuk mempelajari lebih dalam tentang Dynamic Object, bisa cek blog berikut: Mengambil Elemen Menggunakan XPath untuk Automation di Katalon Studio
Search Product Test Suite & Report View
Berikut contoh hasil running Test Suite, Report View dalam format HTML.


Test Data
Login dan Search Product menggunakan data ready-to-use yang disediakan di dalam folder Data Files. Terdapat 3 Test Data, yaitu:
- loginCredentialsData-CSV
- loginCredentialsData-EXCEL
- productNameData-EXCEL
Ketiga file ini digunakan di dalam Test Case Login dan Search Product. Tujuan menggunakan Test Data, adalah supaya data dapat di-manage dengan mudah tanpa harus mengakses Test Case dan mengubahnya satu persatu.
Contoh pemanggilan Test Data dalam Test Case Login:
String email_valid = findTestData(‘loginCredentialsData-EXCEL’).getValue(1,1)
Contoh pemanggilan Test Data dalam Test Case Search Product:
String productName = findTestData('productNameData-CSV').getValue('Product Name', 1)
Pada Test Case “Login”, value diambil dari kolom 1, dan baris 1.
Pada Test Case “Search Product”, value diambil dari kolom “Product Name”, dan baris 1.
Kolom bisa dipilih berdasarkan posisi kolom atau dengan nama kolom.

