#import "common.typ": pz-fig, pz-table

= Тестирование программного обеспечения

#include "testing/_intro.typ"

#include "testing/01-plan.typ"

== Модульные тесты (JUnit)

В проекте реализовано 68 автоматических unit-тестов в пяти модулях (`:domain` – 12, `:domain-vault` – 10, `:usecases` – 25, `:ui` – 15, `:task-runtime` – 6). Тесты выполняются на JVM при сборке.

#include "ch05-tests-generated.typ"

=== Криптография и доменные ошибки

Класс `EncryptorTest` проверяет сценарии AES: `checkKey`, шифрование строк, байтовых массивов и потоков с верным и неверным ключом (строки 5–14 табл. @tbl-unit-all). `WallencExceptionMappingTest` покрывает преобразование файловых и сетевых исключений.

Прогон `./gradlew :domain:test` – на рис. @fig-27.

#pz-fig("fig_27_gradle_domain_test.png", [Отчёт Gradle: модуль :domain, задача test], "fig-27")

=== Синхронизация, 2FA и use cases

`StorageSyncEngineTest` моделирует группы синхронизации, копирование и удаление файлов, soft-delete, отмену и блокировки (строки 52–64 табл. @tbl-unit-all); отдельно проверяются слияние журнала (`mergeKeepsSingleEntryPerPath`) и пропуск цели с актуальной ревизией (`syncSkipsWhenTargetRevisionAlreadyWinner`) – см. алгоритм в гл. 4. `TwoFaTotpTest` сверяет TOTP с эталоном Java OTP. `StorageDomainUseCasesTest` проверяет CRUD текстовых секретов и 2FA.

#pz-fig("fig_28_gradle_usecases_test.png", [Отчёт Gradle: модуль :usecases], "fig-28")

=== Модуль :domain-vault

`YandexDiskRepositoryTest` использует мок HTTP: разбор `diskInfo`, пустой список при 404, `AuthException` при 401. `VaultThrowableMappingTest` покрывает сетевые и файловые ошибки vault.

=== Модуль :ui

Проверены чистые функции навигации, deep link, подписи уведомлений, парсинг OTP URI и постановка задачи в очередь (`TaskPipelineViewModelTest`).

#pz-fig("fig_29_gradle_ui_test.png", [Отчёт Gradle: модуль :ui], "fig-29")

=== Модуль :task-runtime

`TaskOrchestratorTest` проверяет enqueue, progress, fail, cancel и cancelAll.

== Инструментальные тесты (androidTest)

#pz-table(
  [Инструментальные тесты androidTest],
  4,
  table.header([Модуль], [Класс], [Назначение], [Методов]),
  [:ui], [TwoFaTokensScreenContentTest], [Compose: экран 2FA токенов], [2],
  [:ui], [TextSecretsScreenContentTest], [Compose: текстовые секреты], [2],
  [:infra], [YandexAccountRepositoryTest], [Room in-memory: аккаунт Яндекс], [3],
  [:app], [YandexDiskLiveIntegrationTest], [Живой API (при наличии токена)], [3],
) <tbl-androidtest>

Запуск: `./gradlew connectedDebugAndroidTest`. Результат – рис. @fig-31. Отрисовка экранов секретов и 2FA подтверждена скриншотами @fig-33–@fig-34.

#pz-fig("fig_31_gradle_connected_test.png", [Gradle connectedDebugAndroidTest], "fig-31")

== Ручное и UI-тестирование

Ручные прогоны выполнялись по чек-листу T-7…T-12 на эмуляторе и физическом устройстве.

#pz-table(
  [Протокол ручного тестирования],
  5,
  table.header([ID], [Шаг], [Статус], [Фактический результат], [Иллюстрация]),
  [T-7], [Создать storage в LocalVault], [OK], [Storage в списке], [@fig-05],
  [T-8], [Включить шифрование], [OK], [Статус encrypted], [@fig-06],
  [T-9], [Открыть/закрыть storage], [OK], [Контент только при открытом storage], [@fig-07],
  [T-10], [OAuth Яндекс], [OK], [Запись в `DbYandexAccount`], [@fig-10],
  [T-11], [Фоновая задача шифрования], [OK], [Прогресс на экране задач], [рис. 12],
  [T-12], [Уведомление о завершении], [OK], [Notification отображён], [рис. 13],
) <tbl-testres>

#pz-fig("fig_32_manual_test_checklist.png", [Чек-лист ручного UI-тестирования], "fig-32")

== Отчёт о результатах тестирования

По итогам `./gradlew test` все 68 unit-тестов завершились со статусом PASSED. Инструментальные тесты `:ui` подтвердили отрисовку экранов секретов и 2FA; тесты Room – персистентность учётной записи Яндекс.

#pz-fig("fig_30_gradle_test_summary.png", [Сводка Gradle test по модулям], "fig-30")

#pz-table(
  [Трассировка требований → тесты],
  3,
  table.header([ФР], [Тесты], [Комментарий]),
  [ФР-1], [T-7, StorageDomainUseCasesTest], [Storage в LocalVault и CRUD секретов],
  [ФР-2], [EncryptorTest, T-8, T-9], [Покрытие AES],
  [ФР-3], [TextSecretsScreenContentTest], [UI + domain],
  [ФР-4], [YandexDiskRepositoryTest, T-10], [HTTP-мок и ручной OAuth],
  [ФР-5], [StorageSyncEngineTest], [Синхронизация групп],
  [ФР-6], [TaskOrchestratorTest, T-11], [Очередь и экран задач],
) <tbl-trace>

== Вывод

План тестирования выполнен: автоматизированное покрытие охватывает криптографию, синхронизацию, задачи, парсинг OTP и обработку ошибок; ручные сценарии подтвердили пригодность UI для vault и OAuth. Результаты обосновывают готовность прототипа Wallenc к демонстрации и развитию в рамках ВКР.
