Python Unittest测试银行账户合法与非法存款问题求助
嘿,刚接触unittest踩点小坑太正常了,我帮你把代码理顺,同时把两个测试场景的正确写法给你讲清楚~
首先得先完善你的BankAccount类,原有的deposit_funds方法没有做任何参数校验,传入字符串这类非法值时只会因为类型不兼容报错,不是主动抛出的可控异常,我们先补上校验逻辑:
修正后的bankaccount.py
class BankAccount(): def __init__(self): self.account_number=0 self.pin_number="" self.balance=0.0 self.interest=0.0 self.transaction_list=[] def deposit_funds(self, amount): # 校验金额是否为合法数值类型(int或float) if not isinstance(amount, (int, float)): raise TypeError("存款金额必须是整数或浮点数") # 额外补充:禁止存入非正数 if amount <= 0: raise ValueError("存款金额必须大于0") self.balance += amount def withdraw_funds(self, amount): # 原代码bug:balance是实例属性,必须加self.调用 if amount <= self.balance: self.balance -= amount else: # 补充余额不足的异常抛出,让方法行为更明确 raise ValueError("余额不足")
接下来看测试代码的问题:
test_legal_deposit_works里用self.assertTrue完全错误,因为deposit_funds没有返回值,你需要验证的是存款后的余额变化,应该用self.assertEqualtest_illegal_deposit_raises_exception没有实现核心逻辑,unittest验证异常需要用self.assertRaises上下文管理器(或装饰器)
修正后的测试代码
import unittest from bankaccount import BankAccount class TestBankAccount(unittest.TestCase): def setUp(self): # 每个测试方法执行前都会初始化一个独立的账户对象,避免测试间互相影响 self.account = BankAccount() self.account.balance = 1000.0 def test_legal_deposit_works(self): initial_balance = self.account.balance # 执行存款操作 self.account.deposit_funds(100) # 验证余额正确增加 self.assertEqual(self.account.balance, initial_balance + 100) def test_illegal_deposit_raises_exception(self): # 测试存入字符串"apple",验证抛出TypeError with self.assertRaises(TypeError) as context: self.account.deposit_funds("apple") # 可选:验证异常提示信息是否符合预期 self.assertEqual(str(context.exception), "存款金额必须是整数或浮点数") # 测试另一个非法字符串"lizard" with self.assertRaises(TypeError): self.account.deposit_funds("lizard") # 额外测试:存入负数也属于非法操作,会抛出ValueError with self.assertRaises(ValueError): self.account.deposit_funds(-50) if __name__ == '__main__': unittest.main()
几个关键细节提醒:
setUp方法的作用是为每个测试用例准备独立的测试环境,确保测试结果不受其他用例影响assertRaises是unittest专门用于异常验证的工具,上下文管理器的写法最直观易懂- 给业务方法补充明确的异常抛出,能让代码逻辑更清晰,也让单元测试的验证目标更明确
内容的提问来源于stack exchange,提问作者Rakesh Shakya
相关产品推荐
相关产品推荐

