test person with unittest


I want to use the unittest library in the person project.


preview

I have these tests by the end of the chapter

  1import unittest
  2import src.person
  3
  4
  5class TestPerson(unittest.TestCase):
  6
  7    def test_joe(self):
  8        first_name = 'joe'
  9        last_name = 'blow'
 10        sex = 'M'
 11        year_of_birth = 1996
 12
 13        reality = src.person.factory(
 14            first_name=first_name,
 15            last_name=last_name,
 16            sex=sex,
 17            year_of_birth=year_of_birth,
 18        )
 19        my_expectation = (
 20            f'{first_name}, {last_name},'
 21            f' {sex}, {year_of_birth}'
 22        )
 23        assert reality == my_expectation
 24        self.assertEqual(reality, my_expectation)
 25
 26        reality = src.person.say_hello(
 27            first_name=first_name,
 28            last_name=last_name,
 29            year_of_birth=year_of_birth,
 30        )
 31        my_expectation = (
 32            f'Hello, my name is {first_name}'
 33            f' {last_name} and I am'
 34            f' {2026-year_of_birth}.'
 35        )
 36        assert reality == my_expectation
 37        self.assertEqual(reality, my_expectation)
 38
 39        joe = src.person.Person(
 40            first_name=first_name,
 41            last_name=last_name,
 42            sex=sex,
 43            year_of_birth=year_of_birth,
 44        )
 45
 46        reality = joe.say_hello()
 47        assert reality == my_expectation
 48        self.assertEqual(reality, my_expectation)
 49
 50    def test_jane(self):
 51        first_name = 'jane'
 52        last_name = 'doe'
 53        sex = 'F'
 54        year_of_birth = 1991
 55
 56        reality = src.person.factory(
 57            first_name=first_name,
 58            last_name=last_name,
 59            sex=sex,
 60            year_of_birth=year_of_birth,
 61        )
 62        my_expectation = (
 63            f'{first_name}, {last_name},'
 64            f' {sex}, {year_of_birth}'
 65        )
 66        assert reality == my_expectation
 67        self.assertEqual(reality, my_expectation)
 68
 69        reality = src.person.say_hello(
 70            first_name=first_name,
 71            last_name=last_name,
 72            year_of_birth=year_of_birth,
 73        )
 74        my_expectation = (
 75            f'Hello, my name is {first_name}'
 76            f' {last_name} and I am'
 77            f' {2026-year_of_birth}.'
 78        )
 79        assert reality == my_expectation
 80        self.assertEqual(reality, my_expectation)
 81
 82        jane = src.person.Person(
 83            first_name=first_name,
 84            last_name=last_name,
 85            sex=sex,
 86            year_of_birth=year_of_birth,
 87        )
 88
 89        reality = jane.say_hello()
 90        assert reality == my_expectation
 91        self.assertEqual(reality, my_expectation)
 92
 93    def test_john(self):
 94        first_name = 'john'
 95        last_name = 'smith'
 96        sex = 'M'
 97        year_of_birth = 1580
 98
 99        reality = src.person.factory(
100            first_name=first_name,
101            last_name=last_name,
102            sex=sex,
103            year_of_birth=year_of_birth,
104        )
105        my_expectation = (
106            f'{first_name}, {last_name},'
107            f' {sex}, {year_of_birth}'
108        )
109        assert reality == my_expectation
110        self.assertEqual(reality, my_expectation)
111
112        reality = src.person.say_hello(
113            first_name=first_name,
114            last_name=last_name,
115            year_of_birth=year_of_birth,
116        )
117        my_expectation = (
118            f'Hello, my name is {first_name}'
119            f' {last_name} and I am'
120            f' {2026-year_of_birth}.'
121        )
122        assert reality == my_expectation
123        self.assertEqual(reality, my_expectation)
124
125        john = src.person.Person(
126            first_name=first_name,
127            last_name=last_name,
128            sex=sex,
129            year_of_birth=year_of_birth,
130        )
131
132        reality = john.say_hello()
133        assert reality == my_expectation
134        self.assertEqual(reality, my_expectation)
135
136    def test_mary(self):
137        first_name = 'mary'
138        last_name = 'public'
139        sex = 'F'
140        year_of_birth = 2000
141
142        reality = src.person.factory(
143            first_name=first_name,
144            last_name=last_name,
145            sex=sex,
146            year_of_birth=year_of_birth,
147        )
148        my_expectation = (
149            f'{first_name}, {last_name},'
150            f' {sex}, {year_of_birth}'
151        )
152        assert reality == my_expectation
153        self.assertEqual(reality, my_expectation)
154
155        reality = src.person.say_hello(
156            first_name=first_name,
157            last_name=last_name,
158            year_of_birth=year_of_birth,
159        )
160        my_expectation = (
161            f'Hello, my name is {first_name}'
162            f' {last_name} and I am'
163            f' {2026-year_of_birth}.'
164        )
165        assert reality == my_expectation
166        self.assertEqual(reality, my_expectation)
167
168        mary = src.person.Person(
169            first_name=first_name,
170            last_name=last_name,
171            sex=sex,
172            year_of_birth=year_of_birth,
173        )
174
175        reality = mary.say_hello()
176        assert reality == my_expectation
177        self.assertEqual(reality, my_expectation)
178
179    def test_dir_person_class(self):
180        reality = dir(src.person.Person)
181        my_expectation = [
182            '__class__',
183            '__delattr__',
184            '__dict__',
185            '__dir__',
186            '__doc__',
187            '__eq__',
188            '__firstlineno__',
189            '__format__',
190            '__ge__',
191            '__getattribute__',
192            '__getstate__',
193            '__gt__',
194            '__hash__',
195            '__init__',
196            '__init_subclass__',
197            '__le__',
198            '__lt__',
199            '__module__',
200            '__ne__',
201            '__new__',
202            '__reduce__',
203            '__reduce_ex__',
204            '__repr__',
205            '__setattr__',
206            '__sizeof__',
207            '__static_attributes__',
208            '__str__',
209            '__subclasshook__',
210            '__weakref__',
211            'say_hello'
212        ]
213        assert reality == my_expectation
214        self.assertEqual(reality, my_expectation)
215
216    def test_dir_person_instance(self):
217        an_instance_of_person = src.person.Person(
218            first_name='first_name',
219            last_name='last_name',
220            sex='M',
221            year_of_birth=2026,
222        )
223
224        reality = dir(an_instance_of_person)
225        my_expectation = [
226            '__class__',
227            '__delattr__',
228            '__dict__',
229            '__dir__',
230            '__doc__',
231            '__eq__',
232            '__firstlineno__',
233            '__format__',
234            '__ge__',
235            '__getattribute__',
236            '__getstate__',
237            '__gt__',
238            '__hash__',
239            '__init__',
240            '__init_subclass__',
241            '__le__',
242            '__lt__',
243            '__module__',
244            '__ne__',
245            '__new__',
246            '__reduce__',
247            '__reduce_ex__',
248            '__repr__',
249            '__setattr__',
250            '__sizeof__',
251            '__static_attributes__',
252            '__str__',
253            '__subclasshook__',
254            '__weakref__',
255            'first_name',
256            'last_name',
257            'say_hello',
258            'sex',
259            'year_of_birth',
260        ]
261        assert reality == my_expectation
262        self.assertEqual(reality, my_expectation)
263
264
265# Exceptions seen
266# AssertionError
267# NameError
268# TypeError
269# AttributeError
270# SyntaxError

