Home > Software engineering >  Assertion error testing attributes and methods in a class
Assertion error testing attributes and methods in a class

Time:10-23

For the sake of practice, I am writing a class BankAccount to learn OOP in python. In an attempt to make my program more redundant am trying to write a test function test_BankBankAccount() to practice how to do test functions as well.

The test function test_BankBankAccount() is suppose to test that the methods deposit(), withdraw(), transfer() and get_balance() work as intended.

However, the test function fails because the methods inside of the computed_deposit = test_account.deposit(400), computed_transfer = test_account.transfer(test_account2, 200) and so on doesn't seem to store the values i asign to them.

**This is the error message I receive (which is the exact one i try to avoid) **

assert success1 and success2 and success3 and success4, (msg1, msg2, msg3, msg4)
AssertionError: ('computet deposit = None is not 400', 'computet transfer = None is not 200', 'computet withdrawal = None is not 200', 'computet balance = 0 is not 0')

Here is a snippet of much of the code I have written so far

class BankAccount:
    def __init__(self, first_name, last_name, number, balance):
        self._first_name = first_name
        self._last_name = last_name
        self._number = number
        self._balance = balance

    def deposit(self, amount):
        self._balance  = amount

    def withdraw(self, amount):
        self._balance -= amount

    def get_balance(self):
        return self._balance

    def transfer(self,other_account, transfer_amount):
        self.withdraw(transfer_amount)
        other_account.deposit(transfer_amount)                  

    def print_info(self):
        first = self._first_name
        last = self._last_name
        number = self._number
        balance = self._balance

        s = f"{first} {last}, {number}, balance: {balance}"

        print(s)

def main():

    def test_BankBankAccount():
        test_account = BankAccount("Dude", "man", "1234", 0)
        test_account2 = BankAccount("Dude2", "man2","5678", 0)

        expected_deposit = 400
        expected_withdrawal = 200
        expected_transfer = 200
        expected_get_balance = 0

        computed_deposit = test_account.deposit(400)
        computed_transfer = test_account.transfer(test_account2, 200)
        computed_withdrawal = test_account.withdraw(200)
        computed_get_balance = test_account.get_balance()

        #tol = 1E-17

        success1 = abs(expected_deposit == computed_deposit) #< tol
        success2 = abs(expected_transfer == computed_transfer) #< tol
        success3 = abs(expected_withdrawal == computed_withdrawal) #< tol
        success4 = abs(expected_get_balance == computed_get_balance)  #<tol

        msg1 = f"computet deposit = {computed_deposit} is not {expected_deposit}"
        msg2 = f"computet transfer = {computed_transfer} is not {expected_transfer}"
        msg3 = f"computet withdrawal = {computed_withdrawal} is not {expected_withdrawal}"
        msg4 = f"computet balance = {computed_get_balance} is not {expected_get_balance}"
        assert success1 and success2 and success3 and success4, (msg1, msg2, msg3, msg4)

    test_BankBankAccount()

My question is:

  • Is there anyone who is kind enough to help me fix this and spot my mistakes?

All help is welcomed and appreciated.

CodePudding user response:

The problem is that you are not returning anything from some of these member functions.

Try, for example, making deposit look like this:

def deposit(self, amount):
    self._balance  = amount
    return self._balance

CodePudding user response:

As an alternative to Goodword's answer, you might try:

        test_account.deposit(400)
        computed_deposit = test_account.get_balance()
        
        test_account.transfer(test_account2, 200)
        computed_withdrawal = test_account.get_balance()
        computed_transfer = test_account2.get_balance()

        test_account.withdraw(200)
        computed_get_balance = test_account.get_balance()

Regarding testing, hats off to you! I'd recommend familiarising yourself with Python's unittesting framework, as it will serve you well in the long run.

For example, you might define a class for testing your BankAccount, such as

import unittest
class TestBankAccount(unittest.TestCase):
    # setUp gets run before every individual test
    def setUp(self):
        self.account1 = BankAccount("First","Account","1234",0)
        self.account2 = BankAccount("Second","Account","5678",200)

    def test_deposit(self):
        self.account1.deposit(400)
        self.assertEqual(self.account1.get_balance(),400)

    def test_withdraw(self):
        self.account2.withdraw(200)
        self.assertEqual(self.account1.get_balance(),0)

    def test_transfer(self):
        self.account2.transfer(self.account1,200)
        self.assertEqual(self.account1.get_balance(),200)
        self.assertEqual(self.account2.get_balance(),0)

if __name__=="__main__":
    unittest.main()
        
  • Related