Как протестировать группу из трех радиокнопок (radio buttons)?

«Как протестировать группу из трех радиокнопок (radio buttons)?» — вопрос из категории Техники тест-дизайна, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Тестирование радиокнопок фокусируется на их основном свойстве — взаимном исключении выбора в рамках одной группы (name).

1. Проверка логики взаимного исключения (Наиболее важная):

  • При выборе одной кнопки другие в группе должны снимать выделение.
  • Должна быть возможность выбрать любую из трех.
  • Пример HTML-структуры для тестирования:
    <input type="radio" id="opt1" name="choice" value="A">
    <label for="opt1">Option A</label>
    <input type="radio" id="opt2" name="choice" value="B">
    <label for="opt2">Option B</label>
    <input type="radio" id="opt3" name="choice" value="C">
    <label for="opt3">Option C</label>

2. Проверка состояний:

  • Состояние по умолчанию: либо ни одна не выбрана, либо выбрана предопределенная (проверить атрибут checked).
  • Состояние после взаимодействия: выбранная кнопка имеет checked=true, остальные — false.

3. Функциональное и UI-тестирование:

  • Клик: по кнопке и по связанной текстовой метке (<label>).
  • Клавиатура: навигация с помощью Tab и выбор с помощью Space или Enter.
  • Визуальная обратная связь: изменение стиля для выбранного состояния.
  • Доступность: наличие aria-checked и связь aria-labelledby.

4. Интеграционное тестирование:

  • При отправке формы передается значение (value) выбранной кнопки.
  • Если выбор обязателен, попытка отправки без выбора должна вызывать валидационную ошибку.

5. Пример автотеста (Python + Selenium WebDriver):

def test_radio_button_group():
    driver.get("page_url")
    options = driver.find_elements(By.NAME, "choice")
    # Проверяем начальное состояние
    assert all(not opt.is_selected() for opt in options), "Изначально выбрана кнопка"
    # Последовательно выбираем каждую
    for i, option in enumerate(options):
        option.click()
        assert option.is_selected(), f"Опция {i} не выбрана после клика"
        # Проверяем, что выбрана только она
        selected_count = sum(1 for opt in options if opt.is_selected())
        assert selected_count == 1, "Выбрано более одной кнопки"