GitHub Actions CI/CD中Python断言错误排查(AWS SAM部署场景)
问题原因分析
核心矛盾:返回体格式与测试断言预期不匹配
app.py中Lambda函数返回的body是纯字符串格式的访问计数(例如"39"),直接返回了visit_count变量的原始值。- 但
test_handler.py的测试逻辑要求body是包含visit_count键的JSON字符串,执行assert "visit_count" in ret["body"]时,实际是检查字符串"39"中是否包含子串"visit_count",显然不成立,触发AssertionError。
代码细节对比
当前app.py的返回格式(不符合测试预期)
return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': '*', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': '*' }, 'body': visit_count # 直接返回数字字符串 }
测试用例的预期格式
测试后续执行json.loads(ret["body"])["visit_count"],说明期望body是JSON序列化后的对象,格式应为:
{"visit_count": "39"}
修复方案(二选一即可)
方案1:修改app.py,返回符合测试预期的JSON格式
将返回的body封装为包含visit_count键的JSON对象并序列化:
return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': '*', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': '*' }, 'body': json.dumps({"visit_count": visit_count}) # 转为JSON格式字符串 }
方案2:修改test_handler.py,适配当前app.py的返回格式
如果不需要调整Lambda的返回逻辑,直接修改测试断言:
# 替换原有的statusCode分支判断代码 if ret["statusCode"] == 200: assert ret["body"].isnumeric() # 直接验证body是合法数字字符串 else: assert ret["body"] == "-1"
额外优化建议
当前app.py硬编码了表名'resume-website-app-tbl',但测试用例尝试从环境变量TABLENAME读取表名,二者不统一,后续可能出现环境不一致问题,建议将表名改为从环境变量获取:
import os table = dynamodb.Table(os.environ['TABLENAME'])
内容的提问来源于stack exchange,提问作者Justin Henson
相关产品推荐
相关产品推荐

