
Ketika kita memikirkan Selenium WebDriver, kita biasanya mengaitkannya dengan otomatisasi browser dan pengujian UI. Namun, Selenium juga bisa menjadi alat yang ampuh untuk pengujian API jika digunakan dengan benar. Tutorial ini akan memandu Anda melalui proses memanfaatkan kemampuan Selenium WebDriver untuk melakukan pengujian API, memberi Anda contoh praktis dan praktik terbaik.
Pengujian API (Application Programming Interface) melibatkan pengujian API aplikasi secara langsung, memverifikasi fungsionalitas, keandalan, kinerja, dan keamanannya. Meskipun ada alat khusus untuk pengujian API seperti Postman, REST Assured, atau SoapUI, Selenium WebDriver dapat menjadi tambahan yang berharga untuk toolkit pengujian API Anda, terutama ketika Anda ingin menggabungkan pengujian UI dan API dalam kerangka kerja yang sama.
Prasyarat
Sebelum menyelami pengujian API dengan Selenium WebDriver, pastikan Anda memiliki:
- Pengetahuan dasar tentang Selenium WebDriver
- Bahasa pemrograman pilihan Anda (Java, Python, C#, JavaScript)
- Selenium WebDriver yang disiapkan di lingkungan pengembangan Anda
- Pemahaman tentang REST/SOAP API
- Pengetahuan dasar tentang metode HTTP (GET, POST, PUT, DELETE)
Memahami Arsitektur
Arsitektur Selenium WebDriver membuatnya cocok untuk pengujian API melalui kemampuannya untuk:
- Mengirim permintaan HTTP secara langsung menggunakan pustaka bawaan atau eksternal
- Menangani respons dan memverifikasi data
- Berintegrasi dengan kerangka kerja pengujian yang ada
- Mengelola data dan lingkungan pengujian
Menyiapkan Lingkungan Anda
Mari kita siapkan lingkungan dasar untuk pengujian API dengan Selenium WebDriver:
Contoh Java
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class SeleniumApiTesting {
private WebDriver driver;
public void setUp() {
System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");
ChromeOptions options = new ChromeOptions();
options.addArguments("--headless"); // Headless mode for API testing
driver = new ChromeDriver(options);
}
public void tearDown() {
if (driver != null) {
driver.quit();
}
}
}
Contoh Python
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import requests
import json
def setup_driver():
chrome_options = Options()
chrome_options.add_argument("--headless") # Headless mode for API testing
driver = webdriver.Chrome(options=chrome_options)
return driver
def teardown_driver(driver):
if driver is not None:
driver.quit()
Pendekatan Pengujian API dengan Selenium WebDriver
1. Menggunakan Pustaka HTTP Asli
Pendekatan yang paling mudah adalah menggunakan pustaka HTTP asli bahasa pemrograman Anda bersama dengan Selenium WebDriver.
Contoh Java - Permintaan GET
public String performGetRequest(String endpoint) throws IOException {
URL url = new URL(endpoint);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
int responseCode = connection.getResponseCode();
System.out.println("GET Response Code: " + responseCode);
if (responseCode == HttpURLConnection.HTTP_OK) {
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String inputLine;
StringBuilder response = new StringBuilder();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
return response.toString();
} else {
return "GET request failed with response code: " + responseCode;
}
}
Contoh Python - Permintaan POST
def perform_post_request(endpoint, payload):
headers = {'Content-Type': 'application/json'}
response = requests.post(endpoint, data=json.dumps(payload), headers=headers)
print(f"POST Response Code: {response.status_code}")
if response.status_code == 200:
return response.json()
else:
return f"POST request failed with response code: {response.status_code}"
2. Menggunakan JavaScriptExecutor untuk Panggilan AJAX
Pendekatan lain adalah menggunakan JavaScriptExecutor Selenium untuk membuat panggilan AJAX langsung dari browser.
Contoh Java
import org.openqa.selenium.JavascriptExecutor;
public String performApiCallWithJsExecutor(String endpoint, String method, String payload) {
String script = String.format(
"var xhr = new XMLHttpRequest();" +
"xhr.open('%s', '%s', false);" +
"xhr.setRequestHeader('Content-Type', 'application/json');" +
"xhr.send('%s');" +
"return xhr.responseText;",
method, endpoint, payload
);
return (String) ((JavascriptExecutor) driver).executeScript(script);
}
Contoh Python
def perform_api_call_with_js_executor(driver, endpoint, method, payload):
script = f"""
var xhr = new XMLHttpRequest();
xhr.open('{method}', '{endpoint}', false);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.send('{payload}');
return xhr.responseText;
"""
return driver.execute_script(script)
3. Menyadap dan Memodifikasi Panggilan API
Selenium WebDriver dapat digunakan untuk menyadap dan memodifikasi panggilan API yang dibuat oleh aplikasi, terutama ketika dikombinasikan dengan alat proxy seperti BrowserMob Proxy.
Contoh Java dengan BrowserMob Proxy
import net.lightbody.bmp.BrowserMobProxy;
import net.lightbody.bmp.BrowserMobProxyServer;
import net.lightbody.bmp.client.ClientUtil;
import org.openqa.selenium.Proxy;
public void setupProxyForApiInterception() {
// Start the proxy
BrowserMobProxy proxy = new BrowserMobProxyServer();
proxy.start(0);
// Get the Selenium proxy object
Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy);
// Configure Chrome to use the proxy
ChromeOptions options = new ChromeOptions();
options.setCapability("proxy", seleniumProxy);
// Create the WebDriver instance
driver = new ChromeDriver(options);
// Add a request filter to intercept API calls
proxy.addRequestFilter((request, contents, messageInfo) -> {
if (request.getUri().contains("/api/")) {
System.out.println("Intercepted API call: " + request.getUri());
// Modify headers, parameters, or the request body if needed
}
return null;
});
// Add a response filter to inspect and modify API responses
proxy.addResponseFilter((response, contents, messageInfo) -> {
if (messageInfo.getOriginalRequest().getUri().contains("/api/")) {
String responseBody = contents.getTextContents();
System.out.println("API Response: " + responseBody);
// Modify the response if needed
}
});
}
Membangun Kerangka Kerja Pengujian API Lengkap
Mari kita buat kerangka kerja pengujian API yang lebih terstruktur menggunakan Selenium WebDriver:
Contoh Java
import org.json.JSONObject;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import java.io.IOException;
public class ApiTestFramework {
private WebDriver driver;
private final String BASE_URL = "<https://api.example.com>";
@BeforeClass
public void setUp() {
System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");
ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
driver = new ChromeDriver(options);
}
@Test
public void testGetUserEndpoint() throws IOException {
String endpoint = BASE_URL + "/api/users/1";
String response = performGetRequest(endpoint);
JSONObject jsonResponse = new JSONObject(response);
Assert.assertEquals(jsonResponse.getString("name"), "John Doe");
Assert.assertEquals(jsonResponse.getInt("id"), 1);
Assert.assertTrue(jsonResponse.has("email"));
}
@Test
public void testCreateUserEndpoint() throws IOException {
String endpoint = BASE_URL + "/api/users";
JSONObject payload = new JSONObject();
payload.put("name", "Jane Smith");
payload.put("email", "jane.smith@example.com");
String response = performPostRequest(endpoint, payload.toString());
JSONObject jsonResponse = new JSONObject(response);
Assert.assertTrue(jsonResponse.has("id"));
Assert.assertEquals(jsonResponse.getString("name"), "Jane Smith");
}
private String performGetRequest(String endpoint) throws IOException {
// Implementation from previous example
}
private String performPostRequest(String endpoint, String payload) throws IOException {
URL url = new URL(endpoint);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/json");
connection.setDoOutput(true);
// Write payload to connection
try (java.io.OutputStream os = connection.getOutputStream()) {
byte[] input = payload.getBytes("utf-8");
os.write(input, 0, input.length);
}
int responseCode = connection.getResponseCode();
System.out.println("POST Response Code: " + responseCode);
try (BufferedReader br = new BufferedReader(
new InputStreamReader(connection.getInputStream(), "utf-8"))) {
StringBuilder response = new StringBuilder();
String responseLine;
while ((responseLine = br.readLine()) != null) {
response.append(responseLine.trim());
}
return response.toString();
}
}
@AfterClass
public void tearDown() {
if (driver != null) {
driver.quit();
}
}
}
Contoh Python
import unittest
import json
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import requests
class ApiTestFramework(unittest.TestCase):
BASE_URL = "<https://api.example.com>"
def setUp(self):
chrome_options = Options()
chrome_options.add_argument("--headless")
self.driver = webdriver.Chrome(options=chrome_options)
def test_get_user_endpoint(self):
endpoint = self.BASE_URL + "/api/users/1"
response = self.perform_get_request(endpoint)
self.assertEqual(response['name'], "John Doe")
self.assertEqual(response['id'], 1)
self.assertIn('email', response)
def test_create_user_endpoint(self):
endpoint = self.BASE_URL + "/api/users"
payload = {
"name": "Jane Smith",
"email": "jane.smith@example.com"
}
response = self.perform_post_request(endpoint, payload)
self.assertIn('id', response)
self.assertEqual(response['name'], "Jane Smith")
def perform_get_request(self, endpoint):
response = requests.get(endpoint)
return response.json() if response.status_code == 200 else None
def perform_post_request(self, endpoint, payload):
headers = {'Content-Type': 'application/json'}
response = requests.post(endpoint, data=json.dumps(payload), headers=headers)
return response.json() if response.status_code in [200, 201] else None
def tearDown(self):
if self.driver:
self.driver.quit()
if __name__ == '__main__':
unittest.main()
Menggabungkan Pengujian UI dan API
Salah satu keuntungan terbesar menggunakan Selenium WebDriver untuk pengujian API adalah kemampuan untuk menggabungkan pengujian UI dan API dalam kerangka kerja yang sama:
@Test
public void testLoginAndVerifyUserDataAPI() throws IOException {
// UI part: Login through the UI
driver.get("<https://example.com/login>");
driver.findElement(By.id("username")).sendKeys("testuser");
driver.findElement(By.id("password")).sendKeys("password");
driver.findElement(By.id("loginButton")).click();
// Wait for login to complete
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
wait.until(ExpectedConditions.urlContains("/dashboard"));
// Extract authentication token from cookies or local storage
String authToken = (String) ((JavascriptExecutor) driver)
.executeScript("return localStorage.getItem('authToken');");
// API part: Use the token to make an authenticated API call
String endpoint = BASE_URL + "/api/user/profile";
URL url = new URL(endpoint);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setRequestProperty("Authorization", "Bearer " + authToken);
// Process and verify the API response
int responseCode = connection.getResponseCode();
Assert.assertEquals(responseCode, 200);
// Read and parse the response
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String response = in.lines().collect(Collectors.joining());
in.close();
JSONObject jsonResponse = new JSONObject(response);
// Verify that the API data matches what's displayed in the UI
String uiUsername = driver.findElement(By.id("profileUsername")).getText();
Assert.assertEquals(jsonResponse.getString("username"), uiUsername);
}
Praktik Terbaik untuk Pengujian API dengan Selenium WebDriver
- Gunakan Mode Tanpa Kepala: Saat melakukan pengujian API murni, jalankan Selenium dalam mode tanpa kepala untuk menghemat sumber daya.
- Pisahkan Pengujian API dan UI: Meskipun Anda dapat menggabungkannya, tetap pisahkan pengujian API dan UI secara logis.
- Manfaatkan Pustaka Assertion: Gunakan pustaka assertion komprehensif untuk memvalidasi respons API.
- Terapkan Penanganan Kesalahan: Tambahkan penanganan kesalahan yang tepat untuk kegagalan API.
- Catat Permintaan dan Respons API: Untuk tujuan debugging, catat semua interaksi API.
- Parameterkan Pengujian: Gunakan penyedia data atau pengujian berparameter untuk menguji berbagai skenario.
- Terapkan Penanganan Otentikasi: Buat metode yang dapat digunakan kembali untuk menangani otentikasi.
- Pertimbangkan Kinerja: Ketahui bahwa Selenium mungkin menambahkan overhead dibandingkan dengan alat pengujian API khusus.
Keterbatasan Penggunaan Selenium WebDriver untuk Pengujian API
- Overhead Kinerja: Selenium terutama dirancang untuk otomatisasi browser, jadi ia menambahkan overhead untuk pengujian API murni.
- Fitur Khusus API Terbatas: Alat pengujian API khusus menawarkan fitur yang lebih spesifik untuk pengujian API.
- Ketergantungan Browser: Bahkan dalam mode tanpa kepala, Selenium memerlukan browser, yang mungkin tidak diperlukan untuk pengujian API.
- Kompleksitas: Menyiapkan Selenium untuk pengujian API mungkin lebih kompleks daripada menggunakan alat pengujian API khusus.
Kapan Menggunakan Selenium WebDriver untuk Pengujian API
Selenium WebDriver paling cocok untuk pengujian API dalam skenario berikut:
- Ketika Anda sudah memiliki kerangka kerja pengujian UI berbasis Selenium dan ingin memperluasnya.
- Ketika Anda perlu menguji skenario yang melibatkan interaksi UI dan API.
- Ketika Anda perlu menguji API dalam konteks browser (seperti menguji panggilan API JavaScript).
- Ketika Anda ingin menyadap dan memodifikasi panggilan API yang dibuat oleh aplikasi.
Kesimpulan
Selenium WebDriver dapat menjadi alat serbaguna untuk pengujian API, terutama ketika diintegrasikan dengan kerangka kerja pengujian UI yang ada. Meskipun mungkin tidak menggantikan alat pengujian API khusus untuk kebutuhan pengujian API yang kompleks, ia menyediakan cara yang fleksibel untuk menggabungkan pengujian UI dan API dalam satu kerangka kerja.
Dengan memanfaatkan pendekatan dan contoh yang disediakan dalam tutorial ini, Anda dapat secara efektif menggunakan Selenium WebDriver untuk kebutuhan pengujian API Anda. Ingatlah untuk mempertimbangkan trade-off dan memilih alat yang tepat untuk kebutuhan pengujian spesifik Anda.
Baik Anda menguji REST API, layanan SOAP, atau endpoint GraphQL, Selenium WebDriver dapat membantu Anda membuat pengujian komprehensif yang memvalidasi UI aplikasi Anda dan fungsionalitas API yang mendasarinya.
Untuk kebutuhan pengujian API yang lebih canggih, Anda mungkin ingin mempertimbangkan untuk menggabungkan Selenium WebDriver dengan pustaka atau kerangka kerja pengujian API khusus seperti REST Assured (untuk Java) atau Requests (untuk Python) untuk mendapatkan yang terbaik dari kedua dunia.
Selamat menguji!