You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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%"

关键修正说明

  1. 参数匹配作业要求:
    • convert 接收字符串,内部分割处理,返回0-100的整数。
    • gauge 接收整数百分比,直接根据数值返回对应结果。
  2. 测试文件修复:
    • 每个测试函数命名唯一,覆盖所有合法/非法场景。
    • 测试用例符合函数参数要求,比如给convert传字符串"3/4"而非列表。
  3. main函数逻辑优化:
    • 输入错误时仅重新循环提示,不抛出异常终止程序,符合交互需求。
    • 正确调用convert和gauge:先将输入字符串传给convert得到整数,再把整数传给gauge。
  4. 异常和返回值完善:
    • convert 处理所有非法情况(格式错误、除零、X>Y)并抛出对应异常。
    • 所有合法计算都返回整数,无遗漏情况。
    • gauge 完全依赖传入的整数判断,逻辑简洁正确。

内容的提问来源于stack exchange,提问作者Tumelo Monaheng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 10:57:55