Обеспечение качества функционирования компьютерных систем · работа 3/5

Тестирование: методы «чёрного» и «белого ящика»

Граничные значения, тест-кейсы, покрытие ветвей и баг-репорты. Сначала изучите теорию и интерактивные модели, затем выполните три практических задания и тест внизу страницы. Всё сохраняется в этом браузере автоматически.

Теория → практика → тест → PDF15 проверяемых вопросов3 практических задания3 развёрнутых ответаРаботает без интернета
Изучить теориюПерейти к тестуИсточники
01

Тестирование как управляемый эксперимент

Тест — это не произвольный набор нажатий. У хорошего теста есть исходное состояние, входные данные, действие, ожидаемый результат и фактический результат. Проверку можно повторить, а дефект — воспроизвести.

Функция «Кампуса»

Преподаватель вводит итоговый балл студента от 0 до 100. API принимает целое число включительно в диапазоне 0…100, сохраняет его, а при неверном типе или значении возвращает ошибку валидации без записи в БД. Отправка требует роль teacher.

ТребованиеДопустимы целые 0…100
→
Тестовые данные−1, 0, 1, 99, 100, 101
→
ВыполнениеВызов API
→
СравнениеОжидалось / получили
Учебная схема: последовательность показана упрощённо.

Оракул тестирования — источник, позволяющий определить ожидаемый результат. Здесь это явно заданное правило балла и контроля доступа, а не субъективное впечатление от интерфейса.

02

Уровни и виды проверок

УровеньЧто проверяемПример
МодульныйМаленькую функцию изолированноvalidate_score(101) возвращает ошибку
ИнтеграционныйСвязь компонентовAPI передаёт значение в БД
СистемныйСистему целикомПреподаватель выставляет оценку в интерфейсе
ПриёмочныйГотовность к бизнес-задачеМетодист проверяет сценарий ведомости

Функциональные проверки исследуют бизнес-правила. Нефункциональные — свойства вроде задержек, устойчивости и безопасности. Регрессионное тестирование повторно проверяет, не сломали ли изменения ранее работавшие функции. Smoke-проверка быстро выявляет блокирующие проблемы в новой сборке; она не заменяет полный регресс.

Пирамида тестирования полезна как идея соотношения быстрых и более дорогих проверок. Это не обязательное фиксированное число тестов каждого уровня.
03

«Чёрный ящик»: классы эквивалентности и границы

При тестировании «чёрным ящиком» мы отталкиваемся от спецификации, не зная внутреннего кода. Для оценки 0…100 можно выделить класс корректных значений, значения меньше нуля, больше ста, дробные числа, строки и отсутствие значения.

Класс входаПримерОжидаемое поведение
Нижняя граница0Принять
Ниже границы−1Отклонить
Внутри допустимого57Принять
Верхняя граница100Принять
Выше границы101Отклонить
Неправильный тип"отлично"Отклонить
Отсутствует значениеnullОтклонить

🧪 Интерактив: проверка граничных значений

Введите значение так, как оно пришло бы в текстовом поле формы. Учебный валидатор принимает только запись неотрицательного целого числа от 0 до 100 без пробелов и без ведущих нулей (кроме «0»). Дополнительное правило записи введено специально для этого упражнения; у реального API его нужно согласовать.

Правило для строки и правило для JSON-числа — разные уровни системы: реальная серверная схема может разобрать данные иначе. Всегда фиксируйте формат запроса в тест-кейсе.

04

«Белый ящик»: ветви и покрытие

При тестировании «белым ящиком» мы видим внутреннюю структуру. Например, функция сначала проверяет тип, потом диапазон, затем роль. Проверка ветвей требует тестов, при которых каждое решение принимает разные исходы. Покрытие кода не означает отсутствие дефектов — оно лишь показывает, какие элементы были исполнены.

def can_save(score, role): if type(score) is not int: # ветвление 1 return False if score < 0 or score > 100: # ветвление 2 return False if role != "teacher": # ветвление 3 return False return True

Чтобы проверить обе стороны каждого решения, нужны входы: строка вместо числа, целое вне диапазона, корректное число с ролью student и корректное число с ролью teacher. Это учебная функция: bool в Python не принимается из-за строгой проверки type(score) is int.

Тип?int → дальше; иначе отказ
→
Диапазон?0…100 → дальше; иначе отказ
→
Роль?teacher → успех; иначе отказ
Учебная схема: последовательность показана упрощённо.

Покрытие строк, ветвей и условий — разные метрики. Не используйте их как взаимозаменяемые.

05

Оформление тест-кейса и баг-репорта

Поле тест-кейсаПример
IDSCORE-006
ПредусловияПользователь вошёл с ролью teacher
ШагиОтправить POST /scores с score=101
Ожидаемый результатОтвет 4xx по контракту; запись в БД не изменена
Фактический результатЗаполняется после выполнения
СтатусPassed / Failed / Blocked

В баг-репорте полезны заголовок, окружение, шаги воспроизведения, ожидаемый/фактический результат, степень серьёзности и подтверждение. Severity описывает масштаб влияния дефекта, priority — срочность исправления; они могут различаться.

Образец дефекта

Заголовок: При балле 101 сервис сохраняет запись вместо ошибки.
Условия: версия 1.4.2, учебная БД, роль teacher.
Шаги: открыть форму → ввести 101 → сохранить.
Ожидалось: сообщение о неверном диапазоне, запись без изменений.
Фактически: значение 101 сохранено.

