Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Проверка обязательности заполнения поля: методы и подходы
Обязательность заполнения поля (required field validation) — один из фундаментальных аспектов тестирования пользовательских интерфейсов и бизнес-логики приложений. Проверка выполняется на разных уровнях: от UI до базы данных, и требует комплексного подхода.
1. Уровни проверки обязательности
A. UI-уровень (Фронтенд)
Проверка визуальных подсказок и поведения интерфейса:
- Визуальные маркеры: Наличие звездочки (*), подписи "Обязательно" или выделения цветом.
- Валидация в реальном времени: Сообщение об ошибке появляется при попытке уйти с пустого поля (onBlur) или после начала ввода (onChange).
- Блокировка отправки: Кнопка "Отправить" неактивна, пока обязательные поля не заполнены.
Пример тест-кейса на UI:
Feature: Валидация обязательного поля "Email"
Scenario: Попытка отправки формы с пустым обязательным полем
Given Я нахожусь на странице регистрации
When Я оставляю поле "Email" пустым
And Я нажимаю кнопку "Зарегистрироваться"
Then Я вижу сообщение об ошибке "Поле обязательно для заполнения"
And Сообщение выделено красным цветом
And Данные формы не отправляются на сервер
B. API-уровень (Бэкенд)
Наиболее критичная проверка, такова как клиентскую валидацию можно обойти.
- Отправка запроса с пустым значением (
null,"") и ожидание:
* HTTP статус `400` (Bad Request) или `422` (Unprocessable Entity).
* Четкого сообщения об ошибке в теле ответа.
- Отправка запроса с полностью отсутствующим ключом поля в JSON/XML.
- Проверка разных граничных значений: пробелы, табуляции (часто требуют трима).
Пример теста API на Python (pytest + requests):
import pytest
import requests
def test_required_email_field_validation():
url = "https://api.example.com/v1/users"
headers = {"Content-Type": "application/json"}
# 1. Тело запроса с пустым email
payload_empty = {"email": "", "name": "John Doe"}
response_empty = requests.post(url, json=payload_empty, headers=headers)
assert response_empty.status_code == 422
assert "required" in response_empty.json().get("errors", {}).get("email", "").lower()
# 2. Тело запроса без ключа email
payload_missing = {"name": "John Doe"}
response_missing = requests.post(url, json=payload_missing, headers=headers)
assert response_missing.status_code == 422
assert "email" in response_missing.json().get("errors", {})
# 3. Положительный контроль - валидный запрос
payload_valid = {"email": "test@example.com", "name": "John Doe"}
response_valid = requests.post(url, json=payload_valid, headers=headers)
assert response_valid.status_code in [200, 201]
C. Уровень базы данных
Проверка, что на уровне СУБД существуют соответствующие ограничения:
NOT NULLограничение для обязательных полей.- Проверка через прямые запросы или миграции БД.
Пример SQL-проверки:
-- Проверка структуры таблицы (на примере PostgreSQL)
SELECT column_name, is_nullable
FROM information_schema.columns
WHERE table_name = 'users'
AND column_name = 'email';
-- Ожидаемый результат: is_nullable = 'NO'
2. Стратегия и сценарии тестирования
Положительные сценарии:
- Заполнение поля валидными данными -> форма отправляется.
- Заполнение поля с ведущими/закрывающими пробелами (с учетом трима).
Отрицательные сценарии:
- Пустое значение:
"". - Только пробелы/табуляции.
- Значение
null(для API). - Удаление значения после заполнения.
- Копирование-вставка пробела.
- Отправка формы через горячие клавиши (например, Enter), минуя UI-валидацию.
3. Ключевые аспекты для проверки
- Консистентность: Сообщения об ошибке должны быть единообразны для всех обязательных полей.
- Доступность: Сообщения должны быть доступны для скринридеров (ARIA-атрибуты).
- Локализация: Проверка перевода сообщений об ошибке на все поддерживаемые языки.
- Зависимая обязательность: Когда поле становится обязательным только при определенных условиях (например, выбор "Другое" в выпадающем списке).
- Восстановление после ошибки: После заполнения поля сообщение об ошибке должно исчезать.
4. Автоматизация проверок
Для комплексной проверки создают параметризованные тесты:
// Пример на Playwright (Node.js)
const { test, expect } = require('@playwright/test');
const requiredFields = ['email', 'phone', 'name'];
requiredFields.forEach(fieldName => {
test(`Валидация обязательного поля ${fieldName}`, async ({ page }) => {
await page.goto('/registration');
// Заполняем все поля кроме тестируемого
for (const field of requiredFields) {
if (field !== fieldName) {
await page.fill(`[name="${field}"]`, `valid_${field}@test.com`);
}
}
await page.click('button[type="submit"]');
// Проверяем сообщение об ошибке для конкретного поля
const errorLocator = page.locator(`[data-error-for="${fieldName}"]`);
await expect(errorLocator).toBeVisible();
await expect(errorLocator).toContainText('обязательно');
});
});
Итог: Проверка обязательности поля — это не просто "оставить поле пустым и нажать Отправить". Это многоуровневая стратегия, охватывающая UI, бизнес-логику (API) и хранение данных (БД). Наиболее важны серверные проверки, так как они являются последней линией защиты целостности данных. Все найденные дефекты должны классифицироваться по критичности: обход клиентской валидации — серьезнее, чем отсутствие звездочки у поля.