Приведи примеры проверки на каждый уровень пирамиды тестирования
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Примеры проверок для каждого уровня пирамиды тестирования
Пирамида тестирования — это концепция, которая помогает распределить тестовые активности по уровням, чтобы оптимизировать ресурсы и обеспечить качество продукта. Она состоит из следующих уровней: UI-тесты, API-тесты (иногда называются сервисными) и Unit-тесты (модульные). Иногда добавляют уровни интеграционных и контрактных тестов. Каждый уровень имеет свои особенности и примеры проверок.
Unit-тесты (модульные)
Это самый нижний и самый широкий уровень пирамиды. Unit-тесты проверяют отдельные модули, функции или методы в изоляции от других частей системы. Они должны быть быстрыми, независимыми и покрывать основные логические пути. Примеры проверок:
- Проверка логики вычислений: Например, тестирование функции, которая вычисляет сумму двух чисел.
- Проверка обработки граничных значений: Тестирование функции с входными данными на краях допустимого диапазона (например, null, пустые строки, максимальные/минимальные числа).
- Проверка исключительных ситуаций: Тестирование того, как функция обрабатывает ошибки (например, деление на нуль).
Пример кода (Python)
import unittest
def add(a, b):
return a + b
class TestAddition(unittest.TestCase):
def test_add_positive_numbers(self):
self.assertEqual(add(2, 3), 5)
def test_add_negative_numbers(self):
self.assertEqual(add(-1, -4), -5)
def test_add_zero(self):
self.assertEqual(add(0, 5), 5)
if __name__ == '__main__':
unittest.main()
API-тесты (сервисные)
Это средний уровень пирамиды. API-тесты проверяют взаимодействие между компонентами системы через API (например, REST, GraphQL). Они не требуют UI и позволяют тестировать бизнес-логику и интеграцию сервисов. Примеры проверок:
- Проверка статусных кодов HTTP: Убедиться, что endpoint возвращает правильный код (200 для успеха, 400 для ошибки клиента, 500 для ошибки сервера).
- Проверка структуры и данных ответа: Убедиться, что JSON ответ содержит ожидаемые поля и значения.
- Проверка валидации входных данных: Тестирование обработки некорректных входных параметров (например, отправка строки вместо числа).
- Проверка авторизации и аутентификации: Тестирование endpoints, требующих токен или другие credentials.
Пример кода (JavaScript с использованием библиотеки axios и jest)
const axios = require('axios');
describe('API Tests for User Endpoint', () => {
const BASE_URL = 'https://api.example.com';
test('GET /users returns 200 and list of users', async () => {
const response = await axios.get(`${BASE_URL}/users`);
expect(response.status).toBe(200);
expect(response.data).toBeInstanceOf(Array);
expect(response.data[0]).toHaveProperty('id');
expect(response.data[0]).toHaveProperty('name');
});
test('POST /users with invalid data returns 400', async () => {
const invalidUserData = { name: '' }; // пустое имя
try {
await axios.post(`${BASE_URL}/users`, invalidUserData);
} catch (error) {
expect(error.response.status).toBe(400);
}
});
});
UI-тесты
Это самый верхний и самый узкий уровень пирамиды. UI-тесты проверяют взаимодействие пользователя с интерфейсом (браузером, мобильным приложением). Они часто самые медленные и хрупкие, поэтому их количество должно быть минимальным, но достаточным для проверки ключевых пользовательских сценариев. Примеры проверок:
- Проверка отображения элементов: Убедиться, что необходимые кнопки, поля ввода и текст присутствуют на странице.
- Проверка пользовательских потоков: Тестирование полного сценария, например, регистрации пользователя или оформления заказа.
- Проверка взаимодействия: Тестирование кликов, заполнения форм, отправки данных и реакции интерфейса.
- Проверка кросс-браузерной и кросс-платформенной совместимости: Убедиться, что UI работает в разных браузерах и на разных устройствах.
Пример кода (Java с использованием Selenium и TestNG)
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
public class LoginPageTest {
WebDriver driver;
@BeforeMethod
public void setUp() {
driver = new ChromeDriver();
driver.get("https://example.com/login");
}
@Test
public void testSuccessfulLogin() {
WebElement usernameField = driver.findElement(By.id("username"));
WebElement passwordField = driver.findElement(By.id("password"));
WebElement loginButton = driver.findElement(By.id("login-btn"));
usernameField.sendKeys("testuser");
passwordField.sendKeys("password123");
loginButton.click();
WebElement welcomeMessage = driver.findElement(By.id("welcome"));
Assert.assertEquals(welcomeMessage.getText(), "Welcome, testuser!");
}
@AfterMethod
public void tearDown() {
driver.quit();
}
}
Интеграционные тесты (часто рассматриваются как часть API-тестов или отдельный уровень)
Интеграционные тесты проверяют взаимодействие нескольких модулей или систем. Примеры проверок:
- Проверка взаимодействия между сервисами: Убедиться, что Service A корректно отправляет данные в Service B и получает ожидаемый ответ.
- Проверка работы с внешними системами: Тестирование интеграции с платежными системами, email-сервисами или базами данных.
Контрактные тесты (Contract Tests, часто относятся к микросервисным архитектурам)
Контрактные тесты проверяют, что взаимодействие между потребителем (client) и поставщиком (provider) API соответствует ожиданиям (контракту). Примеры проверок:
- Проверка схемы ответа: Убедиться, что provider возвращает данные в формате, ожидаемом consumer (например, определенный JSON Schema).
- Проверка обязательных полей: Убедиться, что в ответе присутствуют поля, необходимые для работы consumer.
Заключение
Пирамида тестирования помогает эффективно распределять тестовые усилия. Unit-тесты обеспечивают фундамент, API-тесты проверяют интеграцию и бизнес-логику, а UI-тесты фокусируются на конечном пользовательском опыте. Комбинация этих уровней позволяет достичь высокого качества продукта при оптимальном использовании ресурсов и времени. Автоматизация на каждом уровне с использованием соответствующих инструментов (например, JUnit для unit-тестов, REST Assured для API-тестов, Selenium для UI-тестов) является ключом к успешной реализации этой стратегии.