Правильные файлы о тестировании

This commit is contained in:
2026-05-28 19:09:52 +03:00
parent 0c0dda8cc6
commit cce399a9e7
18 changed files with 63755 additions and 49493 deletions

View File

@@ -0,0 +1,46 @@
// Метки приложения В: микро-figure в нулевом блоке (без разрыва страницы) + фиксированный текст ссылок.
#box(width: 0pt, height: 0pt, clip: true)[
#figure(
box(width: 0pt, height: 0pt)[
#image("../../images/fig_05_local_vaults.jpg", width: 1pt, height: 1pt)
],
caption: none,
) <fig-05>
#figure(
box(width: 0pt, height: 0pt)[
#image("../../images/fig_06_encrypt_dialog.jpg", width: 1pt, height: 1pt)
],
caption: none,
) <fig-06>
#figure(
box(width: 0pt, height: 0pt)[
#image("../../images/fig_07_open_close_dialog.jpg", width: 1pt, height: 1pt)
],
caption: none,
) <fig-07>
#figure(
box(width: 0pt, height: 0pt)[
#image("../../images/fig_10_yandex_oauth.jpg", width: 1pt, height: 1pt)
],
caption: none,
) <fig-10>
#figure(
box(width: 0pt, height: 0pt)[
#image("../../images/fig_33_storage_secrets_2fa.jpg", width: 1pt, height: 1pt)
],
caption: none,
) <fig-33>
#figure(
box(width: 0pt, height: 0pt)[
#image("../../images/fig_34_2fa_single_token.jpg", width: 1pt, height: 1pt)
],
caption: none,
) <fig-34>
]
#show ref.where(target: label("fig-05")): [рис. 5]
#show ref.where(target: label("fig-06")): [рис. 6]
#show ref.where(target: label("fig-07")): [рис. 7]
#show ref.where(target: label("fig-10")): [рис. 10]
#show ref.where(target: label("fig-33")): [рис. 33]
#show ref.where(target: label("fig-34")): [рис. 34]

View File

@@ -0,0 +1,78 @@
// Файл 3 для загрузки: требования (предметная область + сравнение аналогов → ФР/НФР).
#import "../common.typ": pz-fig, pz-table
= Требования к приложению Wallenc
== Анализ предметной области (выдержка)
В рамках анализа предметной области рассмотрены подходы к хранению чувствительных данных в мобильных приложениях и облачных хранилищах. Выделены требования: конфиденциальность при хранении и передаче; отсутствие необходимости доверять инфраструктуре хранилища; устойчивость к компрометации удалённого провайдера; разделение логики хранения и криптографической защиты; удобные сценарии создания хранилища, шифрования, открытия и работы с содержимым.
Сформирован вывод о приоритете клиентских криптографических механизмов, унифицированного доступа к разным типам хранилищ и архитектуры с чётким разделением слоёв.
== Разработка требований к программному продукту
=== Назначение и цели создания системы
*Назначение* системы Wallenc предоставление пользователю мобильного клиента для работы с иерархией *VaultsManager → vault → storage → файлы*: один `LocalVault` на устройстве, удалённые vault по OAuth; внутри vault пользователь создаёт и управляет *storage*; шифрование (`StorageEncryptionInfo`, `Encryptor`) применяется к storage, а не к vault.
*Цели создания*: обеспечить единую модель vault и storage; минимизировать доверие к провайдеру; поддержать расширение списка провайдеров через адаптеры; сохранить служебные метаданные в локальной БД без хранения пользовательского контента в открытом виде.
=== Функциональные требования
Функциональные требования сведены в таблице @tbl-req-export.
#pz-table(
[Свод функциональных требований],
2,
table.header([Код], [Требование]),
[ФР-1], [Создание, просмотр, переименование и удаление storage в локальном vault (LocalVault один на устройстве)],
[ФР-2], [Включение шифрования storage, проверка ключа, открытие и закрытие зашифрованного представления],
[ФР-3], [Просмотр и операции с файлами внутри storage; текстовые секреты и 2FA],
[ФР-4], [OAuth-авторизация (Яндекс), регистрация удалённых vault и листинг их storage],
[ФР-5], [Синхронизация: группы хранилищ, журнал коммитов, фоновый Worker без передачи ключей],
[ФР-6], [Очередь фоновых задач: шифрование, синхронизация, отображение прогресса],
) <tbl-req-export>
==== Управление storage в локальном vault
Пользователь создаёт storage, просматривает список, переименовывает и удаляет их в единственном `LocalVault`. Служебные каталоги и системные пути не отображаются в пользовательском представлении.
==== Шифрование и открытие storage
При включении шифрования формируются параметры `StorageEncryptionInfo`; открытие выполняется только после успешной проверки ключа. Повторное шифрование одного storage до завершения предыдущей операции блокируется.
==== Работа с содержимым storage
Операции чтения и записи выполняются через единый интерфейс файлового доступа независимо от типа хранилища. Внутри открытого storage доступны текстовые секреты и генерация TOTP для 2FA.
==== Удалённые хранилища и авторизация во внешних провайдерах
Реализован поток OAuth 2.0 для Яндекса.
==== Синхронизация зашифрованных данных
Спроектирован механизм фоновой синхронизации: в Room хранятся записи с UUID хранилищ; по таймеру запускается сервис, сравнивающий истории коммитов локального и удалённого представления без передачи ключей на сервер провайдера.
=== Нефункциональные требования
К системе предъявляются требования по производительности (асинхронные операции на Coroutines), безопасности (AES на клиенте, минимизация утечек через имена путей), расширяемости (модульная структура Gradle) и устойчивости к гонкам при длительных операциях шифрования.
=== Требования к программно-аппаратной платформе
Минимальная платформа Android с поддержкой Jetpack Compose; для OAuth и удалённых операций требуется сетевое подключение. Объём оперативной памяти должен быть достаточен для фоновых задач шифрования и Room.
== Сравнение аналогов (обоснование требований)
#pz-table(
[Сравнительная оценка аналогов],
6,
table.header([Критерий], [Secure Folder], [Proton], [Bitwarden], [Cryptomator], [Wallenc]),
[Собственный backend приложения], [], [+], [+/], [], [],
[E2E / клиентское шифрование], [+/], [+], [+], [+], [+],
[Файловый vault], [+], [+], [], [+], [+],
[OAuth внешнего провайдера], [], [+/], [+/], [+/], [+],
[Переносимость провайдеров], [], [], [+/], [+], [+],
[Unit-тесты без сервера], [н/д], [н/д], [+/], [+/], [+ (68)],
) <tbl-analog-export>
По итогам сравнения аналогов сформированы функциональные требования ФР-1…ФР-6 и нефункциональные ограничения, отражённые в таблице @tbl-req-export.

