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

Python新手求助:无框架/assert的自定义测试函数编写示例

问题分析与解决方案

一、你的模块代码存在的问题

首先看你提供的模块代码,有几个明显错误:

  • 所有函数里的第二个return语句永远不会执行,因为return会直接终止函数运行,比如sum_ave里return sum_value(a,b)之后,后面的代码都不会被执行;
  • 函数里的注释变量(比如sum_1里的c、averg里的avg)没有实际定义,属于无效代码;
  • 模块末尾的while True:循环如果没有终止条件,导入模块时会直接进入死循环,导致主文件无法正常运行,建议把这个循环移到主文件里。

修正后的模块代码示例(假设模块名为calc_funcs.py):

def sum_1(a, b):
    # 转为浮点数计算,避免整数相加的局限
    return float(a) + float(b)
    
def averg(a, b):
    total = float(a) + float(b)
    return total / 2

# 移除模块里的while循环,放到主文件中

二、你的测试代码失败原因

你调用sum_1([2],[4])时,传入的是两个列表,列表相加是拼接操作,结果是[2,4]而不是[6];同时averg([2],[4])会尝试把列表[2,4]除以2,直接触发类型错误,所以测试必然失败。

正确的测试应该传入数值类型(整数/浮点数),而不是列表。

三、简易测试函数示例

1. 针对你的求和/求平均函数的测试

主文件代码(导入模块后编写测试):

from calc_funcs import sum_1, averg

def test_sum_1():
    """测试sum_1函数的正确性"""
    print(test_sum_1.__doc__)
    # 测试用例:正常整数、浮点数、混合类型
    test_cases = [
        (2, 4, 6.0),
        (3.5, 2.5, 6.0),
        (0, -5, -5.0),
    ]
    passed = 0
    total = len(test_cases)
    for a, b, expected in test_cases:
        result = sum_1(a, b)
        if result == expected:
            passed += 1
            print(f"测试用例({a}, {b}): 通过")
        else:
            print(f"测试用例({a}, {b}): 失败,预期{expected},实际{result}")
    print(f"\nsum_1函数测试结果:{passed}/{total} 通过\n")

def test_averg():
    """测试averg函数的正确性"""
    print(test_averg.__doc__)
    test_cases = [
        (2, 4, 3.0),
        (3.5, 2.5, 3.0),
        (0, -5, -2.5),
    ]
    passed = 0
    total = len(test_cases)
    for a, b, expected in test_cases:
        result = averg(a, b)
        if result == expected:
            passed += 1
            print(f"测试用例({a}, {b}): 通过")
        else:
            print(f"测试用例({a}, {b}): 失败,预期{expected},实际{result}")
    print(f"\naverg函数测试结果:{passed}/{total} 通过\n")

# 执行所有测试
if __name__ == "__main__":
    test_sum_1()
    test_averg()
    # 这里可以放原来的while循环交互逻辑
    while True:
        try:
            num1 = input("请输入第一个数:")
            num2 = input("请输入第二个数:")
            total = sum_1(num1, num2)
            avg = averg(num1, num2)
            print(f"求和结果:{total},平均值:{avg}")
        except ValueError:
            print("请输入有效的数字!")
        choice = input("继续计算?(y/n):")
        if choice.lower() != 'y':
            break

2. 扩展:简易计算器(加减乘除)的测试示例

先在模块calc_funcs.py里添加函数:

def subtract(a, b):
    return float(a) - float(b)

def multiply(a, b):
    return float(a) * float(b)

def divide(a, b):
    if float(b) == 0:
        raise ValueError("除数不能为0")
    return float(a) / float(b)

然后主文件里的测试函数:

from calc_funcs import subtract, multiply, divide

def test_subtract():
    """测试减法函数"""
    print(test_subtract.__doc__)
    test_cases = [
        (5, 3, 2.0),
        (2.5, 4.5, -2.0),
        (-3, -5, 2.0),
    ]
    passed = 0
    total = len(test_cases)
    for a, b, expected in test_cases:
        result = subtract(a, b)
        if result == expected:
            passed +=1
            print(f"测试用例({a}-{b}): 通过")
        else:
            print(f"测试用例({a}-{b}): 失败,预期{expected},实际{result}")
    print(f"\n减法函数测试结果:{passed}/{total} 通过\n")