open the project

  • I open a terminal

  • I change directory to the project

    cd person
    
  • I open test_person.py from the tests folder

  • I use pytest-watcher to run the tests automatically

    uv run pytest-watcher . --now
    

    the terminal shows

    tests/test_person.py ......                         [100%]
    
    =================== 6 passed in A.BCs ====================
    

add TestPerson class

RED: make it fail


I add a class named TestPerson to test_person.py

 1import src.person
 2
 3
 4class TestPerson(object):
 5
 6    def test_failure(self):
 7        self.assertEqual(False, True)
 8
 9
10def test_joe():

the terminal is my friend, and shows AttributeError

AttributeError: 'TestPerson' object
                has no attribute 'assertEqual'

GREEN: make it pass


  • I add unittest.TestCase as the parent class of TestPerson

    1import src.person
    2
    3
    4# class TestPerson(object):
    5class TestPerson(unittest.TestCase):
    

    the terminal is my friend, and shows NameError

    NameError: name 'unittest' is not defined.
               Did you forget to import 'unittest'?
    
  • I add an import statement at the top of the file

    1import unittest
    2import src.person
    3
    4
    5# class TestPerson(object):
    6class TestPerson(unittest.TestCase):
    

    the terminal is my friend, and shows AssertionError

    AssertionError: False != True
    
  • I change False to True in the assertion

     5# class TestPerson(object):
     6class TestPerson(unittest.TestCase):
     7
     8    def test_failure(self):
     9        # self.assertEqual(False, True)
    10        self.assertEqual(True, True)
    11
    12
    13def test_joe():
    

    the test passes.


REFACTOR: make it better


  • I remove the commented lines

     1import unittest
     2import src.person
     3
     4
     5class TestPerson(unittest.TestCase):
     6
     7    def test_failure(self):
     8        self.assertEqual(True, True)
     9
    10
    11def test_joe():
    
  • I open a new terminal then make sure I am in the person folder

    cd person
    
  • I add a git commit message in the new terminal

    git commit -am \
    'add TestPerson class'
    

test_joe with unittest

RED: make it fail


  • I go back to the terminal where the tests are running.

  • I move test_joe to make it a method of the TestPerson class and replace test_failure

     5class TestPerson(unittest.TestCase):
     6
     7    def test_joe():
     8        first_name = 'joe'
     9        last_name = 'blow'
    10        sex = 'M'
    11        year_of_birth = 1996
    12
    13        reality = src.person.factory(
    14            first_name=first_name,
    15            last_name=last_name,
    16            sex=sex,
    17            year_of_birth=year_of_birth,
    18        )
    19        my_expectation = (
    20            f'{first_name}, {last_name},'
    21            f' {sex}, {year_of_birth}'
    22        )
    23        assert reality == my_expectation
    24
    25        reality = src.person.say_hello(
    26            first_name=first_name,
    27            last_name=last_name,
    28            year_of_birth=year_of_birth,
    29        )
    30        my_expectation = (
    31            f'Hello, my name is {first_name}'
    32            f' {last_name} and I am'
    33            f' {2026-year_of_birth}.'
    34        )
    35        assert reality == my_expectation
    36
    37        joe = src.person.Person(
    38            first_name=first_name,
    39            last_name=last_name,
    40            sex=sex,
    41            year_of_birth=year_of_birth,
    42        )
    43
    44        reality = joe.say_hello()
    45        assert reality == my_expectation
    46
    47
    48def test_jane():
    

    the terminal is my friend, and shows TypeError

    TypeError: TestPerson.test_joe() takes
               0 positional arguments but 1 was given
    

    because a method of an instance takes the instance of the class (self) it belongs to as the first argument.