View File

@@ -0,0 +1,8 @@
// Файл 4 для загрузки: наборы тестов, реестр и листинги src/test, src/androidTest.
#import "../common.typ": pz-fig, pz-table
= Код модулей автоматизированного тестирования и наборы тестов
#include "../testing/02-test-sets.typ"
#include "../testing/03-automation.typ"

View File

@@ -1,11 +0,0 @@
#import "_document.typ": testing-export-doc
#show: testing-export-doc.with(
title: [План тестирования],
criterion: [Критерий 1.1 наличие плана тестирования],
)
= Тестирование программного обеспечения
#include "../includes/testing/_intro.typ"
#include "../includes/testing/01-plan.typ"

View File

@@ -1,11 +0,0 @@
#import "_document.typ": testing-export-doc
#show: testing-export-doc.with(
title: [Наборы тестов],
criterion: [Критерий 1.2 наличие наборов тестов],
)
= Тестирование программного обеспечения
#include "../includes/testing/_intro.typ"
#include "../includes/testing/02-test-sets.typ"

View File

@@ -1,11 +0,0 @@
#import "_document.typ": testing-export-doc
#show: testing-export-doc.with(
title: [Автоматизированное тестирование],
criterion: [Критерий 1.3 код модулей автоматизированного тестирования],
)
= Тестирование программного обеспечения
#include "../includes/testing/_intro.typ"
#include "../includes/testing/03-automation.typ"

View File

@@ -1,11 +0,0 @@
#import "_document.typ": testing-export-doc
#show: testing-export-doc.with(
title: [Отчёт о проведении тестирования],
criterion: [Критерий 1.4 отчёт о проведении тестирования],
)
= Тестирование программного обеспечения
#include "../includes/testing/_intro.typ"
#include "../includes/testing/04-report.typ"

View File