def test_multiply():
    """测试乘法函数"""
    print(test_multiply.__doc__)
    test_cases = [
        (5, 3, 15.0),
        (2.5, 4, 10.0),
        (-3, -5, 15.0),
        (0, 100, 0.0),
    ]
    passed = 0
    total = len(test_cases)
    for a, b, expected in test_cases:
        result = multiply(a, b)
        if result == expected:
            passed +=1
            print(f"测试用例({a}*{b}): 通过")
        else:
            print(f"测试用例({a}*{b}): 失败,预期{expected},实际{result}")
    print(f"\n乘法函数测试结果:{passed}/{total} 通过\n")

def test_divide():
    """测试除法函数"""
    print(test_divide.__doc__)
    # 正常用例
    normal_cases = [
        (6, 3, 2.0),
        (5, 2, 2.5),
        (-6, -3, 2.0),
    ]
    # 异常用例(除数为0)
    error_cases = [0, 0.0]
    
    passed = 0
    total = len(normal_cases) + len(error_cases)
    
    # 测试正常用例
    for a, b, expected in normal_cases:
        result = divide(a, b)
        if result == expected:
            passed +=1
            print(f"测试用例({a}/{b}): 通过")
        else:
            print(f"测试用例({a}/{b}): 失败,预期{expected},实际{result}")
    
    # 测试异常用例
    for b in error_cases:
        try:
            divide(10, b)
            print(f"测试用例(10/{b}): 失败,未抛出除数为0的异常")
        except ValueError as e:
            if str(e) == "除数不能为0":
                passed +=1
                print(f"测试用例(10/{b}): 通过")
            else:
                print(f"测试用例(10/{b}): 失败,抛出异常错误:{e}")
    
    print(f"\n除法函数测试结果:{passed}/{total} 通过\n")

# 执行测试
if __name__ == "__main__":
    test_subtract()
    test_multiply()
    test_divide()

3. 扩展:n个数求和/求积的测试示例

模块calc_funcs.py添加函数:

def sum_n(*args):
    # 接收任意数量的参数,求和
    total = 0.0
    for num in args:
        total += float(num)
    return total

def product_n(*args):
    # 接收任意数量的参数,求积
    if not args:
        return 0.0  # 空参数返回0,或者根据需求调整
    result = 1.0
    for num in args:
        result *= float(num)
    return result

主文件测试函数:

from calc_funcs import sum_n, product_n

def test_sum_n():
    """测试n个数求和函数"""
    print(test_sum_n.__doc__)
    test_cases = [
        ((1,2,3), 6.0),
        ((2.5, 3.5, 4), 10.0),
        ((-1, -2, 3), 0.0),
        ((), 0.0),  # 空参数
    ]
    passed = 0
    total = len(test_cases)
    for args, expected in test_cases:
        result = sum_n(*args)
        if result == expected:
            passed +=1
            print(f"测试用例{args}: 通过")
        else:
            print(f"测试用例{args}: 失败,预期{expected},实际{result}")
    print(f"\nn个数求和测试结果:{passed}/{total} 通过\n")

def test_product_n():
    """测试n个数求积函数"""
    print(test_product_n.__doc__)
    test_cases = [
        ((1,2,3), 6.0),
        ((2.5, 4), 10.0),
        ((-1, -2, 3), 6.0),
        ((), 0.0),  # 空参数
        ((0, 5, 10), 0.0),
    ]
    passed = 0
    total = len(test_cases)
    for args, expected in test_cases:
        result = product_n(*args)
        if result == expected:
            passed +=1
            print(f"测试用例{args}: 通过")
        else:
            print(f"测试用例{args}: 失败,预期{expected},实际{result}")
    print(f"\nn个数求积测试结果:{passed}/{total} 通过\n")

# 执行测试
if __name__ == "__main__":
    test_sum_n()
    test_product_n()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 17:17:32