GREEN: make it pass


I add self to the parentheses of test_joe

7    # def test_joe():
8    def test_joe(self):

the test passes.


REFACTOR: make it better


  • I add a call to the assertNotEqual method for the factory function

     7    # def test_joe():
     8    def test_joe(self):
     9        first_name = 'joe'
    10        last_name = 'blow'
    11        sex = 'M'
    12        year_of_birth = 1996
    13
    14        reality = src.person.factory(
    15            first_name=first_name,
    16            last_name=last_name,
    17            sex=sex,
    18            year_of_birth=year_of_birth,
    19        )
    20        my_expectation = (
    21            f'{first_name}, {last_name},'
    22            f' {sex}, {year_of_birth}'
    23        )
    24        assert reality == my_expectation
    25        self.assertNotEqual(reality, my_expectation)
    

    the terminal is my friend, and shows AssertionError

    AssertionError: 'joe, blow, M, 1996'
                 == 'joe, blow, M, 1996'
    
  • I change assertNotEqual to assertEqual

    24        assert reality == my_expectation
    25        # self.assertNotEqual(reality, my_expectation)
    26        self.assertEqual(reality, my_expectation)
    27
    28        reality = src.person.say_hello(
    29            first_name=first_name,
    30            last_name=last_name,
    31            year_of_birth=year_of_birth,
    32        )
    33        my_expectation = (
    34            f'Hello, my name is {first_name}'
    35            f' {last_name} and I am'
    36            f' {2026-year_of_birth}.'
    37        )
    38        assert reality == my_expectation
    

    the test passes.

  • I add a call to the assertNotEqual method for the say_hello function

    28        reality = src.person.say_hello(
    29            first_name=first_name,
    30            last_name=last_name,
    31            year_of_birth=year_of_birth,
    32        )
    33        my_expectation = (
    34            f'Hello, my name is {first_name}'
    35            f' {last_name} and I am'
    36            f' {2026-year_of_birth}.'
    37        )
    38        assert reality == my_expectation
    39        self.assertNotEqual(reality, my_expectation)
    

    the terminal is my friend, and shows AssertionError

    AssertionError: 'Hello, my name is joe blow and I am 30.'
                 == 'Hello, my name is joe blow and I am 30.'
    
  • I change assertNotEqual to assertEqual

    38        assert reality == my_expectation
    39        # self.assertNotEqual(reality, my_expectation)
    40        self.assertEqual(reality, my_expectation)
    41
    42        joe = src.person.Person(
    43            first_name=first_name,
    44            last_name=last_name,
    45            sex=sex,
    46            year_of_birth=year_of_birth,
    47        )
    48
    49        reality = joe.say_hello()
    

    the test passes.

  • I add a call to the assertNotEqual method for the say_hello method of the Person class

    49        reality = joe.say_hello()
    50        assert reality == my_expectation
    51        self.assertNotEqual(reality, my_expectation)
    52
    53
    54def test_jane():
    

    the terminal is my friend, and shows AssertionError

    AssertionError: 'Hello, my name is joe blow and I am 30.'
                 == 'Hello, my name is joe blow and I am 30.'
    
  • I change assertNotEqual to assertEqual

    49        reality = joe.say_hello()
    50        assert reality == my_expectation
    51        # self.assertNotEqual(reality, my_expectation)
    52        self.assertEqual(reality, my_expectation)
    53
    54
    55def test_jane():
    

    the test passes.

  • I remove the commented lines from test_joe

     5class TestPerson(unittest.TestCase):
     6
     7    def test_joe(self):
     8        first_name = 'joe'
     9        last_name = 'blow'
    10        sex = 'M'
    11        year_of_birth = 1996
    12
    13        reality = src.person.factory(
    14            first_name=first_name,
    15            last_name=last_name,
    16            sex=sex,
    17            year_of_birth=year_of_birth,
    18        )
    19        my_expectation = (
    20            f'{first_name}, {last_name},'
    21            f' {sex}, {year_of_birth}'
    22        )
    23        assert reality == my_expectation
    24        self.assertEqual(reality, my_expectation)
    25
    26        reality = src.person.say_hello(
    27            first_name=first_name,
    28            last_name=last_name,
    29            year_of_birth=year_of_birth,
    30        )
    31        my_expectation = (
    32            f'Hello, my name is {first_name}'
    33            f' {last_name} and I am'
    34            f' {2026-year_of_birth}.'
    35        )
    36        assert reality == my_expectation
    37        self.assertEqual(reality, my_expectation)
    38
    39        joe = src.person.Person(
    40            first_name=first_name,
    41            last_name=last_name,
    42            sex=sex,
    43            year_of_birth=year_of_birth,
    44        )
    45
    46        reality = joe.say_hello()
    47        assert reality == my_expectation
    48        self.assertEqual(reality, my_expectation)
    49
    50
    51def test_jane():
    
  • I add a git commit message in the other terminal

    git commit -am 'move test_joe to TestPerson'
    

