CS50P Pset5 fuel.py单元测试异常:本地Pytest通过但CS50测试报错
CS50P Pset5 Fuel Gauge 重构问题解决
核心问题分析
- 函数参数不符合作业要求:
convert要求接收X/Y格式的字符串,但你的代码现在接收split后的列表,CS50官方测试会传入类似"3/4"的字符串,直接调用会报错。gauge要求接收整数百分比,但你的代码现在接收列表,还重复计算百分比,完全偏离要求。
- 测试文件无效:多个同名测试函数(比如3个
test_convert),pytest只会执行最后一个,导致你误以为本地测试全过,实际大部分测试没执行;且测试用例传参错误,比如convert("3", "4")传两个参数,但函数定义仅接收一个参数。 - main函数逻辑错误:调用
convert和gauge时传split后的列表,而非符合要求的参数;异常处理直接raise终止程序,不符合“输入错误时重新提示”的交互要求。 - 函数返回/异常逻辑不完整:
convert仅在1<百分比<99时返回值,0、1、99、100时返回None,不符合要求。gauge依赖原分数判断而非传入的整数,逻辑错误。
修正后的fuel.py代码
def main(): while True: try: fraction = input("Fraction: ").strip() percentage = convert(fraction) print(gauge(percentage)) break except (ValueError, ZeroDivisionError): pass # 输入错误时重新提示,不终止程序 def convert(fraction): # 分割字符串为X和Y try: x_str, y_str = fraction.split('/') x = int(x_str) y = int(y_str) except ValueError: # 无法分割或转换为整数时抛ValueError raise ValueError("Invalid fraction format") if y == 0: raise ZeroDivisionError("Cannot divide by zero") if x > y: raise ValueError("X cannot be greater than Y") # 计算百分比并四舍五入为整数 return round((x / y) * 100) def gauge(percentage): if percentage <= 1: return "E" elif percentage >= 99: return "F" else: return f"{percentage}%" if __name__ == "__main__": main()
修正后的测试文件test_fuel.py
import pytest from fuel import convert, gauge def test_convert_valid(): assert convert("3/4") == 75 assert convert("1/2") == 50 assert convert("99/100") == 99 assert convert("1/100") == 1 def test_convert_zero_division(): with pytest.raises(ZeroDivisionError): convert("3/0") def test_convert_invalid_format(): with pytest.raises(ValueError): convert("3") # 没有/ convert("a/4") # 非数字 convert("5/4") # X大于Y def test_gauge(): assert gauge(0) == "E" assert gauge(1) == "E" assert gauge(99) == "F" assert gauge(100) == "F" assert gauge(50) == "50%" assert gauge(75) == "75%"
关键修正说明
- 参数匹配作业要求:
convert接收字符串,内部分割处理,返回0-100的整数。gauge接收整数百分比,直接根据数值返回对应结果。
- 测试文件修复:
- 每个测试函数命名唯一,覆盖所有合法/非法场景。
- 测试用例符合函数参数要求,比如给
convert传字符串"3/4"而非列表。
- main函数逻辑优化:
- 输入错误时仅重新循环提示,不抛出异常终止程序,符合交互需求。
- 正确调用
convert和gauge:先将输入字符串传给convert得到整数,再把整数传给gauge。
- 异常和返回值完善:
convert处理所有非法情况(格式错误、除零、X>Y)并抛出对应异常。- 所有合法计算都返回整数,无遗漏情况。
gauge完全依赖传入的整数判断,逻辑简洁正确。
内容的提问来源于stack exchange,提问作者Tumelo Monaheng
相关产品推荐
相关产品推荐

