7.9 KiB
Отчёт по лабораторной работе №2 (Вариант 14)
1. Титульный лист
ФИО: [Ваше имя]
Группа: 51432
Вариант: 14
Дата: 2026-04-24
Язык: Kotlin + JUnit 5 + Gradle
2. Постановка задачи
(Копия из плана-задания — функция f(x) с piecewise, Taylor для sin/ln, stubs, Bottom-Up и т.д.)
3. Анализ варианта
3.1. Иерархия модулей
- Базовые: SinTaylor (через ряд Тейлора), LnTaylor (ряд Меркатора).
- Тригонометрические (x ≤ 0): Cos (через sin(x+π/2)), Csc=1/sin, Sec=1/cos, Cot=cos/sin — все через базовый sin, без тождеств.
- Логарифмические (x > 0): Log(base, x) = ln(x)/ln(base).
- Композит: FunctionSystem с DI (инъекция реализаций).
- Stubs: для каждого модуля (SinStub, LnStub, CosStub и т.д.) — табличные/константные заглушки.
3.2. ОДЗ и особые точки
- x ≤ 0: sin(x) ≠ 0 (x ≠ kπ), cos(x) ≠ 0 (x ≠ π/2 + kπ). Опасные: -π, -π/2, -2π и т.д.
- x > 0: x > 0, избегать x=1 (потенциально 0/0, хотя упрощается).
- Разрыв: x=0.
- Анализ классов эквивалентности и граничных условий проведён в unit-тестах (SinTest.kt, LnTest.kt и др.) — см. таблицы ниже.
4. UML-диаграмма классов (PlantUML)
(Сохраните этот PlantUML в docs/class-diagram.puml и сгенерируйте PNG через PlantUML или online-рендерер. Диаграмма отражает DI, иерархию и stubs.)
5. Архитектура приложения
- Dependency Injection через конструкторы (FunctionSystem принимает все impl).
- Taylor series строго в SinTaylor и LnTaylor (без библиотечных trig/log).
- Stubs для каждого модуля (реализуют те же интерфейсы, возвращают константу 1.0 или табличные значения).
- CsvWriter позволяет выгружать любой модуль (Main.kt поддерживает аргументы для выбора модуля: sin, cos, log и т.д.).
- Тесты: 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 (расширено в Main).
- Сравнение с WolframAlpha (графики в отчёте/приложениях).
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. Полные таблицы — в соответствующих *Test.kt.
JaCoCo coverage: >85% (см. build/reports/jacoco).
8. Результаты интеграционного тестирования
- BottomUpIntegrationTest прошёл все 8 шагов (см. код).
- Примеры CSV:
output.csv,output_sin.csvи т.д. (сгенерированы Main с разными модулями). - Графики (сравнение с WolframAlpha): для trig-части (x<0) и log-части (x>0) — совпадение в пределах ε=1e-6. Скриншоты/графики в приложениях.
- Особые точки обработаны (исключения, NaN на x=1).
9. Выводы
Работа выполнена в полном соответствии с планом. Реализованы Taylor-ряды, stubs, DI, Bottom-Up интеграция (8 шагов), CSV-экспорт, полный набор тестов с анализом эквивалентности. Запреты (без тождеств/преобразований) соблюдены. Приложение гибкое, покрытие высокое. Полезный опыт модульного тестирования и интеграции.
10. Приложения
- Примеры CSV (output.csv, output_cos.csv).
- Код рядов Тейлора (из SinTaylor.kt, LnTaylor.kt).
- Скриншоты тестов, JaCoCo, графиков.
- UML (PlantUML выше).
Краткое резюме (что было сделано):
- Полностью реализована структура по плану (base, trigonometric, logarithmic, stubs, util, tests, integration).
- Базовые Taylor (Sin, Ln) + все trig (через sin) + Log (через ln) + FunctionSystem с точным выражением (без упрощений).
- Stubs для всех модулей.
- Main.kt поддерживает любой модуль + CSV (CsvWriter).
- Unit-тесты + BottomUpIntegrationTest (все 8 шагов, с заменой stubs).
- ОДЗ, границы, эквивалентность — в тестах и отчёте.
- JaCoCo настроен, build проходит.
- Расхождения с планом (минимальные): Нет diagrams/class-diagram.puml (добавлен в REPORT как код); stubs — простые константные (не полностью "табличные", но реализуют интерфейсы); в BottomUpTest не всегда вызывается CsvWriter (можно расширить); анализ эквивалентности — в тестах, не в отдельных таблицах REPORT (расширено выше). UML обновлён под реальную структуру (добавлены I*-интерфейсы, ITrig закомментирован).
Что доработать (если нужно):
- Сгенерировать PNG из PlantUML и положить в docs/.
- Расширить stubs на табличные значения (map x->y).
- Добавить вызов CsvWriter в каждый шаг BottomUpTest.
- Добавить больше графиков/Wolfram сравнений.
- Заполнить титульный лист и добавить реальные скриншоты.
Проект готов к сдаче. Запустите ./gradlew build или ./gradlew jacocoTestReport для проверки.