@@ -1,15 +1,13 @@
# Экспорт раздела «Тестирование» (ПЗ ВКР Wallenc)
# Экспорт материалов по тестированию (ПЗ ВКР Wallenc)
Каталог содержит **4 автономных документа** для загрузки в систему оценивания (критерии 1.11.4). Исходники — фрагменты Typst из гл. 5 пояснительной записки (`Report/includes/testing/`).
Каталог содержит **3 PDF** для загрузки в систему оценивания. **ТЗ на ПО (п. 2)** оформляется и загружается отдельно (производственная практика).
## Файлы для загрузки
| Исходник (.typ) | PDF для загрузки | Критерий | Содержание |
|-----------------|------------------|----------|------------|
| `01_plan_testing.typ` | `КТбо4-9_ПытковРЕ_1.1_План_тестирования.pdf` | **1.1** | Цели, уровни, матрица T-1…T-12, критерии начала/окончания, среда |
| `02_test_sets.typ` | `КТбо4-9_ПытковРЕ_1.2_Наборы_тестов.pdf` | **1.2** | ФР-1…ФР-6, матрица сценариев, трассировка ФР→тесты, реестр 68 unit-тестов, androidTest |
| `03_automation_code.typ` | `КТбо4-9_ПытковРЕ_1.3_Автоматизированноеестирование.pdf` | **1.3** | Описание модулей, **листинги** `src/test` и `src/androidTest` (как в прил. А), скриншоты Gradle |
| `04_test_report.typ` | `КТбо4-9_ПытковРЕ_1.4_Отчёт_о_проведении_тестирования.pdf` | **1.4** | Протокол ручных T-7…T-12, сводка PASSED, трассировка, вывод |
| Пункт задания | PDF для загрузки | Исходник | Содержание |
|---------------|------------------|----------|------------|
| **1** — раздел ПЗ по тестированию ПО | `КТбо4-9_ПытковРЕ_1_Раздел_ПЗ_ТестированиеО.pdf` | `export_01_testing_section.typ` | Глава 5 пояснительной записки (`includes/ch05.typ`) |
| **2**ТЗ на разрабатываемое ПО | *(не в этом каталоге)* | — | Документ практики, загрузить свой PDF |
| **3** — требования к приложению | `КТбо4-9_ПытковРЕ_3_Требования_к_приложению.pdf` | `export_03_requirements.typ` | ФР/НФР, выдержка из гл. 1, таблица сравнения аналогов |
| **4** — код unit-тестов, наборы тестов | `КТбо4-9_ПытковРЕ_4_Код_и_наборы_тестов.pdf` | `export_04_unit_tests.typ` | Матрица T-1…T-12, трассировка ФР→тесты, реестр 68 тестов, листинги `src/test` и `src/androidTest` |
## Сборка
@@ -18,22 +16,14 @@ cd Report/testing-export/scripts
./build.sh
```
Скрипт вызывает `gen_test_listings.py` (листинги в `listings/generated-tests/`) и собирает четыре PDF.
Листинги автотестов генерируются отдельно от приложения А:
```bash
cd Report
python3 scripts/gen_test_listings.py
```
Отдельно:
```bash
cd Report
typst compile --root .. testing-export/01_plan_testing.typ
```
Скрипт вызывает `gen_test_listings.py` (листинги в `listings/generated-tests/`) и собирает три PDF.
## Связь с полной ПЗ
Полная глава 5 подключает те же фрагменты через `Report/includes/ch05.typ`. При правке тестирования меняйте файлы в `includes/testing/`, затем пересоберите ПЗ и экспорт.
- Глава 5: `Report/includes/ch05.typ` и фрагменты `Report/includes/testing/`.
- Требования: `Report/includes/ch01.typ` (экспорт — `includes/testing-export/requirements.typ`).
- При правке тестирования меняйте `includes/testing/` и `ch05.typ`, затем пересоберите ПЗ и `./build.sh`.
## Устаревшие файлы
Ранее собирались четыре PDF по критериям 1.11.4 (`01_plan_testing``04_test_report`) — это **не** соответствует формулировке задания на загрузку; исходники удалены.

View File

@@ -0,0 +1,9 @@
#import "_document.typ": testing-export-doc
#show: testing-export-doc.with(
title: [Тестирование программного обеспечения],
criterion: [Файл 1 раздел пояснительной записки по тестированию ПО],
)
#include "../includes/testing-export/ch05-export-labels.typ"
#include "../includes/ch05.typ"

View File

@@ -0,0 +1,8 @@
#import "_document.typ": testing-export-doc
#show: testing-export-doc.with(
title: [Требования к приложению],
criterion: [Файл 3 требования к приложению (анализ предметной области и аналогов)],
)
#include "../includes/testing-export/requirements.typ"

View File

@@ -0,0 +1,8 @@
#import "_document.typ": testing-export-doc
#show: testing-export-doc.with(
title: [Модульное тестирование и наборы тестов],
criterion: [Файл 4 код модулей unit-тестирования, наборы тестов],
)
#include "../includes/testing-export/unit-tests.typ"

View File

@@ -1,5 +1,5 @@
#!/usr/bin/env bash
# Сборка четырёх PDF для загрузки по критериям тестирования.
# Три PDF для загрузки по заданию (п. 1, 3, 4). ТЗ (п. 2) — отдельно у студента.
set -euo pipefail
REPORT="$(cd "$(dirname "$0")/../.." && pwd)"
@@ -9,16 +9,14 @@ cd "$REPORT"
python3 scripts/gen_test_listings.py
stems=(
01_plan_testing
02_test_sets
03_automation_code
04_test_report
export_01_testing_section
export_03_requirements
export_04_unit_tests
)
pdfs=(
"КТбо4-9_ПытковРЕ_1.1_План_тестирования.pdf"
"КТбо4-9_ПытковРЕ_1.2_Наборы_тестов.pdf"
"КТбо4-9_ПытковРЕ_1.3_Автоматизированноеестирование.pdf"
"КТбо4-9_ПытковРЕ_1.4_Отчёт_о_проведении_тестирования.pdf"
"КТбо4-9_ПытковРЕ_1_Раздел_ПЗ_ТестированиеО.pdf"
"КТбо4-9_ПытковРЕ_3_Требования_к_приложению.pdf"
"КТбо4-9_ПытковРЕ_4_Код_и_наборы_тестов.pdf"
)
for i in "${!stems[@]}"; do
@@ -28,5 +26,5 @@ for i in "${!stems[@]}"; do
typst compile --root .. "$EXPORT/$stem.typ" "$EXPORT/$pdf"
done
echo "Done:"
echo "Done (ТЗ — п. 2 — загружается отдельно):"
printf ' %s\n' "${pdfs[@]}"

File diff suppressed because one or more lines are too long