test_jane with unittest

RED: make it fail


  • I go back to the terminal where the tests are running.

  • I move test_jane to make it a method of the TestPerson class

    46        reality = joe.say_hello()
    47        assert reality == my_expectation
    48        self.assertEqual(reality, my_expectation)
    49
    50    def test_jane():
    51        first_name = 'jane'
    52        last_name = 'doe'
    53        sex = 'F'
    54        year_of_birth = 1991
    55
    56        reality = src.person.factory(
    57            first_name=first_name,
    58            last_name=last_name,
    59            sex=sex,
    60            year_of_birth=year_of_birth,
    61        )
    62        my_expectation = (
    63            f'{first_name}, {last_name},'
    64            f' {sex}, {year_of_birth}'
    65        )
    66        assert reality == my_expectation
    67
    68        reality = src.person.say_hello(
    69            first_name=first_name,
    70            last_name=last_name,
    71            year_of_birth=year_of_birth,
    72        )
    73        my_expectation = (
    74            f'Hello, my name is {first_name}'
    75            f' {last_name} and I am'
    76            f' {2026-year_of_birth}.'
    77        )
    78        assert reality == my_expectation
    79
    80        jane = src.person.Person(
    81            first_name=first_name,
    82            last_name=last_name,
    83            sex=sex,
    84            year_of_birth=year_of_birth,
    85        )
    86
    87        reality = jane.say_hello()
    88        assert reality == my_expectation
    89
    90
    91def test_john():
    

    the terminal is my friend, and shows TypeError

    TypeError: TestPerson.test_jane() takes
               0 positional arguments but 1 was given
    

    because a method of an instance takes the instance of the class (self) it belongs to as the first argument.


GREEN: make it pass


I add self to the parentheses of test_jane

46          reality = joe.say_hello()
47          assert reality == my_expectation
48          self.assertEqual(reality, my_expectation)
49
50      # def test_jane():
51      def test_jane(self):

the test passes.


REFACTOR: make it better


  • I add calls to the assertNotEqual method in test_jane

    50    # def test_jane():
    51    def test_jane(self):
    52        first_name = 'jane'
    53        last_name = 'doe'
    54        sex = 'F'
    55        year_of_birth = 1991
    56
    57        reality = src.person.factory(
    58            first_name=first_name,
    59            last_name=last_name,
    60            sex=sex,
    61            year_of_birth=year_of_birth,
    62        )
    63        my_expectation = (
    64            f'{first_name}, {last_name},'
    65            f' {sex}, {year_of_birth}'
    66        )
    67        assert reality == my_expectation
    68        self.assertNotEqual(reality, my_expectation)
    69
    70        reality = src.person.say_hello(
    71            first_name=first_name,
    72            last_name=last_name,
    73            year_of_birth=year_of_birth,
    74        )
    75        my_expectation = (
    76            f'Hello, my name is {first_name}'
    77            f' {last_name} and I am'
    78            f' {2026-year_of_birth}.'
    79        )
    80        assert reality == my_expectation
    81        self.assertNotEqual(reality, my_expectation)
    82
    83        jane = src.person.Person(
    84            first_name=first_name,
    85            last_name=last_name,
    86            sex=sex,
    87            year_of_birth=year_of_birth,
    88        )
    89
    90        reality = jane.say_hello()
    91        assert reality == my_expectation
    92        self.assertNotEqual(reality, my_expectation)
    93
    94
    95def test_john():
    

    the terminal is my friend, and shows AssertionError

    AssertionError: 'jane, doe, F, 1991'
                 == 'jane, doe, F, 1991'
    
  • I change assertNotEqual to assertEqual for the factory function, in test_jane

    67        assert reality == my_expectation
    68        # self.assertNotEqual(reality, my_expectation)
    69        self.assertEqual(reality, my_expectation)
    70
    71        reality = src.person.say_hello(
    72            first_name=first_name,
    73            last_name=last_name,
    74            year_of_birth=year_of_birth,
    75        )
    76        my_expectation = (
    77            f'Hello, my name is {first_name}'
    78            f' {last_name} and I am'
    79            f' {2026-year_of_birth}.'
    80        )
    81        assert reality == my_expectation
    82        self.assertNotEqual(reality, my_expectation)
    

    the terminal is my friend, and shows AssertionError

    AssertionError: 'Hello, my name is jane doe and I am 35.'
                 == 'Hello, my name is jane doe and I am 35.'
    
  • I change assertNotEqual to assertEqual for the say_hello function, in test_jane

    81        assert reality == my_expectation
    82        # self.assertNotEqual(reality, my_expectation)
    83        self.assertEqual(reality, my_expectation)
    84
    85        jane = src.person.Person(
    86            first_name=first_name,
    87            last_name=last_name,
    88            sex=sex,
    89            year_of_birth=year_of_birth,
    90        )
    91
    92        reality = jane.say_hello()
    

    the terminal is my friend, and shows AssertionError

    AssertionError: 'Hello, my name is jane doe and I am 35.'
                 == 'Hello, my name is jane doe and I am 35.'
    
  • I change assertNotEqual to assertEqual for the say hello method of the Person class, in test_jane

    92        reality = jane.say_hello()
    93        assert reality == my_expectation
    94        # self.assertNotEqual(reality, my_expectation)
    95        self.assertEqual(reality, my_expectation)
    96
    97
    98def test_john():
    

    the test passes.

  • I remove the commented lines from test_jane

    48        self.assertEqual(reality, my_expectation)
    49
    50    def test_jane(self):
    51        first_name = 'jane'
    52        last_name = 'doe'
    53        sex = 'F'
    54        year_of_birth = 1991
    55
    56        reality = src.person.factory(
    57            first_name=first_name,
    58            last_name=last_name,
    59            sex=sex,
    60            year_of_birth=year_of_birth,
    61        )
    62        my_expectation = (
    63            f'{first_name}, {last_name},'
    64            f' {sex}, {year_of_birth}'
    65        )
    66        assert reality == my_expectation
    67        self.assertEqual(reality, my_expectation)
    68
    69        reality = src.person.say_hello(
    70            first_name=first_name,
    71            last_name=last_name,
    72            year_of_birth=year_of_birth,
    73        )
    74        my_expectation = (
    75            f'Hello, my name is {first_name}'
    76            f' {last_name} and I am'
    77            f' {2026-year_of_birth}.'
    78        )
    79        assert reality == my_expectation
    80        self.assertEqual(reality, my_expectation)
    81
    82        jane = src.person.Person(
    83            first_name=first_name,
    84            last_name=last_name,
    85            sex=sex,
    86            year_of_birth=year_of_birth,
    87        )
    88
    89        reality = jane.say_hello()
    90        assert reality == my_expectation
    91        self.assertEqual(reality, my_expectation)
    92
    93
    94def test_john():
    
  • I add a git commit message in the other terminal

    git commit -am 'move test_jane to TestPerson'
    

