Unittest执行异常:显示运行0个测试用例的问题排查
问题排查与修复方案
一、测试未运行(Ran 0 tests)的修复
- 添加测试运行入口:在测试脚本末尾补充以下代码,直接运行脚本时就能触发unittest执行测试用例:
if __name__ == '__main__': unittest.main()
- 或使用命令行执行:在终端运行
python -m unittest your_test_file.py(替换成你的测试文件名),这种方式无需添加入口代码,Python会自动调用unittest的测试运行器。
二、测试用例的错误修正
你的测试用例存在两处关键问题:
- 错误断言:
self.assertEqual(E.purchase_prompt(), True)完全不成立,purchase_prompt返回的是用户输入的金额(float类型),并非布尔值。 - 依赖手动输入:自动化测试不能依赖人工输入,需要通过mock模拟用户输入行为。
修正后的测试用例示例(使用unittest.mock实现输入模拟):
import unittest from unittest.mock import patch from Expense_Tracker import Expense class TestCurrentBudget(unittest.TestCase): def test_add_expense(self): E = Expense() E.Add_Budget(2000) # 验证支出扣除逻辑 self.assertEqual(E.add_expense(100), 1900) @patch('builtins.input', return_value='500') def test_purchase_prompt(self, mock_input): E = Expense() # 模拟输入500,验证返回值正确性 self.assertEqual(E.purchase_prompt(), 500.0)
- 将不同测试逻辑拆分到独立的
test_方法中,便于问题定位,也符合单一职责原则。
三、Expense类代码的bug修复
purchase_prompt方法存在两处逻辑错误,导致无法正常验证输入:
- 类型判断逻辑错误:
if self.new_expense == int:是判断变量是否等于int类型,这永远为False。如果需要验证输入为整数,应使用self.new_expense.is_integer();如果只需确保输入为正数,改为if self.new_expense > 0更合理。 - return位置错误:
return self.new_expense放在while循环内部,导致第一次循环无论输入是否有效都会直接返回,循环验证逻辑完全失效。
修正后的purchase_prompt方法:
def purchase_prompt(self): """Prompts user for a numerical value when adding their expense""" is_valid = False while not is_valid: try: self.new_expense = float(input("Please enter your expense($):")) # 验证输入为正数,可根据实际需求调整判断条件 if self.new_expense > 0: is_valid = True except ValueError: # 仅捕获无法转为float的输入异常,避免捕获无关异常 print("Wrong input! Please enter a valid number.") return self.new_expense
内容的提问来源于stack exchange,提问作者Kayla
相关产品推荐
相关产品推荐

