Лекция 4. Тестирование ПО
Цели и семь принципов тестирования, уровни и пирамида, функциональное и нефункциональное тестирование, чёрный, белый и серый ящик, процесс тестирования, требования, артефакты, тест-кейс.
Четвёртая лекция — про тестирование: зачем оно нужно, по каким принципам строится, на каких уровнях и какими методами проводится и какие документы после себя оставляет. Это теория к лабе по unit-тестам, а дальше — к лабе по CI/CD, где эти тесты будут запускаться автоматически на каждый push.
Конспект собран по записям студента. Всё, что помечено «Дополнение», на лекции не звучало: это примеры, пояснения и приёмы, которые пригодятся в лабах.
1. Что такое тестирование
Определение 1. Тестирование ПО — процесс проверки программы на соответствие требованиям.
Ключевое слово — требования. Тестировщик проверяет не «работает ли программа вообще», а делает ли она то, что от неё ожидают, и так, как ожидают. Если требований нет, непонятно, ошибка перед вами или так задумано.
В терминологии ISTQB это три разных слова. Ошибка (error, mistake) — действие человека: разработчик неверно понял требование. Дефект (defect, bug) — её след в коде или документе. Сбой (failure) — то, что видит пользователь, когда дефектный код выполняется. Дефект может годами лежать в коде и ни разу не привести к сбою, если до этой ветки никто не доходит.
2. Цели тестирования
- Оценить качество сопутствующих документов: требований, дизайна, кода.
- Убедиться в покрытии требований.
- Убедиться, что продукт завершён и работает так, как ожидает клиент.
- Предотвратить появление дефектов у пользователей.
- Найти ошибки.
- Дать клиенту и заказчику информацию о состоянии качества продукта.
- Уменьшить риск неадекватного ПО.
- Убедиться, что ПО соответствует требованиям государственных и юридических стандартов.
«Найти ошибки» — только одна цель из восьми. Тестирование отвечает на вопрос «насколько продукт готов», и отчёт «багов не найдено, вот что проверено» — тоже полезный результат.
3. Семь принципов тестирования
- Тестирование показывает наличие дефектов, но не их отсутствие. Сто пройденных тестов доказывают только, что эти сто сценариев работают.
- Исчерпывающее (exhaustive) тестирование невозможно. Даже у функции от двух 32-битных чисел вариантов входа. Поэтому тесты выбирают по рискам и приоритетам.
- Тестирование на ранних этапах экономит время и ресурсы. Ошибку в требованиях дешевле найти на ревью документа, чем после релиза.
- Дефекты скапливаются (defect clustering). Большая часть ошибок обычно сидит в небольшом числе модулей — туда и стоит направлять силы.
- Парадокс пестицида (pesticide paradox). Если повторять одни и те же тесты, со временем они перестают находить новые дефекты — как насекомые привыкают к пестициду. Тесты нужно пересматривать и дополнять.
- Тестирование зависит от контекста. Медицинское ПО и игру тестируют по-разному: разная цена ошибки, разные требования.
- Найти и исправить все ошибки — ещё не значит обеспечить качество. Безупречная программа, которая решает не ту задачу, пользователю не нужна.
Это семь принципов из программы сертификации тестировщиков ISTQB Foundation Level. Последний принцип там называется «заблуждение об отсутствии ошибок» (absence-of-errors fallacy).
4. Уровни тестирования
Уровни рисуют пирамидой: в основании — много быстрых проверок маленьких кусков, к вершине — всё меньше проверок всё более крупных частей системы.
4.1. Модульное тестирование
Определение 2. Модульное тестирование (unit testing, компонентное тестирование) — тестирование отдельно взятого программного модуля или функции.
- Самая ранняя стадия тестирования.
- Unit-тесты — всегда автоматические.
- Покрывают отдельные функции, методы или их совокупность.
- Часто используют заглушки.
- Запускаются при сборке или компиляции программы.
- Как правило, пишутся разработчиками.
Дополнение. Заглушка подменяет то, от чего тестируемый код зависит: базу данных, сеть, текущее время. Тогда тест проверяет только сам модуль, работает за миллисекунды и не падает из-за того, что упал соседний сервис.
Пример в стиле четвёртой лабы — тесты на unittest для модуля circle.py с функциями area(r) и perimeter(r):
import math
import unittest
from circle import area, perimeter
class CircleTest(unittest.TestCase):
def test_area_unit_radius(self):
self.assertAlmostEqual(area(1), math.pi)
def test_area_zero_radius(self):
self.assertEqual(area(0), 0)
def test_area_grows_as_square(self):
self.assertAlmostEqual(area(3), 9 * area(1))
def test_perimeter(self):
self.assertAlmostEqual(perimeter(2), 4 * math.pi)
if __name__ == "__main__":
unittest.main()python -m unittest -vДля дробных чисел — assertAlmostEqual, а не assertEqual: из-за округления 0.1 + 0.2 не равно 0.3 в точности.
4.2. Интеграционное тестирование
Определение 3. Интеграционное тестирование (integration testing) — тестирование, в котором программные или аппаратные компоненты собраны воедино для проверки их взаимодействия. Определение взято из стандарта IEEE 610.12-1990.
Модули по отдельности могут работать идеально и всё равно не стыковаться: один отдаёт дату строкой, другой ждёт число; один считает в рублях, другой в копейках.
4.3. Системное тестирование
Определение 4. Системное тестирование (system testing) — тестирование полной, интегрированной системы на соответствие поставленным требованиям. В нём собраны вместе все части системы.
4.4. Приёмочное тестирование
Определение 5. Приёмочное тестирование (acceptance testing) — формальная проверка, по результатам которой заказчик или другое уполномоченное лицо решает, принимать систему или нет.
Форма подсказывает пропорцию. Unit-тест выполняется за миллисекунды и точно показывает, где сломалось, поэтому таких тестов должно быть больше всего. Системные и приёмочные проверки идут минуты или часы, часто вручную, и по упавшему тесту не сразу понятно, в каком модуле дефект. Если пирамиду перевернуть — много ручных сквозных проверок и мало unit-тестов, — тестирование становится медленным и дорогим.
5. Типы тестирования
5.1. Функциональное тестирование
Функциональное тестирование (functional testing) — тестирование функций, которые приложение должно выполнять. Бывает:
- позитивное — проверяет успешные сценарии и не подразумевает ошибок пользователя;
- негативное — проверяет ошибки, которые может совершить пользователь, и то, как система их обрабатывает.
Дополнение. Для формы входа позитивный тест — верные логин и пароль, пользователь попал в личный кабинет. Негативные — неверный пароль, пустое поле, пароль в 10 000 символов, пробел в конце логина. Негативных сценариев обычно намного больше, и именно в них прячется большинство дефектов.
В примере из раздела 4.1 нет теста на отрицательный радиус. Функция area(-1) вернёт , как будто радиус равен единице. Ошибка это или нет — решают требования: если в них написано «радиус неотрицателен», нужен негативный тест, ожидающий исключение.
5.2. Нефункциональное тестирование
Нефункциональное тестирование (non-functional testing) — тестирование всего, что не входит в функциональное, но важно для качества системы.
| Вид | По-английски | Что проверяет (дополнение) |
|---|---|---|
| Тестирование конфигурации | Configuration, Maintenance, Supportability testing | работу на разных ОС, браузерах, железе и настройках; удобство сопровождения |
| Тестирование надёжности | Reliability testing | работу без сбоев в течение заданного времени |
| Тестирование инсталляции | Installation, Deployment testing | установку, обновление и удаление |
| Тестирование безопасности | Security testing | защиту данных и устойчивость к атакам |
| Тестирование отказоустойчивости | High Availability, Robustness testing | поведение при отказе части системы и восстановление после него |
| Тестирование производительности | Performance, Load, Longevity testing | скорость отклика при обычной и ожидаемой нагрузке, в том числе долго |
| Стресс-тестирование | Stress testing | поведение за пределами расчётной нагрузки: где ломается и как |
| Тестирование удобства использования | Usability testing | насколько легко пользователю решить свою задачу |
| Тестирование соответствия законодательству | Compliance testing | соответствие законам и стандартам, например о персональных данных |
Нагрузочное (load) проверяет, что система держит ожидаемую нагрузку: тысячу пользователей, на которую её рассчитывали. Стресс-тестирование намеренно выходит за расчётную нагрузку, чтобы узнать, где предел и падает ли система аккуратно. Longevity — та же ожидаемая нагрузка, но много часов подряд: так ловят утечки памяти.
6. Методы тестирования
- Метод чёрного ящика — как система устроена внутри, неизвестно; проверяются интерфейсы: что подали на вход и что получили на выходе.
- Метод белого ящика — устройство системы известно, и тесты строятся с учётом этой информации: по коду видно, какие ветки нужно пройти.
- Метод серого ящика — комбинация первых двух: внутреннее устройство известно частично. Например, тестировщик проверяет через интерфейс, а результат дополнительно смотрит в базе данных.
Две главные техники чёрного ящика. Пусть поле «возраст» принимает целые числа от 18 до 60. Классы эквивалентности: значения, на которых система ведёт себя одинаково, — меньше 18, от 18 до 60, больше 60, не число. Из каждого класса достаточно одного представителя: 10, 30, 70, «abc». Граничные значения: ошибки чаще всего сидят на краях, где перепутали < и <=, поэтому проверяют 17, 18, 60 и 61. Восемь тестов вместо бесконечного перебора — это и есть ответ на второй принцип.
7. Процесс тестирования
| Этап | Что делают |
|---|---|
| 1. Планирование и ревью требований | решают, что, как и какими силами тестировать; проверяют, что требования однозначны и проверяемы |
| 2. Анализ и проектирование (дизайн) | определяют, что именно проверять, и придумывают тесты: чек-листы, тест-кейсы |
| 3. Имплементация и исполнение | готовят данные и окружение, пишут автотесты, выполняют тесты, заводят баг-репорты |
| 4. Завершение, отчётность | подводят итоги, пишут тест-репорт |
Ревью требований стоит первым не случайно — это третий принцип: ошибку в требованиях дешевле всего найти до того, как по ним написан код.
8. Требования
Определение 6. Требование (requirement) — описание того, какие функции и при соблюдении каких условий должно выполнять приложение, решая полезную для пользователя задачу.
| Документ | Расшифровка | Что описывает (дополнение) |
|---|---|---|
| PRD | Product Requirements Document | продукт с точки зрения бизнеса и пользователя: зачем он, для кого, какие задачи решает |
| SRS | System (часто Software) Requirements Specification | полная спецификация системы: функции, ограничения, интерфейсы |
| FRS | Functional Requirements Specification | подробно — что именно должна делать каждая функция |
| Технические требования | Technical Requirements, Technical Specification | как реализовать: технологии, архитектура, окружение |
Дополнение. Хорошее требование можно проверить. «Страница должна грузиться быстро» тестировщику ничего не говорит. «Страница загружается не дольше 2 секунд при 100 одновременных пользователях» — готовый нагрузочный тест.
9. Артефакты тестирования
| Артефакт | Что это (дополнение) |
|---|---|
| Тестовая стратегия, тест-план (Test Strategy, Test Plan) | что тестируем, чем, кто, в какие сроки и по каким критериям считаем тестирование законченным |
| Тест-кейсы (Test Case) | пошаговые сценарии проверок с ожидаемым результатом |
| Баг-репорты (Bug reports, defects, issues) | описания найденных дефектов |
| Тест-репорт (Test Report) | итог: что проверено, сколько прошло и упало, какие дефекты открыты |
| Матрица соответствия требованиям (Traceability Matrix) | таблица «требование — тесты, которые его проверяют»: сразу видно непокрытые требования |
| Чек-листы (Checklist) | список того, что проверить, без подробных шагов |
| Автоматические тесты (Automation test scenarios) | сценарии, которые выполняет программа, а не человек |
Матрица соответствия — прямой ответ на вторую цель тестирования: «убедиться в покрытии требований».
10. Тест-кейс
Определение 7. Тестовый случай (test case) — пошаговое описание действий, необходимых для получения определённого результата.
Хороший тест удовлетворяет следующим критериям:
- существует обоснованная вероятность, что тест выявит ошибку;
- набор тестов не избыточен;
- тест — наилучший в своей категории;
- тест не слишком простой и не слишком сложный.
«Наилучший в своей категории» значит: из нескольких тестов, проверяющих одно и то же (например, один класс эквивалентности), берут тот, у которого больше шансов найти дефект, — обычно граничное значение.
Дополнение. Пример тест-кейса для формы входа:
| Поле | Значение |
|---|---|
| ID | TC-012 |
| Название | Вход с неверным паролем |
| Предусловия | пользователь student зарегистрирован, пароль secret1 |
| Шаги | 1. Открыть страницу входа. 2. Ввести логин student. 3. Ввести пароль secret2. 4. Нажать «Войти». |
| Ожидаемый результат | остаёмся на странице входа, сообщение «Неверный логин или пароль», пароль очищен |
| Фактический результат | заполняется при выполнении |
| Статус | Passed / Failed |
Короткий заголовок «что, где, когда» (например, «Корзина: при удалении последнего товара сумма не обнуляется»), шаги воспроизведения, ожидаемый и фактический результат, окружение (версия, ОС, браузер), серьёзность и приоритет, скриншот или лог. Хороший баг-репорт разработчик воспроизводит с первого раза, ни о чём не переспрашивая.
Частые ошибки
- Считать, что тесты доказывают отсутствие ошибок. Они показывают только наличие дефектов (принцип 1).
- Пытаться проверить всё. Исчерпывающее тестирование невозможно; тесты выбирают по рискам, классам эквивалентности и границам.
- Гонять один и тот же набор тестов годами. Парадокс пестицида: тесты нужно обновлять.
- Путать уровни. Модульное — одна функция или модуль, интеграционное — взаимодействие модулей, системное — вся система против требований, приёмочное — решение заказчика «принимаю или нет».
- Считать unit-тест ручной проверкой. Unit-тесты всегда автоматические и пишутся, как правило, разработчиками.
- Писать только позитивные тесты. Большинство дефектов — в ошибках пользователя и пограничных случаях.
- Путать нагрузочное и стресс-тестирование. Нагрузочное — ожидаемая нагрузка, стресс — за её пределами.
- Путать белый и чёрный ящик. Белый — устройство известно и используется, чёрный — проверяются только интерфейсы.
- Сравнивать дроби через
assertEqual. Для чисел с плавающей точкой —assertAlmostEqual.
Мини-тренажёр
- Все 500 автотестов прошли. Можно ли утверждать, что в программе нет ошибок? Какой это принцип?
- Команда третий год гоняет один и тот же набор регрессионных тестов, и он давно не находит дефектов. Какой принцип здесь работает и что делать?
- 80 % найденных багов пришлись на модуль оплаты. Какой принцип и что из этого следует?
- Проверяют, что модуль корзины правильно передаёт сумму в модуль оплаты. Какой это уровень?
- Заказчик гоняет систему по своему сценарию и подписывает акт. Какой уровень?
- Почему unit-тестов в проекте должно быть больше, чем системных?
- Поле принимает целые числа от 1 до 100. Назовите граничные значения для проверки.
- Для того же поля перечислите классы эквивалентности.
- Сайт проверяют при 10 000 пользователей, хотя рассчитан он на 2 000. Какой это вид тестирования?
- Тестировщик знает только API сервиса и проверяет ответы на запросы. Какой это метод?
- Чем PRD отличается от технических требований?
- Какой артефакт показывает, что у требования нет ни одного теста?
- В примере тестов для
circle.pyнет теста на отрицательный радиус. Позитивный это тест или негативный, и что нужно знать, чтобы его написать?
Ответы
- Нельзя: тестирование показывает наличие дефектов, но не их отсутствие (принцип 1). Прошли только эти 500 сценариев.
- Парадокс пестицида (принцип 5). Пересмотреть тесты, добавить новые сценарии под изменения и под найденные дефекты.
- Скопление дефектов (принцип 4). Тестировать модуль оплаты тщательнее остальных: там, скорее всего, остались ещё дефекты.
- Интеграционное: проверяется взаимодействие двух модулей.
- Приёмочное: заказчик решает, принимать систему или нет.
- Они быстрые, автоматические и точно указывают место поломки; системные медленнее, дороже и хуже локализуют дефект. Отсюда форма пирамиды.
- 0, 1, 100, 101.
- Меньше 1, от 1 до 100, больше 100, не целое число (дробь, текст, пустое поле).
- Стресс-тестирование: нагрузка выше расчётной.
- Чёрный ящик: внутреннее устройство неизвестно, проверяются интерфейсы.
- PRD описывает продукт с точки зрения бизнеса и пользователя (что и зачем), технические требования — как реализовать (технологии, архитектура).
- Матрица соответствия требованиям (traceability matrix).
- Негативный: это ошибочный ввод. Нужно знать требование — что функция должна делать с отрицательным радиусом (например, бросать исключение); без требования ожидаемый результат не определить.
Шпаргалка
| Понятие | Суть |
|---|---|
| Тестирование ПО | проверка программы на соответствие требованиям |
| Принцип 1 | тесты показывают наличие дефектов, не отсутствие |
| Принцип 2 | исчерпывающее тестирование невозможно |
| Принцип 3 | раннее тестирование экономит время и деньги |
| Принцип 4 | дефекты скапливаются в немногих модулях |
| Принцип 5 | парадокс пестицида: старые тесты перестают находить новые дефекты |
| Принцип 6 | тестирование зависит от контекста |
| Принцип 7 | отсутствие ошибок не гарантирует качество |
| Модульное (unit) | одна функция или модуль; автоматическое, с заглушками, пишут разработчики |
| Интеграционное | взаимодействие собранных вместе компонентов (IEEE 610.12-1990) |
| Системное | вся интегрированная система против требований |
| Приёмочное | формальная проверка: принимать систему или нет |
| Функциональное | что система делает; позитивное и негативное |
| Нефункциональное | конфигурация, надёжность, инсталляция, безопасность, отказоустойчивость, производительность, стресс, удобство, соответствие законам |
| Чёрный ящик | устройство неизвестно, проверяются интерфейсы |
| Белый ящик | устройство известно и используется в тестах |
| Серый ящик | комбинация белого и чёрного |
| Процесс | планирование и ревью требований → анализ и дизайн → имплементация и исполнение → завершение и отчётность |
| Требование | что и при каких условиях должно делать приложение |
| PRD / SRS / FRS / ТТ | продуктовые / системные / функциональные / технические требования |
| Артефакты | тест-план, тест-кейсы, баг-репорты, тест-репорт, матрица соответствия, чек-листы, автотесты |
| Тест-кейс | пошаговое описание действий для получения определённого результата |
| Хороший тест | вероятно найдёт ошибку, не избыточен, лучший в своей категории, не слишком прост и не слишком сложен |
Актуальная версия: https://m3105.ru/notes/instrumentalnye-sredstva-razrabotki-po/lektsiya-4-testirovanie-po
Проверь себя
23 вопроса по материалу лекции. Результаты хранятся только в вашем браузере.
23 вопроса про принципы, уровни, типы и методы тестирования, процесс, требования, артефакты и тест-кейсы.
- 23 вопроса
- Результат виден сразу после каждого ответа
- Порядок вопросов случайный

Комментарии0
Пока никто ничего не написал.
Войдите, чтобы оставить комментарий