检查访客需要的路径

PythonBeginner
立即练习

介绍

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 中的原站仍然正常。你在没有发布坏候选的情况下检查了业务行为。浏览器下载本身不会运行自动检查;两种观察各自提供不同证据。

总结

你检查了访客路径,补全内容断言,并区分了下载缺失与响应成功但内容错误。正式站点始终未变。