#import "common.typ": pz-fig, pz-table = Тестирование программного обеспечения В ходе работы было организовано тестирование Wallenc на нескольких уровнях: модульные автоматические тесты (JUnit, каталог `src/test` каждого Gradle-модуля), инструментальные тесты (`src/androidTest`), а также ручные функциональные и UI-прогоны. Программа и методика испытаний приведены в приложении Б. == План тестирования === Цели и задачи испытаний Основная цель — подтвердить корректность криптографического ядра, доменной логики синхронизации и сценариев UI. Были поставлены следующие задачи: + проверить `Encryptor` и проверку ключа для строк, байтов и потоков; + убедиться в корректном маппинге исключений в коды ошибок; + протестировать движок синхронизации (`StorageSyncEngine`, журнал, блокировки); + проверить оркестратор фоновых задач; + выполнить smoke-тесты навигации, deep link и 2FA/TOTP; + зафиксировать результаты ручных сценариев vault, OAuth и экрана задач. === Объект и уровни тестирования #pz-table( [Объекты и уровни тестирования Wallenc], 4, table.header([Уровень], [Объект], [Инструмент], [Критерий успеха]), [Unit], [Классы domain, usecases, ui, task-runtime, domain-vault], [JUnit 4, JVM], [Все тесты модуля успешны], [Инструм.], [Room, Compose UI, OAuth], [AndroidJUnit, эмулятор], [Нет падений на целевом API], [Ручной], [Сборка app, пользовательские цепочки], [Чек-лист], [Сценарии T-1…T-12 пройдены], [Регресс.], [Синхронизация, шифрование], [Повтор unit + выборочный ручной], [Нет блокирующих дефектов], ) === Матрица тестовых сценариев #pz-table( [Матрица тестовых сценариев], 5, table.header([ID], [Сценарий], [Тип], [Авто], [Ожидаемый результат]), [T-1], [Проверка ключа шифрования], [Unit], [Да], [`Encryptor.checkKey` true/false], [T-2], [Шифрование/дешифрование строки и байтов], [Unit], [Да], [Симметрия данных], [T-3], [Потоковое шифрование файла], [Unit], [Да], [Данные после decrypt равны исходным], [T-4], [Синхронизация группы хранилищ], [Unit], [Да], [Копирование, удаление, trash, блокировки], [T-5], [2FA TOTP генерация], [Unit], [Да], [Совпадение с эталоном Java OTP], [T-6], [Маппинг ошибок сети/диска], [Unit], [Да], [Типизированные `WallencException`], [T-7], [CRUD storage в LocalVault], [Ручной], [Нет], [Список обновлён (рис. @fig-05)], [T-8], [Включение шифрования vault], [Ручной], [Нет], [Статус «зашифровано» (рис. @fig-06)], [T-9], [Открытие/закрытие vault], [Ручной], [Нет], [Доступ только с ключом (рис. @fig-07)], [T-10], [OAuth Яндекс], [Ручной / IT], [Частично], [Токен в Room (рис. @fig-10)], [T-11], [Экран задач и уведомления], [Ручной], [Частично], [Прогресс и завершение (рис. 12–13)], [T-12], [Compose: секреты и 2FA], [IT], [Да], [Отображение без падений], ) === Критерии начала и окончания *Начало:* собраны модули проекта; выполняется `./gradlew test`; для инструментальных тестов доступен эмулятор API 26+. *Окончание:* все 68 unit-тестов в `src/test` завершились успешно; инструментальные тесты пройдены на эмуляторе; ручной чек-лист T-7…T-12 выполнен; критические дефекты отсутствуют. === Среда и инструменты #pz-table( [Тестовая среда], 2, table.header([Параметр], [Значение]), [ОС разработки], [GNU/Linux, Android Studio], [JDK], [OpenJDK 17 / 21], [Сборка], [`./gradlew test`, `./gradlew connectedDebugAndroidTest`], [Устройство], [Эмулятор Pixel 6 API 34; физическое устройство для OAuth], ) == Модульные тесты (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). `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], ) Запуск: `./gradlew connectedDebugAndroidTest`. Результат — рис. @fig-31. #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], [Открыть/закрыть vault], [OK], [Контент только при открытом vault], [@fig-07], [T-10], [OAuth Яндекс], [OK], [Запись в `DbYandexAccount`], [@fig-10], [T-11], [Фоновая задача шифрования], [OK], [Прогресс на экране задач], [рис. 12], [T-12], [Уведомление о завершении], [OK], [Notification отображён], [рис. 13], ) #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], [Очередь и экран задач], ) == Вывод План тестирования выполнен: автоматизированное покрытие охватывает криптографию, синхронизацию, задачи, парсинг OTP и обработку ошибок; ручные сценарии подтвердили пригодность UI для vault и OAuth. Результаты обосновывают готовность прототипа Wallenc к демонстрации и развитию в рамках ВКР.