# Отчёт по лабораторной работе №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)
## 5. Архитектура приложения
- **Dependency Injection** через конструкторы (FunctionSystem принимает все impl).
- **Taylor series** строго в SinTaylor и LnTaylor (без библиотечных trig/log).
- **Stubs** теперь полностью табличные (Map с 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-экспорт, полный набор тестов с анализом эквивалентности.