Test Driven Development
A unit is a class or a function. A test is running the unit and checking the result against and expected, designed value.
A unit might need more than one test, to check the result when using parameters for different designed scenarios.
If the unit uses other units when it executes, some setup might be required to isolate the unit under test, by creating mocks of the other units. Those mocks need to be tore down after the test.
Methodology
Follow these steps for each unit [1] :
-
Design
-
Test fails
-
Implement
-
Test passes
Test template
import unittest
class Function(unittest.TestCase):
def test_case(self):
from module import function
result = function()
expected = 5
self.assertEqual(result, expected)
If unit isolation is needed:
def setUp(self):
def tearDown(self):
Mocks
Mocks are callable and create attributes as new mocks when you access them [2] . The return value of calling the mock can be set either way:
function = Mock(return_value=True)
function = Mock()
function.return_value=True
Frequently used methods:
function.assert_called()
function.assert_called_once()
function.assert_called_with(*argv, **kwargs)
function.assert_called_once_with(*argv, **kwargs)
Frequently used attributes:
function.called
function.call_count
Setting up and tearing down the mock for a built-in function, for
example input()
:
def setUp(self):
from unittest.mock import Mock
import module
module.input = Mock(return_value='y')
def tearDown(self):
import module
del module.attribute
References
- Introducción a Test Driven Development, presented in LinuxCabal, March 24th, 2012, PDF, Video
- The Mock Class