test_john with unittest

RED: make it fail


  • I go back to the terminal where the tests are running.

  • I move test_john to make it a method of the TestPerson class

     89        reality = jane.say_hello()
     90        assert reality == my_expectation
     91        self.assertEqual(reality, my_expectation)
     92
     93    def test_john():
     94        first_name = 'john'
     95        last_name = 'smith'
     96        sex = 'M'
     97        year_of_birth = 1580
     98
     99        reality = src.person.factory(
    100            first_name=first_name,
    101            last_name=last_name,
    102            sex=sex,
    103            year_of_birth=year_of_birth,
    104        )
    105        my_expectation = (
    106            f'{first_name}, {last_name},'
    107            f' {sex}, {year_of_birth}'
    108        )
    109        assert reality == my_expectation
    110
    111        reality = src.person.say_hello(
    112            first_name=first_name,
    113            last_name=last_name,
    114            year_of_birth=year_of_birth,
    115        )
    116        my_expectation = (
    117            f'Hello, my name is {first_name}'
    118            f' {last_name} and I am'
    119            f' {2026-year_of_birth}.'
    120        )
    121        assert reality == my_expectation
    122
    123        john = src.person.Person(
    124            first_name=first_name,
    125            last_name=last_name,
    126            sex=sex,
    127            year_of_birth=year_of_birth,
    128        )
    129
    130        reality = john.say_hello()
    131        assert reality == my_expectation
    132
    133
    134def test_mary():
    

    the terminal is my friend, and shows TypeError

    TypeError: TestPerson.test_john() takes
               0 positional arguments but 1 was given
    

    because a method of an instance takes the instance of the class (self) it belongs to as the first argument.


GREEN: make it pass


I add self to the parentheses of test_john

46        reality = jane.say_hello()
47        assert reality == my_expectation
48        self.assertEqual(reality, my_expectation)
49
50    # def test_john():
51    def test_john(self):

the test passes.


