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

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.assertEqual
  • test_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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:09:07