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
相关产品推荐
相关产品推荐

