Тестирование программных молудей
Цели модульного тестирования
Основные задачи модульного тестирования:
Классификация видов тестирования
Практика модульного тестирования на Python и C#
Простой пример на pytest:
Практика модульного тестирования на C#
Советы по практическому применению модульного тестирования:
Задача: Реализовать функцию, вычисляющую факториал числа n (n! = 1 × 2 × … × n).
Решение на C#:
Итоги примеров:
279.50K
Categories: programmingprogramming softwaresoftware

Тестирование программных модулей

1. Тестирование программных молудей

2. Цели модульного тестирования

• Обнаружение ошибок: Раннее выявление дефектов позволяет минимизировать
затраты на исправление багов, поскольку ошибка проще устраняется на уровне
модуля, нежели после интеграции всех частей программы.
• Проверка функциональности: Подтверждение работоспособности каждого
отдельного компонента перед интеграцией помогает избежать проблем
взаимодействия между ними позже.
• Улучшение качества кода: Модульное тестирование способствует улучшению
архитектуры приложения и повышению уровня читаемости и поддерживаемости
кода.
• Повышение уверенности разработчиков: Наличие тестов даёт разработчикам
уверенность в том, что изменения в коде не приведут к регрессии функционала.
• Документирование поведения модулей: Тесты служат своего рода документацией,
показывая ожидаемые входные данные и поведение соответствующих методов.

3. Основные задачи модульного тестирования:

• Разработка тестовых сценариев: Создание набора тестов,
покрывающих ключевые сценарии использования модуля.
• Организация среды тестирования: Обеспечение необходимой
инфраструктуры для запуска тестов (например, использование
mock объектов).
• Автоматизация тестов: Написание автоматизированных тестов,
которые будут запускаться регулярно, например, после внесения
изменений в исходный код.
• Оценка покрытия кода: Проверка достаточности количества
написанных тестов путём анализа метрик покрытия кода.
• Исправление выявленных дефектов: Анализ результатов
тестирования и внесение необходимых изменений в код.

4. Классификация видов тестирования

По уровню детализации:
• Модульное тестирование
Описано ранее, представляет собой проверку отдельной компоненты
(функций, методов, классов). Это самый низкий уровень тестирования.
• Интеграционное тестирование
Проверяет взаимодействие нескольких модулей друг с другом,
обеспечивая совместимость различных элементов системы.
• Система-тестирование (или комплексное)
Оценивает функциональность всей готовой системы целиком,
проверяя её работоспособность в реальных условиях эксплуатации.
• Приёмочное тестирование
Проводится конечными пользователями или заказчиком для
подтверждения соответствия заявленным требованиям и ожиданиям.

5.

По характеру процесса:
• Ручное тестирование
Выполняется вручную человеком-испытателем без автоматизации
процессов.
• Автоматизированное тестирование
Применяются специальные инструменты и скрипты для автоматического
запуска тестов и оценки результатов.
По степени осведомлённости о внутреннем устройстве ПО:
• Тестирование белого ящика
Включает знание внутренней структуры и реализации программы.
Позволяет проверить отдельные пути исполнения алгоритмов и покрытие
всего кода.
• Тестирование чёрного ящика
Исполнитель теста не имеет представления о внутренних механизмах
работы программы и оценивает систему исключительно по внешним
признакам.
• Тестирование серого ящика
Используется частичная информация о структуре программы наряду с
методами тестирования черного ящика.

6.

По назначению и этапам жизненного цикла разработки:
• Регрессионное тестирование
Повторное выполнение старых тестов после внесённых изменений, чтобы убедиться, что новые
доработки не нарушают существующую функциональность.
• Нагрузочное тестирование
Измеряет производительность системы при определённой нагрузке пользователей, операций и
запросов.
• Стресс-тестирование
Выявляет пределы производительности системы при экстремальных нагрузках.
• Компонентное тестирование
Ориентировано на конкретные компоненты системы вне зависимости от остальных подсистем.
• Этапное тестирование (alpha/beta testing)
Предназначено для выявления недостатков перед официальным релизом продукта среди
ограниченной группы лиц (бета-версия чаще открыта широкой аудитории).
• Кроссбраузерное/кросс-платформенное тестирование
Подразумевает проверку работоспособности веб-приложений или приложений на различных
платформах, браузерах и устройствах.
• Эксплуатационные испытания (Production Testing)
Осуществляется непосредственно в реальной среде эксплуатации после релиза, для наблюдения за
поведением системы в боевых условиях.
• Перформанс-тестирование
Проверяет быстродействие, масштабируемость и стабильность системы при высоких нагрузках.
• Безопасность (Security Testing)
Фокусируется на уязвимости и защите данных, оценивая устойчивость системы к угрозам и атакам.

