CS50p Refuel习题集:test_fuel.py本地测试通过但check50失败求助
CS50p Refuel习题集:test_fuel.py无法通过check50的问题排查
test_fuel.py中的关键错误
- test_convert函数的语法错误:第一个断言语句误用了单等号
=(赋值操作),正确的比较操作应该用双等号==:# 错误写法 assert convert("1/2") = 50 # 正确写法 assert convert("1/2") == 50 - test_gauge函数缺少断言逻辑:当前代码仅做了函数调用与值的比较,但未添加
assert关键字,导致这些测试实际上没有验证任何结果——pytest会默认标记这类无断言的测试为通过,但check50会检测测试的有效性。正确写法需补充assert:# 错误写法 gauge(50) == "50%" gauge(1) == "E" gauge(99) == "F" # 正确写法 assert gauge(50) == "50%" assert gauge(1) == "E" assert gauge(99) == "F"
fuel.py中不符合测试要求的问题
convert函数内部包含while True循环和input调用,违反了函数的单一职责原则:convert应该仅接收传入的字符串参数并返回计算结果,而非自行获取用户输入。check50的测试会直接传入参数调用convert,此时函数内部的input会打断测试流程,导致测试无法正常完成。同时,原代码用int()截断小数的方式不符合习题集要求的四舍五入规则。修改后的convert函数示例:
def convert(fraction): numerator, denominator = fraction.split("/") denominator = int(denominator) numerator = int(numerator) if denominator == 0: raise ZeroDivisionError if numerator > denominator: raise ValueError percent = round(numerator / denominator * 100) return percent
总结
修复test_fuel.py的断言错误,调整convert函数为纯函数(移除循环和输入逻辑),并修正百分比计算的四舍五入规则,即可通过check50的测试。
内容的提问来源于stack exchange,提问作者Balup
相关产品推荐
相关产品推荐