Коды 400, 422 и другие зависят от API-контракта. В тесте не следует произвольно требовать конкретный код, если его не определили заранее.

06

Таблица решений: когда одного диапазона недостаточно

Поле score должно находиться в диапазоне, но этого мало: сохранить оценку может только авторизованный преподаватель. Для сочетания условий удобна таблица решений. Она показывает, какие комбинации дают разрешение и отказ.

РольБаллТокенОжидаемый итог
teacher80действителенПринять и сохранить
student80действителенЗапретить запись
teacher101действителенОтклонить неверный балл
teacher80отсутствуетНе допустить неавторизованную запись

Негативный тест должен проверять не только код HTTP-ответа, но и отсутствие побочного эффекта: отвергнутый запрос не меняет БД. Для этого до запроса фиксируют значение, выполняют действие, затем повторно читают запись в тестовом окружении.

Один и тот же запрос может формально вернуть 403, но ошибочно изменить данные перед ответом — такая реализация будет дефектной. Хороший тест проверяет контракт и состояние.

07

Нефункциональные испытания: нагрузка и защита

Даже корректная функция может стать бесполезной при массовом использовании. Нагрузочное тестирование измеряет поведение при ожидаемой интенсивности, стресс-тестирование исследует выход за обычные пределы, а длительные испытания помогают обнаруживать деградацию во времени.

Сценарий100 пользователей загружают оценки
→
НагрузкаИнтенсивность и длительность
→
Наблюдениеp95, ошибки, очередь БД
→
ОценкаСравнение с порогами
Учебная схема: последовательность показана упрощённо.

Проверки безопасности не ограничиваются правильностью пароля. В «Кампусе» важно проверить, что студент не может изменить оценку другого пользователя, даже если подставит чужой идентификатор в URL. Нужны безопасные тестовые учётные записи и специально подготовленная среда.

Нагрузочные и защитные испытания могут создавать значительный трафик или изменять данные. Выполняйте их только в согласованной тестовой инфраструктуре и с разрешением владельца.
08

Автоматизация тестов и борьба с нестабильностью

Автоматизация нужна там, где проверки повторяют часто и результат можно сопоставить с правилом. Для учебного валидатора можно написать несколько параметризованных тестов. Они должны выполняться быстро, независимо и давать понятное сообщение при ошибке.

# Идея параметризованных тестов (Python + pytest) import pytest @pytest.mark.parametrize("score,expected", [ (0, True), (57, True), (100, True), (-1, False), (101, False), ]) def test_score_range(score, expected): assert valid_score(score) is expected

Здесь функция valid_score специально не реализована: студент должен сопоставить спецификацию с тем, как её проверять. Для настоящего тестирования потребуется функция проекта, а не копирование фрагмента без окружения.

Flaky test — тест с нестабильным результатом без соответствующего изменения проверяемого поведения. Причинами могут быть гонки, зависимость от времени, общая БД или непредсказуемая сеть. Систематическое исправление таких тестов важнее, чем бесконечные перезапуски до «зелёного» статуса.

09

Практика: тестирование оценки в «Кампусе»

Задание 1. Составьте набор тест-кейсов

  1. Опишите минимум восемь тестов с ID, входом и ожидаемым результатом.
  2. Включите обе границы, один обычный валидный вход, два внешних значения, некорректный тип, отсутствие значения и роль student.
  3. Подчеркните, какие тесты проверяют границы, а какие — классы эквивалентности.

Задание 2. Добейтесь покрытия ветвей

  1. Для функции can_save() из теории укажите минимальный разумный набор входных пар score/role, покрывающий обе стороны каждого if.
  2. Для каждого входа запишите пройденные решения и возвращаемое значение.
  3. Объясните, почему даже такое покрытие не гарантирует корректности всех случаев.

Задание 3. Оформите баг-репорт

  1. Представьте: пользователь с ролью student смог отправить корректный балл 80, и сервер его сохранил.
  2. Напишите заголовок, предусловия, шаги, ожидаемый и фактический результаты.
  3. Оцените серьёзность и обоснуйте, какие проверки стоит добавить в регресс.
Часть II · проверка знаний

Тест по изученному материалу

Выберите один ответ в каждом вопросе и нажмите «Проверить тест». После проверки появятся разборы. Практические задания и развёрнутые вопросы проверяет преподаватель — в процентах они не учитываются.

0 ответовПовторная попытка разрешена

Часть A. Выберите правильный ответ

Часть Б. Объясните своими словами

Эти вопросы оценивает преподаватель. Не копируйте определения: приведите собственный аргумент и, где необходимо, расчёт или пример.

Источники для дополнительного изучения

Теоретические сведения адаптированы для обучения. Интерактивные расчёты и сценарии — учебные модели, не измерения работающей инфраструктуры. Внешние ссылки нужны только для дополнительного чтения: сама работа открывается без интернета.

  1. ISTQB Glossary · Black-box test technique
  2. ISTQB Glossary · White-box test technique
  3. OWASP · Web Security Testing Guide

Перед сдачей

✓ Заполнены ФИО, группа и дата.
✓ Выполнены три практических задания.
✓ Выбраны и проверены ответы на 15 тестовых вопросов.
✓ Записаны три развёрнутых ответа.

Нажмите «Отправить работу — сохранить PDF» и в диалоге печати выберите «Сохранить как PDF». В PDF попадут ФИО, ответы, результат тестирования и задания. Никакие данные не отправляются на сервер.