REFACTOR: make it better


  • I add calls to the assertNotEqual method in test_john

     93    # def test_john():
     94    def test_john(self):
     95        first_name = 'john'
     96        last_name = 'smith'
     97        sex = 'M'
     98        year_of_birth = 1580
     99
    100        reality = src.person.factory(
    101            first_name=first_name,
    102            last_name=last_name,
    103            sex=sex,
    104            year_of_birth=year_of_birth,
    105        )
    106        my_expectation = (
    107            f'{first_name}, {last_name},'
    108            f' {sex}, {year_of_birth}'
    109        )
    110        assert reality == my_expectation
    111        self.assertNotEqual(reality, my_expectation)
    112
    113        reality = src.person.say_hello(
    114            first_name=first_name,
    115            last_name=last_name,
    116            year_of_birth=year_of_birth,
    117        )
    118        my_expectation = (
    119            f'Hello, my name is {first_name}'
    120            f' {last_name} and I am'
    121            f' {2026-year_of_birth}.'
    122        )
    123        assert reality == my_expectation
    124        self.assertNotEqual(reality, my_expectation)
    125
    126        john = src.person.Person(
    127            first_name=first_name,
    128            last_name=last_name,
    129            sex=sex,
    130            year_of_birth=year_of_birth,
    131        )
    132
    133        reality = john.say_hello()
    134        assert reality == my_expectation
    135        self.assertNotEqual(reality, my_expectation)
    136
    137
    138def test_mary():
    

    the terminal is my friend, and shows AssertionError

    AssertionError: 'john, smith, M, 1580'
                 == 'john, smith, M, 1580'
    
  • I change assertNotEqual to assertEqual for the factory function, in test_john

    110        assert reality == my_expectation
    111        # self.assertNotEqual(reality, my_expectation)
    112        self.assertEqual(reality, my_expectation)
    113
    114        reality = src.person.say_hello(
    115            first_name=first_name,
    116            last_name=last_name,
    117            year_of_birth=year_of_birth,
    118        )
    119        my_expectation = (
    120            f'Hello, my name is {first_name}'
    121            f' {last_name} and I am'
    122            f' {2026-year_of_birth}.'
    123        )
    124        assert reality == my_expectation
    125        self.assertNotEqual(reality, my_expectation)
    

    the terminal is my friend, and shows AssertionError

    AssertionError: 'Hello, my name is john smith and I am 446.'
                 == 'Hello, my name is john smith and I am 446.'
    
  • I change assertNotEqual to assertEqual for the say_hello function, in test_john

    124        assert reality == my_expectation
    125        # self.assertNotEqual(reality, my_expectation)
    126        self.assertEqual(reality, my_expectation)
    127
    128        john = src.person.Person(
    129            first_name=first_name,
    130            last_name=last_name,
    131            sex=sex,
    132            year_of_birth=year_of_birth,
    133        )
    134
    135        reality = john.say_hello()
    

    the terminal is my friend, and shows AssertionError

    AssertionError: 'Hello, my name is john smith and I am 446.'
                 == 'Hello, my name is john smith and I am 446.'
    
  • I change assertNotEqual to assertEqual for the say hello method of the Person class, in test_john

    135        reality = john.say_hello()
    136        assert reality == my_expectation
    137        # self.assertNotEqual(reality, my_expectation)
    138        self.assertEqual(reality, my_expectation)
    139
    140
    141def test_mary():
    

    the test passes.

  • I remove the commented lines from test_john

     91        self.assertEqual(reality, my_expectation)
     92
     93    def test_john(self):
     94        first_name = 'john'
     95        last_name = 'smith'
     96        sex = 'M'
     97        year_of_birth = 1580
     98
     99        reality = src.person.factory(
    100            first_name=first_name,
    101            last_name=last_name,
    102            sex=sex,
    103            year_of_birth=year_of_birth,
    104        )
    105        my_expectation = (
    106            f'{first_name}, {last_name},'
    107            f' {sex}, {year_of_birth}'
    108        )
    109        assert reality == my_expectation
    110        self.assertEqual(reality, my_expectation)
    111
    112        reality = src.person.say_hello(
    113            first_name=first_name,
    114            last_name=last_name,
    115            year_of_birth=year_of_birth,
    116        )
    117        my_expectation = (
    118            f'Hello, my name is {first_name}'
    119            f' {last_name} and I am'
    120            f' {2026-year_of_birth}.'
    121        )
    122        assert reality == my_expectation
    123        self.assertEqual(reality, my_expectation)
    124
    125        john = src.person.Person(
    126            first_name=first_name,
    127            last_name=last_name,
    128            sex=sex,
    129            year_of_birth=year_of_birth,
    130        )
    131
    132        reality = john.say_hello()
    133        assert reality == my_expectation
    134        self.assertEqual(reality, my_expectation)
    135
    136
    137def test_mary():
    
  • I add a git commit message in the other terminal

    git commit -am 'move test_john to TestPerson'
    

test_mary with unittest

RED: make it fail


  • I go back to the terminal where the tests are running.

  • I move test_mary to make it a method of the TestPerson class

    132        reality = john.say_hello()
    133        assert reality == my_expectation
    134        self.assertEqual(reality, my_expectation)
    135
    136    def test_mary():
    137        first_name = 'mary'
    138        last_name = 'public'
    139        sex = 'F'
    140        year_of_birth = 2000
    141
    142        reality = src.person.factory(
    143            first_name=first_name,
    144            last_name=last_name,
    145            sex=sex,
    146            year_of_birth=year_of_birth,
    147        )
    148        my_expectation = (
    149            f'{first_name}, {last_name},'
    150            f' {sex}, {year_of_birth}'
    151        )
    152        assert reality == my_expectation
    153
    154        reality = src.person.say_hello(
    155            first_name=first_name,
    156            last_name=last_name,
    157            year_of_birth=year_of_birth,
    158        )
    159        my_expectation = (
    160            f'Hello, my name is {first_name}'
    161            f' {last_name} and I am'
    162            f' {2026-year_of_birth}.'
    163        )
    164        assert reality == my_expectation
    165
    166        mary = src.person.Person(
    167            first_name=first_name,
    168            last_name=last_name,
    169            sex=sex,
    170            year_of_birth=year_of_birth,
    171        )
    172
    173        reality = mary.say_hello()
    174        assert reality == my_expectation
    175
    176
    177def test_dir_person_class():
    

    the terminal is my friend, and shows TypeError

    TypeError: TestPerson.test_mary() takes
               0 positional arguments but 1 was given
    

    because a method of an instance takes the instance of the class (self) it belongs to as the first argument.


