async with AsyncClient(app=app, base_url="http://test") as ac:
response = await ac.post(
"/articles/1/like",
headers={"X-User-ID": "123"}
)
assert response.status_code == 200
data = response.json()
assert data["current_likes"] == 1
复制代码
4.2 异常流程测试
async def test_failed_transaction():
with patch("UserLikeRecord.create", side_effect=Exception("DB Error")):
response = await ac.post(
"/articles/1/like",
headers={"X-User-ID": "123"}
)
assert response.status_code == 500
# 验证补偿是否执行
article = await Article.get(id=1)
assert article.likes == 0
复制代码
5. 课后Quiz
Q1:为什么补偿操纵必要设计为幂等?
A. 提高系统性能
B. 防止重复补偿导致数据错误
C. 减少数据库连接数
D. 满意HTTP协议规范 正确答案:B
分析:网络重试可能导致补偿操纵被多次触发,幂等设计确保多次执行效果一致,制止数据不一致。 Q2:以下哪些情况必要触发补偿机制?(多选)
A. 用户服务数据库连接超时
B. 文章不存在返回404错误
C. 用户重复点赞
D. 数据库主从同步延迟 正确答案:A
分析:404属于业务校验错误应在事务开始前检查,重复点赞属于业务逻辑错误,主从同步属于基础架构题目。只有跨服务操纵失败必要补偿。
6. 常见报错与办理方案