ipytest

Setup

[1]:
# Set the file name (required)
__file__ = 'testing.ipynb'

# Add ipython magics
import ipytest.magics

import pytest

Test Case

[2]:
%%run_pytest[clean]

def test_sorted():
    assert sorted([4, 2, 1, 3]) == [1, 2, 3, 4]
======================== test session starts =========================
platform darwin -- Python 3.7.0, pytest-5.0.1, py-1.8.0, pluggy-0.12.0
rootdir: /Users/veit/jupyter-tutorial/docs/basics/ipython
collected 1 item

testing.py .                                                                                                                         [100%]

====================== 1 passed in 0.18 seconds ======================

[clean] löscht alle zuvor gelaufenen Tests, dh es werden nur die in der aktuellen Zelle definierten Tests ausgeführt.

Test Fixture

[3]:
%%run_pytest[clean]

@pytest.fixture
def dict_list():
    return [
        dict(a='a', b=3),
        dict(a='c', b=1),
        dict(a='b', b=2),
    ]


def test_sorted__key_example_1(dict_list):
    assert sorted(dict_list, key=lambda d: d['a']) == [
        dict(a='a', b=3),
        dict(a='b', b=2),
        dict(a='c', b=1),
    ]


def test_sorted__key_example_2(dict_list):
    assert sorted(dict_list, key=lambda d: d['b']) == [
        dict(a='c', b=1),
        dict(a='b', b=2),
        dict(a='a', b=3),
    ]
======================== test session starts =========================
platform darwin -- Python 3.7.0, pytest-5.0.1, py-1.8.0, pluggy-0.12.0
rootdir: /Users/veit/jupyter-tutorial/docs/basics/ipython
collected 2 items

testing.py ..                                                                                                                        [100%]

====================== 2 passed in 0.15 seconds ======================

Testparametrisierung

[4]:
%%run_pytest[clean]

@pytest.mark.parametrize('input,expected', [
    ([2, 1], [1, 2]),
    ('zasdqw', list('adqswz')),
])
def test_examples(input, expected):
    actual = sorted(input)
    assert actual == expected
======================== test session starts =========================
platform darwin -- Python 3.7.0, pytest-5.0.1, py-1.8.0, pluggy-0.12.0
rootdir: /Users/veit/jupyter-tutorial/docs/basics/ipython
collected 2 items

testing.py ..                                                                                                                        [100%]

====================== 2 passed in 0.24 seconds ======================

Referenz

%%run_pytest

IPython-Magic, die zuerst die Zelle und dann run_pytest ausführt. In der Zelle übergebene Argumente werden direkt an pytest weitergeleitet. Zuvor sollten mit import ipytest.magics die Magics importiert worden sein.

ipytest.run_pytest(module=None, filename=None, pytest_options=(), pytest_plugins=())

führt die Tests im bestehenden Modul (standardmäßig main) mit pytest aus.

Argumente:

  • module: das Modul, das die Tests enthält. Wenn nicht angegeben wird, wird __main__ verwendet.

  • filename: Dateiname der Datei, die die Tests enthält. Wenn nichts angegeben wird, wird das __file__-Attribut des übergebenen Moduls verwendet.

  • pytest_options: zusätzliche Optionen, die an pytest übergeben werden

  • pytest_plugins: zusätzliche pytest-Plugins

ipytest.run_tests(doctest=False, items=None)

Argumente:

  • doctest: Wenn als Wert True angegeben wird, wird nach Doctests gesucht.

  • items: Das globals-Objekt, das die Tests enthält. Wenn None angegeben wird, wird das globals-Objekt aus dem Call Stack ermittelt.

ipytest.clean_tests(pattern="test*", items=None)

löscht diejenigen Tests, deren Namen dem angegebenen Muster entsprechen.

In IPython werden die Ergebnisse aller Auswertungen in globalen Variablen gespeichert, sofern sie nicht explizit gelöscht werden. Dieses Verhalten impliziert, dass beim Umbenennen von Tests die vorherigen Definitionen weiterhin gefunden werden, wenn sie nicht gelöscht werden. Diese Methode zielt darauf ab, diesen Prozess zu vereinfachen.

Ein effektive Methode besteht darin, mit clean_tests eine Zelle zu beginnen, dann alle Testfälle zu definieren und schließlich run_tests aufzurufen. Auf diese Weise funktioniert das Umbenennen von Tests wie erwartet.

Argumente:

  • pattern: Ein glob-Pattern, das verwendet wird, um die zu löschenden Tests zu finden.

  • items: Das globals-Objekt, das die Tests enthält. Wenn None angegeben wird, wird das globals-Objekt aus dem Call Stack ermittelt.

ipytest.collect_tests(doctest=False, items=None)

sammelt alle Testfälle und sendet sie an unittest.TestSuite.

Die Argumente sind die gleichen wie für ipytest.run_tests.

ipytest.assert_equals(a, b, *args, **kwargs)

vergleicht zwei Objekte und werfen und Ausnahme, wenn sie nicht gleich sind.

Die Methode ipytest.get_assert_function bestimmt die zu verwendende Assert-Implementierung in Abhängigkeit von den folgenden Argumenten:

  • a, b: die zwei zu vergleichenden Objekte.

  • args, kwargs: (Schlüsselwort)-Argumente, die an die zugrundeliegende Testfunktion übergeben werden.

ipytest.get_assert_function(a, b)

bestimmt die zu verwendende Assert-Funktion in Abhängigkeit von den Argumenten.

Wenn eines der Objekte numpy.ndarray, pandas.Series, pandas.DataFrame oder pandas.Panel ist, werden die von numpy und pandas bereitgestellten Assert-Funktionen zurückgegeben.

ipytest.unittest_assert_equals(a, b)

vergleicht zwei Objekte mit der assertEqual-Methode von unittest.TestCase.