79 KiB
Отчёт по лабораторной работе №2 по Тестированию ПО
1. Титульник
ФИО: Владимиров Владислав Александрович
Группа: P3322
Вариант: 51432
Язык: Kotlin + JUnit 5 + Gradle
2026г.
2. Постановка задачи
Провести интеграционное тестирование программы, осуществляющей вычисление системы функций (в соответствии с вариантом).
x <= 0 : ((((sin(x) + csc(x)) ^ 2) / csc(x)) / ((sec(x) ^ 3) + ((cos(x) ^ 2) * (sin(x) + cot(x)))))
x > 0 : (((((log_10(x) / log_5(x)) * log_10(x)) * log_10(x)) * log_3(x)) * (((log_2(x) / log_2(x)) ^ 3) - ((log_3(x) * ln(x)) + (log_5(x) - log_5(x)))))
Правила выполнения работы:
- Все составляющие систему функции (как тригонометрические, так и логарифмические) должны быть выражены через базовые (тригонометрическая зависит от варианта; логарифмическая - натуральный логарифм).
- Структура приложения, тестируемого в рамках лабораторной работы, должна выглядеть следующим образом (пример приведён для базовой тригонометрической функции sin(x)):
- Обе "базовые" функции (в примере выше - sin(x) и ln(x)) должны быть реализованы при помощи разложения в ряд с задаваемой погрешностью. Использовать тригонометрические / логарифмические преобразования для упрощения функций ЗАПРЕЩЕНО.
- Для КАЖДОГО модуля должны быть реализованы табличные заглушки. При этом, необходимо найти область допустимых значений функций, и, при необходимости, определить взаимозависимые точки в модулях.
- Разработанное приложение должно позволять выводить значения, выдаваемое любым модулем системы, в сsv файл вида «X, Результаты модуля (X)», позволяющее произвольно менять шаг наращивания Х. Разделитель в файле csv можно использовать произвольный.
Порядок выполнения работы:
- Разработать приложение, руководствуясь приведёнными выше правилами.
- С помощью JUNIT5 разработать тестовое покрытие системы функций, проведя анализ эквивалентности и учитывая особенности системы функций. Для анализа особенностей системы функций и составляющих ее частей можно использовать сайт https://www.wolframalpha.com/.
- Собрать приложение, состоящее из заглушек. Провести интеграцию приложения по 1 модулю, с обоснованием стратегии интеграции, проведением интеграционных тестов и контролем тестового покрытия системы функций.
3. Анализ варианта
3.1. Иерархия модулей
- Базовые: SinTaylor (через ряд Тейлора), LnTaylor (ряд Меркатора).
- Тригонометрические (x ≤ 0): Cos (через sin(x+π/2)), Csc=1/sin, Sec=1/cos, Cot=cos/sin.
- Логарифмические (x > 0): Log(base, x) = ln(x)/ln(base).
- Композит: FunctionSystem.
- Stubs: для каждого модуля (SinStub, LnStub, CosStub и т.д.) — табличные заглушки через статическую мапу.
3.2. ОДЗ и особые точки
- Sin, Cos: определены для всех x (периодические).
- Csc, Cot: x ≠ kπ (исключение ArithmeticException).
- Sec: x ≠ π/2 + kπ (исключение).
- Ln, Log: x > 0, base > 0 и base ≠ 1 (IllegalArgumentException).
- Взаимозависимые точки: 0, ±π/2, ±π, 1, e, 10 (использованы в таблицах stubs).
4. UML-диаграмма классов (PlantUML)
<?plantuml 1.2026.2?>5. Архитектура приложения
- Dependency Injection через конструкторы (FunctionSystem принимает все impl).
- Taylor series строго в SinTaylor и LnTaylor (без библиотечных trig/log).
- Stubs теперь полностью табличные (Map<Double, Double> с 8–10 ключевыми точками ОДЗ, поиск ближайшей + линейная интерполяция/экстраполяция). Реализованы в
function.stubs.*Stub.kt(SinStub, CosStub, CscStub, SecStub, CotStub, LnStub, LogStub). ОДЗ и исключения добавлены где необходимо. - CsvWriter позволяет выгружать любой модуль.
- Тесты: unit для каждого, интеграционные Bottom-Up.
6. Обоснование стратегии интеграции Bottom-Up
Bottom-Up выбран как указано в плане: начинаем с базовых (Ln, Sin), постепенно заменяем stubs на реальные реализации (Cos+Sin, Csc+Sin, Sec+Cos/Sin, Cot+Sin/Cos, Log+Ln, наконец FunctionSystem). Это позволяет изолированно тестировать каждый слой, выявлять ошибки на ранних этапах. 8 шагов реализованы в BottomUpIntegrationTest.kt (каждый тест — шаг интеграции, использует mix реальных + stub). На каждом шаге:
- Запуск теста.
- Генерация CSV через CsvWriter.
- Сравнение с Desmos.
7. Тестовое покрытие и анализ
- Unit-тесты: SinTest, LnTest, CosTest, CscTest, SecTest, CotTest, LogTest, FunctionSystemTest — покрывают классы эквивалентности (нормальные значения, границы ОДЗ, исключения при sin=0/cos=0, x<=0 для ln и т.д.).
Пример таблицы классов эквивалентности (для Sin):
| Класс эквивалентности | Тест-кейсы | Ожидаемый результат |
|---|---|---|
| x в (-π,0) excl. multiples of π | x=-0.5, eps=1e-10 | ~ -0.4794 |
| Граница (x ~ -π) | x=-3.14 | Исключение или близко к 0 |
| x=0 (запрещено) | x=0 | ArithmeticException |
| Большой | x=-10.0 | Сходимость ряда |
Аналогично для Ln (x>0, x~1, x>1), trig и log.
Покрытие составляет 100% для функций. Подтверждается в (build/reports/jacoco/test/html/index.html)
8. Результаты интеграционного тестирования
- BottomUpIntegrationTest прошёл все 8 шагов.
- Примеры CSV:
output.csv,output_sin.csvи т.д. (сгенерированы Main с разными модулями). - Графики (сравнение с Desmos): для trig-части (x<0) и log-части (x>0) — совпадение в пределах ε=1e-6.
И наши точки это вывод программы:

- Особые точки обработаны (исключения, NaN на x=1).
9. Выводы
Работа выполнена в полном соответствии с планом. Реализованы Taylor-ряды, stubs, DI, Bottom-Up интеграция (8 шагов), CSV-экспорт, полный набор тестов с анализом эквивалентности.