7. Практика модульного тестирования на Python и C#

Python предлагает мощный инструмент
для написания юнит-тестов — библиотеку unittest.
Она встроена прямо в стандартную поставку
языка и позволяет легко организовать тесты для
любых компонентов вашей программы.
Что важно отметить:
• Для каждого метода мы создаем отдельный
тест (test_*).
• Используются методы библиотеки assert*, такие
как assertEqual().
• Каждый тест независим от другого, выполняется
отдельно.
• Чтобы запустить этот тест, выполните файл, и
библиотека выведет отчёт о прохождении
тестов.

8. Простой пример на pytest:

Также популярен другой
фреймворк — pytest,
предоставляющий
дополнительные возможности и
упрощающий синтаксис тестов.
Здесь используется
простой синтаксис утверждений
(assert), который делает тесты
лаконичными и
удобочитаемыми.

9. Практика модульного тестирования на C#

C# также поддерживает
разнообразные инструменты для
модульного тестирования. Один из
самых известных инструментов —
NUnit. Рассмотрим базовый
пример тестирования с
использованием NUnit.
Пример проекта на C#,
используя NuGet пакет NUnit:
Создадим класс
калькулятора

10.

Основные моменты:
• Атрибут [TestFixture] обозначает
класс, содержащий тесты.
• Методы, помеченные
атрибутом [Test], являются
отдельными тестовыми
случаями.
• Атрибут [SetUp] обеспечивает
подготовку окружения перед
каждым тестовым методом.
• Библиотека NUnit предоставляет
удобные утверждения типа
Assert.AreEqual() для сравнения
значений.
Кроме NUnit популярны другие
инструменты, такие как MSTest
(встроенный в Visual Studio) и
XUnit.

11. Советы по практическому применению модульного тестирования:

Независимые тесты. Убедитесь, что каждый тест работает независимо от других. Это
предотвратит цепочки зависимых сбоев.
Покрытие кода. Используйте средства измерения покрытия кода (например,
coverage.py для Python или dotCover для .NET), чтобы видеть, насколько полно
покрыты ваши модули тестами.
Используйте фиктивные объекты (mock objects). Если ваш метод взаимодействует с
внешними компонентами (базы данных, сервисы и т.п.), заменяйте их моковскими
объектами, чтобы избежать побочных эффектов и сделать тесты быстрее.
Отделяйте чистую логику от инфраструктурных деталей. Чем меньше внешние
зависимости, тем легче писать тесты.
Организовывайте тесты по принципу AAA ("Arrange-Act-Assert"):
Arrange: подготовка контекста.
Act: вызов метода.
Assert: проверка результата.
Регулярно выполняйте тесты, особенно после внесения изменений в кодовую базу.

12. Задача: Реализовать функцию, вычисляющую факториал числа n (n! = 1 × 2 × … × n).

Решение на Python:
сначала напишем реализацию
самой функции

13.

Теперь перейдем к
созданию юнит-тестов с
использованием стандартной
библиотеки unittest:

14.

Параметризованные тесты
(@pytest.mark.parametrize):
Мы используем аннотацию parametrize,
чтобы один тест автоматически повторялся с
разными аргументами. Например, в данном случае
проверяются разные входные значения и
соответствующие результаты.
Базовый тест (test_factorial):
Этот тест проходит различные варианты
(включая ноль и единицу), гарантируя
правильность вычислений.
Граничные условия (test_factorial_edge_cases):
Здесь проверены два специальных
случая: факториалы нуля и единицы.
Исключительная ситуация
(test_factorial_raises_exception_for_negative):
В этом тесте мы проверяем, что функция
правильно генерирует ошибку, если передан
отрицательный аргумент.
Большой факториал (test_factorial_large_number):
Дополнительно проверяем точность
расчёта для относительно большого числа (10!),
хотя фактически такая проверка скорее
демонстрационная, так как сама реализация
проста и эффективна даже для больших чисел.

15. Решение на C#:

Для начала создадим саму
функцию вычисления
факториала:

16.

Затем напишем
модульные тесты с
использованием популярного
инструмента NUnit

17. Итоги примеров:

Решения схожи концептуально: оба подхода основаны на
циклическом умножении, начиная с единицы.
Тестирование состоит из основных шагов:
Положительные случаи (правильные вводы).
Границы (нулевые, минимальные положительные значения).
Большие числа (чтобы удостовериться в точности).
Неверные аргументы (для проверки исключительных ситуаций).
Подход отличается синтаксически: Python использует плоское
утверждение через self.assertEqual(...), тогда как C# применяет
статический метод Assert.AreEqual(...).
English     Русский Rules