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.test_add) ... FAIL

======================================================================
FAIL: test_add (__main__.TestNotebook.test_add)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/var/folders/hk/s8m0bblj0g10hw885gld52mc0000gn/T/ipykernel_33771/2216555184.py", line 6, in test_add
    self.assertEqual(add(2, 2), 5)
AssertionError: 4 != 5

----------------------------------------------------------------------
Ran 1 test in 0.001s

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

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

  • %%unittest konvertiert 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.000s

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