Итоговый проект: аудит отчёта и целостности
Собираем воспроизводимый SQL-пакет, который обнаруживает три дефекта отчёта и подтверждает безопасный откат.
- Связать требование, запрос, точный оракул и фактический результат.
- Показать контрпримеры для потери строк, размножения и NULL.
- Передать коллеге полный пакет запуска с границами вывода.
Задача проекта
Команда OrbitDesk готовит отчёт по работе пользователей. В нём должны остаться все четыре участника, число опубликованных задач каждого и отдельный список задач без комментариев. Старый вариант теряет пользователей без публикаций, новый после добавления комментариев завышает счётчик, а поиск свободных исполнителей возвращает пусто. Ваша работа — объяснить три независимые причины и передать исправления с доказательствами на SQLite-CORE-1.
Не начинайте с общего процента успешности. Сначала составьте матрицу: требование, идентификатор проверки, исходные строки, ожидаемые строки, фактические строки, статус. Результат «пройдено» допустим после запуска, а до него указывайте «не выполнено». Готовые ответы служат независимым оракулом и учебным разбором, но не являются доказательством вашего локального исполнения. Если SQLite недоступна, можно выполнить ручной разбор и честно оставить технический запуск незавершённым.
Минимальный полезный пакет
Включите fixture без клиентских данных, queries с Q1–Q13, JSON точных ожиданий, отдельный сценарий транзакций и команду python3 verify-sql.py. Для ручного запуска объясните, как создать новую пустую базу и включить внешние ключи на каждом используемом соединении. Не добавляйте DROP для удобства повторного выполнения в произвольном файле: однозначное создание изолированной базы делает восстановление прозрачнее.
Основные оракулы: опубликованные задачи по авторам u1=2,u2=1,u3=0,u4=0; задачи без комментариев t2,t4,t6; пользователь без назначений u4. После соединения с comments первый отчёт должен остаться прежним. Число всех задач шесть, оценённых четыре, сумма десять, среднее известных 2,5. Эти числа проверяют разные свойства; одно не заменяет другое. Для t2 после завершённого сценария отката требуются title=Draft,estimate=NULL,priority=1.
Как описать найденный дефект
Для потери пользователей приложите неправильный WHERE и его фактические строки: только u1 и u2. Для размножения покажите промежуточные t1/c1,t1/c2,t5/c5, затем неправильные 3 и 2 вместо 2 и 1. Для NOT IN приложите наличие NULL в assignee_id и ожидаемого u4. Каждый пример должен воспроизводиться на неизменённом снимке; исправление одного запроса не должно случайно менять данные для другого.
Отделяйте дефект самого SQL от изменения требования. Если менеджер теперь хочет исключить участников без публикаций, прежний полный список уже не тот оракул. Зафиксируйте новую версию постановки и пересчитайте ожидания. Аналогично «создатель» и «исполнитель» не взаимозаменяемы: переключение поля меняет предмет отчёта. В учебном проекте договор фиксирован, поэтому исправления можно оценить однозначно.
Границы результата
Успех этого проекта означает, что вы умеете читать схему, строить проверяемые запросы и объяснять последствия JOIN, NULL и транзакций на конкретном снимке. Он не доказывает качество реального отчёта под нагрузкой, безопасность доступа или соответствие другой СУБД. SQLite и PostgreSQL имеют различия, поэтому перенос требует проверки синтаксиса, типов и ограничений целевой системы.
Перед передачей распакуйте пакет в новую папку и повторите команду по собственной инструкции. Уберите абсолютные личные пути и случайные файлы базы. Запишите версию SQLite и Python, фактическое число проверок и код завершения. В рубрике оцените воспроизводимость, точность результатов, объяснение контрпримеров и честность статусов. Красивый отчёт без возможности заново получить строки не закрывает проект; небольшой пакет с точным оракулом и понятным запуском уже полезен коллеге.
Источники и проверка фактов
SQLite · Command-line shellРучная работа с изолированной базой и выводом.Python · sqlite3Встроенное соединение с SQLite и обработка ошибок.Авторский учебный материал · Редакция QA Orbit · версия 2026-10-28.1