Unittests

[1]:
def add(a, b):
    return a + b
[2]:
import unittest

class TestNotebook(unittest.TestCase):

    def test_add(self):
        self.assertEqual(add(2, 2), 5)


unittest.main(argv=[''], verbosity=2, exit=False)
test_add (__main__.TestNotebook) ... FAIL

======================================================================
FAIL: test_add (__main__.TestNotebook)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "<ipython-input-2-26d0f87b13a5>", line 6, in test_add
    self.assertEqual(add(2, 2), 5)
AssertionError: 4 != 5

----------------------------------------------------------------------
Ran 1 test in 0.004s

FAILED (failures=1)
[2]:
<unittest.main.TestProgram at 0x105b909b0>

Alternativ kann auch ipython-unittest verwendet werden. Dies ermöglicht die Verwendung der folgenden Cell Magics in iPython:

  • %%unittest_main führt Testfälle aus, die in einer Zelle definiert sind

  • %%unittest_testcase erstellt einen Testfall mit der in einer Zelle definierten Funktion und führt ihn aus

  • %%unittestkonvertiert Python assert in Unittest-Funktionen

  • %%external um externe Unittests durchzuführen

  • %%write {mode} um externe Dateien zu schreiben

[3]:
%reload_ext ipython_unittest
[4]:
%%unittest_main
class MyTest(unittest.TestCase):
    def test_1_plus_1_equals_2(self):
        sum = 1 + 1
        self.assertEqual(sum, 2)

    def test_2_plus_2_equals_4(self):
        self.assertEqual(2 + 2, 4)

Success
..
----------------------------------------------------------------------
Ran 2 tests in 0.002s

OK
[4]:
<unittest.runner.TextTestResult run=2 errors=0 failures=0>
[5]:
%%unittest_testcase
def test_1_plus_1_equals_2(self):
    sum = 1 + 1
    self.assertEqual(sum, 2)

def test_2_plus_2_equals_4(self):
    self.assertEqual(2 + 2, 4)

Success
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK
[5]:
<unittest.runner.TextTestResult run=2 errors=0 failures=0>
[6]:
%%unittest
"1 plus 1 equals 2"
sum = 1 + 1
assert sum == 2
"2 plus 2 equals 4"
assert 2 + 2 == 4

Success
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK
[6]:
<unittest.runner.TextTestResult run=2 errors=0 failures=0>

Standardmäßig trennt Docstring in dieser Magie die Unittest-Methoden. Wenn jedoch keine Docstrings verwendet werden, erstellen die Cell Magics für jede assert-Methode.

Diese Cell Magics unterstützen optionale Argumente:

  • -p (--previous) P

setzt den Cursor auf P Zellen vor (Standardwert: -1 entspricht der nächsten Zelle)

Dies funktioniert jedoch nur, wenn auch jupyter_dojo installiert ist.

  • -s (--stream) S

legt den Ooutput-Stream fest (Standardwert: sys.stdout)

  • -t (--testcase) T

definiert den Namen des TestCase für %%unittest und %%unittest_testcase

  • -u (--unparse)

gibt den Quellcode nach den Transformationen aus

Debugging

[7]:
import doctest
doctest.testmod()

def multiply(a, b):
    '''
    This is a test:
    >>> multiply(2, 2)
    5
    '''
    import pdb; pdb.set_trace()
    return a * b