Введение
FIELDNOTES — небольшой учебный музей. Посетители знакомятся с выставкой, находят вход и скачивают путеводитель для чтения без интернета. Перед изменением сайта нужны проверки полного пути посетителя, а не только успешного ответа главной страницы.
Вы дополните небольшой тест Python, убедитесь, что он принимает исправный пакет, и отклоните отсутствующие или вводящие в заблуждение загрузки. Достаточно базовых навыков терминала: необходимые сведения о Python и HTTP объясняются здесь. Разрабатывать сайт, устанавливать программы и заводить внешние учётные записи не нужно. Музей и адрес вымышлены.
Live Website — текущий сайт на порту 8081. Candidate Preview — независимый предпросмотр на порту 8082. Workstation — подготовленный терминал в /home/labex/project/release-gate. Каждый раздел начинается независимо; предпросмотр никогда не меняет опубликованный сайт.
Проверить полный путь посетителя
На этом шаге вы превратите реальное требование посетителя в автоматическую проверку и докажете, что она различает исправные и дефектные пакеты. Начните в Live Website.
Познакомьтесь с нормальной работой
Откройте Explore the exhibition ↗, прочитайте Close to home, затем выберите Plan your visit ↗. На странице посещения указано Entrance: East gate. Выберите Download visitor guide ↓ и откройте скачанный текст: он тоже должен содержать Entrance: East gate. Загрузка — файл, сохранённый браузером; его расположение зависит от настроек загрузок. Вернитесь на главную через FIELDNOTES. Также откройте Visit и Step-free route ↗: страница доступного маршрута и её загрузка описывают Garden ramp. Эти функции должны сохраниться.
Перейдите в Workstation. ls выводит имена в каталоге, а cat — содержимое файла:
ls
Должны присутствовать packages, drafts, live, preview, tests.py, pipeline.sh и tools.py. Пакет — сохранённый набор файлов; .tar.gz — формат сжатого архива. drafts/ — редактируемая рабочая копия. tools.py — предоставленный локальный исполнитель, а не размещённый сервис CI.
cat tests.py
HTTP — протокол запросов и ответов браузера. 200 означает успешный ответ, 404 — отсутствие запрошенного ресурса. Ответ 200 с неверным входом всё равно нарушает требование посетителя. Ошибка соединения означает, что пригодный ответ не получен.
Дополните проверку содержимого
python3 выполняет код Python. Готовая функция read(base, path) запрашивает путь и возвращает его текст. base — адрес временного сервера, выбранный исполнителем. def определяет функцию; строки с отступом относятся к ней. with закрывает ответ после чтения. assert condition, 'message' завершает проверку с ошибкой, если условие ложно. in проверяет наличие ожидаемого текста в ответе. Текст в кавычках — буквальная строка. = присваивает значение, + соединяет текст. Нужно добавить только утверждение для путеводителя, но для надёжного редактирования ниже приведён весь небольшой файл.
cat > tests.py заменяет файл. <<'PYTHON' начинает here-document: вставьте весь блок, включая заключительный PYTHON на отдельной строке. Кавычки сохраняют код буквально. В точности сохраните отступы:
cat > tests.py <<'PYTHON'
from urllib.request import urlopen
def read(base, path):
with urlopen(base + path, timeout=3) as response:
assert response.status == 200, 'Expected HTTP 200: ' + path
return response.read().decode('utf-8')
def check(base):
home = read(base, '/')
assert 'FIELDNOTES' in home, 'Missing museum homepage'
assert 'href="/visit.html"' in home, 'Missing visit link'
visit = read(base, '/visit.html')
assert 'Entrance: East gate' in visit, 'Wrong entrance on visit page'
assert 'href="downloads/guide.txt"' in visit, 'Missing visitor download link'
guide = read(base, '/downloads/guide.txt')
assert 'Entrance: East gate' in guide, 'Wrong visitor guide content'
PYTHON
Страница использует href="downloads/guide.txt" — относительную ссылку. Со страницы /visit.html она разрешается в /downloads/guide.txt. Ссылка, начинающаяся с /, отсчитывается от корня сайта. Проверяйте и настоящую ссылку, и содержимое цели: проверка другого, неиспользуемого URL может пропустить проблему посетителя.
Проверьте тест, прежде чем доверять ему
Действие check распаковывает один пакет во временный каталог, запускает настоящий HTTP-сервер и вызывает check(base). Успешно проверенные байты сохраняются для дальнейшего использования. Пакет не публикуется и не исправляется:
python3 tools.py check packages/reference.tar.gz
Ожидается PASS: visitor checks. Frozen package .... Идентификатор в конце меняется. Если Python сообщает SyntaxError или IndentationError, неисправен сам тест. Перезапишите блок и сначала повторите проверку заведомо исправного эталона, а затем оценивайте кандидатов.
Выполните две намеренно неудачные проверки:
python3 tools.py check packages/missing.tar.gz
Ожидается FAIL: HTTP Error 404: File not found: загрузка отсутствует. Продолжайте в том же терминале; ошибка не закрывает его.
python3 tools.py check packages/wrong.tar.gz
Ожидается FAIL: Wrong visitor guide content. Этот кандидат возвращает 200, но направляет посетителей к неверному входу. Не удаляйте утверждение ради успешного результата. Тест, отклоняющий эталон или принимающий такого кандидата, бесполезен.
Сравните результаты в браузере
preview выбирает файлы только для Candidate Preview:
python3 tools.py preview packages/wrong.tar.gz
Перейдите в Candidate Preview и перезагрузите страницу. Откройте выставку, затем Plan your visit. На странице всё ещё указано East gate, но в скачанном путеводителе — West gate. Это расхождение объясняет необходимость проверки содержимого.
Вернитесь в Workstation и выберите предпросмотр исправного кандидата:
python3 tools.py preview packages/candidate.tar.gz
В Candidate Preview вернитесь на главную, перезагрузите её и повторите посещение и загрузку: теперь в обоих местах East gate. Исходный сайт в Live Website продолжает работать. Вы проверили полезное для посетителя поведение, не публикуя дефектных кандидатов. Скачивание в браузере само по себе не запускает автоматический тест; эти наблюдения дают разные доказательства.
Резюме
Вы проверили путь посетителя, дополнили утверждение о содержимом и отличили отсутствующую загрузку от успешного ответа с неверным текстом. Опубликованный сайт не изменился.