GREEN: make it pass


I add self to the parentheses of test_mary

132        reality = john.say_hello()
133        assert reality == my_expectation
134        self.assertEqual(reality, my_expectation)
135
136    # def test_mary():
137    def test_mary(self):

the test passes.


REFACTOR: make it better


  • I add calls to the assertNotEqual method in test_mary

    136    # def test_mary():
    137    def test_mary(self):
    138        first_name = 'mary'
    139        last_name = 'public'
    140        sex = 'F'
    141        year_of_birth = 2000
    142
    143        reality = src.person.factory(
    144            first_name=first_name,
    145            last_name=last_name,
    146            sex=sex,
    147            year_of_birth=year_of_birth,
    148        )
    149        my_expectation = (
    150            f'{first_name}, {last_name},'
    151            f' {sex}, {year_of_birth}'
    152        )
    153        assert reality == my_expectation
    154        self.assertNotEqual(reality, my_expectation)
    155
    156        reality = src.person.say_hello(
    157            first_name=first_name,
    158            last_name=last_name,
    159            year_of_birth=year_of_birth,
    160        )
    161        my_expectation = (
    162            f'Hello, my name is {first_name}'
    163            f' {last_name} and I am'
    164            f' {2026-year_of_birth}.'
    165        )
    166        assert reality == my_expectation
    167        self.assertNotEqual(reality, my_expectation)
    168
    169        mary = src.person.Person(
    170            first_name=first_name,
    171            last_name=last_name,
    172            sex=sex,
    173            year_of_birth=year_of_birth,
    174        )
    175
    176        reality = mary.say_hello()
    177        assert reality == my_expectation
    178        self.assertNotEqual(reality, my_expectation)
    179
    180
    181def test_dir_person_class():
    

    the terminal is my friend, and shows AssertionError

    AssertionError: 'mary, public, F, 2000'
                 == 'mary, public, F, 2000'
    
  • I change assertNotEqual to assertEqual for the factory function, in test_mary

    153        assert reality == my_expectation
    154        # self.assertNotEqual(reality, my_expectation)
    155        self.assertEqual(reality, my_expectation)
    156
    157        reality = src.person.say_hello(
    158            first_name=first_name,
    159            last_name=last_name,
    160            year_of_birth=year_of_birth,
    161        )
    162        my_expectation = (
    163            f'Hello, my name is {first_name}'
    164            f' {last_name} and I am'
    165            f' {2026-year_of_birth}.'
    166        )
    167        assert reality == my_expectation
    168        self.assertNotEqual(reality, my_expectation)
    

    the terminal is my friend, and shows AssertionError

    AssertionError: 'Hello, my name is mary public and I am 26.'
                 == 'Hello, my name is mary public and I am 26.'
    
  • I change assertNotEqual to assertEqual for the say_hello function, in test_mary

    167        assert reality == my_expectation
    168        # self.assertNotEqual(reality, my_expectation)
    169        self.assertEqual(reality, my_expectation)
    170
    171        mary = src.person.Person(
    172            first_name=first_name,
    173            last_name=last_name,
    174            sex=sex,
    175            year_of_birth=year_of_birth,
    176        )
    177
    178        reality = mary.say_hello()
    

    the terminal is my friend, and shows AssertionError

    AssertionError: 'Hello, my name is mary public and I am 26.'
                 == 'Hello, my name is mary public and I am 26.'
    
  • I change assertNotEqual to assertEqual for the say hello method of the Person class, in test_mary

    178        reality = mary.say_hello()
    179        assert reality == my_expectation
    180        # self.assertNotEqual(reality, my_expectation)
    181        self.assertEqual(reality, my_expectation)
    182
    183
    184def test_dir_person_class():
    

    the test passes.

  • I remove the commented lines from test_mary

    134        self.assertEqual(reality, my_expectation)
    135
    136    def test_mary(self):
    137        first_name = 'mary'
    138        last_name = 'public'
    139        sex = 'F'
    140        year_of_birth = 2000
    141
    142        reality = src.person.factory(
    143            first_name=first_name,
    144            last_name=last_name,
    145            sex=sex,
    146            year_of_birth=year_of_birth,
    147        )
    148        my_expectation = (
    149            f'{first_name}, {last_name},'
    150            f' {sex}, {year_of_birth}'
    151        )
    152        assert reality == my_expectation
    153        self.assertEqual(reality, my_expectation)
    154
    155        reality = src.person.say_hello(
    156            first_name=first_name,
    157            last_name=last_name,
    158            year_of_birth=year_of_birth,
    159        )
    160        my_expectation = (
    161            f'Hello, my name is {first_name}'
    162            f' {last_name} and I am'
    163            f' {2026-year_of_birth}.'
    164        )
    165        assert reality == my_expectation
    166        self.assertEqual(reality, my_expectation)
    167
    168        mary = src.person.Person(
    169            first_name=first_name,
    170            last_name=last_name,
    171            sex=sex,
    172            year_of_birth=year_of_birth,
    173        )
    174
    175        reality = mary.say_hello()
    176        assert reality == my_expectation
    177        self.assertEqual(reality, my_expectation)
    178
    179
    180def test_dir_person_class():
    
  • I add a git commit message in the other terminal

    git commit -am 'move test_mary to TestPerson'
    

