Unit Testing

A unit test tests a small "unit" of code - usually a function or method - independently from the rest of the program.

Some key advantages of unit testing include:

  • Isolates code - This allows testing individual units in isolation from other parts of the codebase, making bugs easier to identify.

  • Early detection - Tests can catch issues early in development before code is deployed, saving time and money.

  • Regression prevention - Existing unit tests can be run whenever code is changed to prevent new bugs or regressions.

  • Facilitates changes - Unit tests give developers the confidence to refactor or update code without breaking functionality.

  • Quality assurance - High unit test coverage helps enforce quality standards and identify edge cases.

Every language has its unit testing framework. In Python, some popular ones are

  • unittest

  • pytest

  • doctest

  • testify

Example:

calc.py

def add(a,b):
    return a+b

def subtract(a,b):
    return a-b

def multiply(a,b):
    return a * b

def divide(a, b):
    return a / b

main.py

from calc import add, subtract, multiply, divide

print(add(1,2))
print(subtract(1,2))
print(multiply(1,2))
print(divide(1,2))

test_calc.py

from calc import *
import unittest 

class TestMathOperations(unittest.TestCase):
    def test_add(self):
        self.assertEqual(add(10, 5), 15)
        self.assertEqual(add(-1, 1), 0)
        self.assertEqual(add(-1, -1), -2)

    def test_subtract(self):
        self.assertEqual(subtract(10, 5), 5)
        self.assertEqual(subtract(-1, 1), -2)
        self.assertEqual(subtract(-1, -1), 0)

    def test_multiply(self):
        self.assertEqual(multiply(10, 5), 50)
        self.assertEqual(multiply(-1, 1), -1)
        self.assertEqual(multiply(-1, -1), 1)

    def test_divide(self):
        self.assertEqual(divide(10, 5), 2)
        self.assertEqual(divide(-1, 1), -1)
        self.assertEqual(divide(-1, -1), 1)
        self.assertRaises(ZeroDivisionError, divide, 10, 0)  # Test for division by zero

if __name__ == '__main__':
    unittest.main()

Last updated