{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# ipytest" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Setup" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# Set the file name (required)\n", "__file__ = \"testing.ipynb\"\n", "\n", "# Add ipython magics\n", "# Add ipython magics\n", "import ipytest\n", "import pytest\n", "\n", "\n", "ipytest.autoconfig()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Test Case" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ ". [100%]\n", "1 passed in 0.00s\n" ] } ], "source": [ "%%ipytest\n", "\n", "def test_sorted():\n", " assert sorted([4, 2, 1, 3]) == [1, 2, 3, 4]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Test Fixture" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ ".. [100%]\n", "2 passed in 0.01s\n" ] } ], "source": [ "%%ipytest\n", "\n", "@pytest.fixture\n", "def dict_list():\n", " return [\n", " dict(a=\"a\", b=3),\n", " dict(a=\"c\", b=1),\n", " dict(a=\"b\", b=2),\n", " ]\n", "\n", "\n", "def test_sorted__key_example_1(dict_list):\n", " assert sorted(dict_list, key=lambda d: d[\"a\"]) == [\n", " dict(a=\"a\", b=3),\n", " dict(a=\"b\", b=2),\n", " dict(a=\"c\", b=1),\n", " ]\n", "\n", "\n", "def test_sorted__key_example_2(dict_list):\n", " assert sorted(dict_list, key=lambda d: d[\"b\"]) == [\n", " dict(a=\"c\", b=1),\n", " dict(a=\"b\", b=2),\n", " dict(a=\"a\", b=3),\n", " ]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Testparametrisierung" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ ".. [100%]\n", "2 passed in 0.01s\n" ] } ], "source": [ "%%ipytest\n", "\n", "@pytest.mark.parametrize(\n", " \"input,expected\",\n", " [\n", " ([2, 1], [1, 2]),\n", " (\"zasdqw\", list(\"adqswz\")),\n", " ],\n", ")\n", "def test_examples(input, expected):\n", " actual = sorted(input)\n", " assert actual == expected" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Referenz\n", "\n", "### `%%run_pytest …`\n", "\n", "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.\n", "\n", "### `ipytest.run_pytest(module=None, filename=None, pytest_options=(), pytest_plugins=())`\n", "\n", "führt die Tests im bestehenden Modul (standardmäßig `main`) mit pytest aus.\n", "\n", "Argumente:\n", "\n", "* `module`: das Modul, das die Tests enthält. Wenn nicht angegeben wird, wird `__main__` verwendet.\n", "* `filename`: Dateiname der Datei, die die Tests enthält. Wenn nichts angegeben wird, wird das `__file__`-Attribut des übergebenen Moduls verwendet.\n", "* `pytest_options`: zusätzliche Optionen, die an pytest übergeben werden\n", "* `pytest_plugins`: zusätzliche pytest-Plugins\n", "\n", "### `ipytest.run_tests(doctest=False, items=None)`\n", "\n", "Argumente:\n", "\n", "* `doctest`: Wenn als Wert `True` angegeben wird, wird nach Doctests gesucht.\n", "* `items`: Das *globals*-Objekt, das die Tests enthält. Wenn `None` angegeben wird, wird das *globals*-Objekt aus dem Call Stack ermittelt.\n", "\n", "### `ipytest.clean_tests(pattern=\"test*\", items=None)`\n", "\n", "löscht diejenigen Tests, deren Namen dem angegebenen Muster entsprechen.\n", "\n", "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.\n", "\n", "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.\n", "\n", "Argumente:\n", "\n", "* `pattern`: Ein glob-Pattern, das verwendet wird, um die zu löschenden Tests zu finden.\n", "* `items`: Das *globals*-Objekt, das die Tests enthält. Wenn `None` angegeben wird, wird das *globals*-Objekt aus dem Call Stack ermittelt.\n", "\n", "### `ipytest.collect_tests(doctest=False, items=None)`\n", "\n", "sammelt alle Testfälle und sendet sie an `unittest.TestSuite`.\n", "\n", "Die Argumente sind die gleichen wie für `ipytest.run_tests`.\n", "\n", "### `ipytest.assert_equals(a, b, *args, **kwargs)`\n", "\n", "vergleicht zwei Objekte und wirft eine *Exception*, wenn sie nicht gleich sind.\n", "\n", "Die Methode `ipytest.get_assert_function` bestimmt die zu verwendende Assert-Implementierung in Abhängigkeit von den folgenden Argumenten:\n", "\n", "* `a, b`: die zwei zu vergleichenden Objekte.\n", "* `args, kwargs`: (Schlüsselwort)-Argumente, die an die zugrundeliegende Testfunktion übergeben werden.\n", "\n", "### `ipytest.get_assert_function(a, b)`\n", "\n", "bestimmt die zu verwendende Assert-Funktion in Abhängigkeit von den Argumenten.\n", "\n", "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.\n", "\n", "### `ipytest.unittest_assert_equals(a, b)`\n", "\n", "vergleicht zwei Objekte mit der `assertEqual`-Methode von `unittest.TestCase`.\n" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3.11 Kernel", "language": "python", "name": "python311" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.4" }, "latex_envs": { "LaTeX_envs_menu_present": true, "autoclose": false, "autocomplete": true, "bibliofile": "biblio.bib", "cite_by": "apalike", "current_citInitial": 1, "eqLabelWithNumbers": true, "eqNumInitial": 1, "hotkeys": { "equation": "Ctrl-E", "itemize": "Ctrl-I" }, "labels_anchors": false, "latex_user_defs": false, "report_style_numbering": false, "user_envs_cfg": false }, "widgets": { "application/vnd.jupyter.widget-state+json": { "state": {}, "version_major": 2, "version_minor": 0 } } }, "nbformat": 4, "nbformat_minor": 2 }