API testing in TestFly
TestFly ships with its own fluent HTTP client, so API tests need no third-party dependency.
API-only tests with BaseApiTest
To test an API without launching a browser, extend BaseApiTest:
package io.testfly.examples.api;
import io.testfly.test.BaseApiTest;
import io.testfly.client.ApiClient;
import io.testfly.client.ApiResponse;
import org.testng.annotations.Test;
public class UserApiTest extends BaseApiTest {
@Test
public void getUserAndValidateSchema() {
ApiResponse res = ApiClient.get("/api/users/1")
.header("Accept", "application/json")
.send()
.assertStatus(200)
.assertJson("$.name", "Hakan Gül")
.assertSchema("schemas/user.json");
}
}
Hybrid UI + API tests with apiClient()
Inside a BaseTest, call apiClient() to seed data through the API before the browser opens. The test below creates an order with one POST request and then opens the order page directly.
package io.testfly.examples.tests;
import io.testfly.test.BaseTest;
import io.testfly.client.ApiResponse;
import org.openqa.selenium.By;
import org.testng.Assert;
import org.testng.annotations.Test;
import java.util.Map;
public class OrderCheckoutTest extends BaseTest {
@Test
public void fastOrderVerification() {
// 1. Create order instantly via API (100ms)
ApiResponse order = apiClient().post("/api/orders")
.body(Map.of("itemId", "SKU-100", "quantity", 1))
.send()
.assertStatus(201);
String orderId = order.json("$.orderId");
// 2. Open browser directly to the order page
open("/orders/" + orderId);
Assert.assertEquals(getText(By.id("order-status")), "Confirmed");
}
}
TestFly logs every API request to the step timeline automatically.