test_dir_person_class with unittest

RED: make it fail


  • I go back to the terminal where the tests are running.

  • I move test_dir_person_class to make it a method of the TestPerson class

    175        reality = mary.say_hello()
    176        assert reality == my_expectation
    177        self.assertEqual(reality, my_expectation)
    178
    179    def test_dir_person_class():
    180        reality = dir(src.person.Person)
    181        my_expectation = [
    
    212        ]
    213        assert reality == my_expectation
    214
    215
    216def test_dir_person_instance():
    

    the terminal is my friend, and shows TypeError

    TypeError:
        TestPerson.test_dir_person_class()
        takes 0 positional arguments but 1 was given
    

    because a method of an instance takes the instance of the class (self) it belongs to as the first argument.


GREEN: make it pass


I add self to the parentheses of test_dir_person_class

175        reality = mary.say_hello()
176        assert reality == my_expectation
177        self.assertEqual(reality, my_expectation)
178
179    # def test_dir_person_class():
180    def test_dir_person_class(self):

the test passes.


REFACTOR: make it better


  • I add a call to the assertNotEqual method in test_dir_person_class

    214        assert reality == my_expectation
    215        self.assertNotEqual(reality, my_expectation)
    216
    217
    218def test_dir_person_instance():
    

    the terminal is my friend, and shows AssertionError.

  • I change assertNotEqual to assertEqual for the factory function, in test_dir_person_class

    214        assert reality == my_expectation
    215        # self.assertNotEqual(reality, my_expectation)
    216        self.assertEqual(reality, my_expectation)
    217
    218
    219def test_dir_person_instance():
    

    the test passes.

  • I remove the commented lines from test_dir_person_class

    175        reality = mary.say_hello()
    176        assert reality == my_expectation
    177        self.assertEqual(reality, my_expectation)
    178
    179    def test_dir_person_class(self):
    180        reality = dir(src.person.Person)
    181        my_expectation = [
    
    213        ]
    214        assert reality == my_expectation
    215        self.assertEqual(reality, my_expectation)
    216
    217
    218def test_dir_person_instance():
    
  • I add a git commit message in the other terminal

    git commit -am
    'move test_dir_person_class to TestPerson'
    

test_dir_person_instance with unittest

RED: make it fail


  • I go back to the terminal where the tests are running.

  • I move test_dir_person_instance to make it a method of the TestPerson class

    213        assert reality == my_expectation
    214        self.assertEqual(reality, my_expectation)
    215
    216    def test_dir_person_instance():
    217        an_instance_of_person = src.person.Person(
    218            first_name='first_name',
    219            last_name='last_name',
    220            sex='M',
    221            year_of_birth=2026,
    222        )
    223
    224        reality = dir(an_instance_of_person)
    225        my_expectation = [
    
    260        ]
    261        assert reality == my_expectation
    262
    263
    264# Exceptions seen
    

    the terminal is my friend, and shows TypeError

    TypeError:
        TestPerson.test_dir_person_instance()
        takes 0 positional arguments but 1 was given
    

    because …


GREEN: make it pass


I add self to the parentheses of test_dir_person_instance

213        assert reality == my_expectation
214        self.assertEqual(reality, my_expectation)
215
216    # def test_dir_person_instance():
217    def test_dir_person_instance(self):

the test passes.


REFACTOR: make it better


  • I add a call to the assertNotEqual method in test_dir_person_instance

    262        assert reality == my_expectation
    263        self.assertNotEqual(reality, my_expectation)
    264
    265
    266# Exceptions seen
    

    the terminal is my friend, and shows AssertionError.

  • I change assertNotEqual to assertEqual for the factory function, in test_dir_person_instance

    262        assert reality == my_expectation
    263        # self.assertNotEqual(reality, my_expectation)
    264        self.assertEqual(reality, my_expectation)
    265
    266
    267# Exceptions seen
    

    the test passes.

  • I remove the commented lines from test_dir_person_instance

    214        self.assertEqual(reality, my_expectation)
    215
    216    def test_dir_person_instance(self):
    217        an_instance_of_person = src.person.Person(
    218            first_name='first_name',
    219            last_name='last_name',
    220            sex='M',
    221            year_of_birth=2026,
    222        )
    223
    224        reality = dir(an_instance_of_person)
    225        my_expectation = [
    
    260        ]
    261        assert reality == my_expectation
    262        self.assertEqual(reality, my_expectation)
    263
    264
    265# Exceptions seen
    266# AssertionError
    267# NameError
    268# TypeError
    269# AttributeError
    270# SyntaxError
    
  • I add a git commit message in the other terminal

    git commit -am
    'move test_dir_person_instance to TestPerson'
    

close the project

  • I close test_person.py

  • I click in the terminal where the tests are running

  • I use q on the keyboard to leave the tests. The terminal goes back to the command line.

  • I change directory to the parent of person

    cd ..
    

    the terminal shows

    ...\pumping_python
    

    I am back in the pumping_python directory.


review


code from the chapter

Do you want to see all the CODE I typed in this chapter?


what is next?

You know

Would you like to know where the extra attributes and methods of the Person class came from?


rate pumping python

If this has been a 7 star experience for you, please CLICK HERE to leave a 5 star review of pumping python. It helps other people get into the book too.