Тестирование API — критически важный процесс для обеспечения надежности веб-сервисов. Рассмотрим два основных подхода: с помощью Postman (GUI) и средствами PHP (код).
// Вкладка Tests в Postman
pm.test("Status code is 200", function() {
pm.response.to.have.status(200);
});
pm.test("Response time is acceptable", function() {
pm.expect(pm.response.responseTime).to.be.below(300);
});
pm.test("Response has valid JSON", function() {
pm.response.to.be.json;
pm.response.to.not.have.jsonBody("error");
});
Цепочки запросов: Сохранение данных из ответа в переменные
const jsonData = pm.response.json();
pm.collectionVariables.set("auth_token", jsonData.token);
Контрактное тестирование: Проверка структуры ответа
pm.test("Schema validation", function() {
const schema = {
type: "object",
properties: {
id: {type: "number"},
name: {type: "string"}
},
required: ["id", "name"]
};
pm.response.to.have.jsonSchema(schema);
});
PHPUnit + Guzzle: Интеграционное тестирование
use PHPUnit\Framework\TestCase;
use GuzzleHttp\Client;
class ApiTest extends TestCase
{
private Client $client;
protected function setUp(): void
{
$this->client = new Client(['base_uri' => 'https://api.example.com']);
}
public function testGetUser(): void
{
$response = $this->client->get('/users/1');
$this->assertEquals(200, $response->getStatusCode());
$data = json_decode($response->getBody(), true);
$this->assertArrayHasKey('id', $data);
$this->assertEquals(1, $data['id']);
}
}
Laravel HTTP Tests (для Laravel приложений):
public function testApiAuth()
{
$response = $this->postJson('/api/login', [
'email' => 'test@example.com',
'password' => 'password'
]);
$response
->assertStatus(200)
->assertJsonStructure([
'token',
'user' => [
'id',
'name',
'email'
]
]);
}
Symfony HttpClient (для Symfony):
public function testApiEndpoint(): void
{
$client = self::createClient();
$client->request('GET', '/api/products');
$this->assertResponseIsSuccessful();
$this->assertJsonContains(['@type' => 'ProductCollection']);
}
Критерий | Postman | PHP-тестирование |
---|---|---|
Скорость написания | Быстрее | Требует больше кода |
Поддержка CI/CD | Через Newman CLI | Нативная интеграция |
Сложность проверок | Ограничена JS | Полная мощь PHP |
Переиспользование | Коллекции и окружения | Классы и трейты |
Дебаггинг | Визуальный интерфейс | Xdebug и логи |
Изоляция тестов:
Проверяйте:
Тестируйте edge cases:
public function testProductLifecycle(): void
{
// 1. Создание продукта
$createResponse = $this->postJson('/api/products', [
'name' => 'Test Product',
'price' => 99.99
]);
$createResponse->assertCreated();
$productId = $createResponse->json('id');
// 2. Получение продукта
$getResponse = $this->getJson("/api/products/{$productId}");
$getResponse
->assertOk()
->assertJsonPath('name', 'Test Product');
// 3. Обновление продукта
$this->putJson("/api/products/{$productId}", ['price' => 129.99])
->assertNoContent();
// 4. Удаление продукта
$this->delete("/api/products/{$productId}")
->assertNoContent();
// 5. Проверка удаления
$this->getJson("/api/products/{$productId}")
->assertNotFound();
}
Postman идеален для быстрого тестирования и документирования API, тогда как PHP-подход дает больше гибкости и лучше интегрируется в CI/CD. Для профессиональной разработки рекомендуется комбинировать оба метода: Postman для smoke-тестов и ручных проверок, PHP-тесты — для автоматизированного регрессионного тестирования.