{"id":1999,"date":"2022-02-24T01:05:01","date_gmt":"2022-02-24T01:05:01","guid":{"rendered":"https:\/\/www.gravityvector.com\/?p=1999"},"modified":"2022-04-01T11:16:52","modified_gmt":"2022-04-01T11:16:52","slug":"ist-unit-testing-der-muehe-wert-mit-einem-beispiel","status":"publish","type":"post","link":"https:\/\/www.gravityvector.com\/de\/ist-unit-testing-der-muehe-wert-mit-einem-beispiel\/","title":{"rendered":"Ist Unit Testing der M\u00fche wert? (mit einem Beispiel)"},"content":{"rendered":"<p style=\"text-align: left;\" align=\"justify\">Es wird erwartet, dass jede Software nach Abschluss des Entwicklungsprozesses ordnungsgem\u00e4\u00df getestet wird, um Fehler zu erkennen und zu beheben. Es gibt unz\u00e4hlige M\u00f6glichkeiten, das zu tun. Manuelles Testen ist der einfachste Weg, um zu \u00fcberpr\u00fcfen, ob eine Software so funktioniert, wie sie sollte. Obwohl es eine einfache M\u00f6glichkeit ist, es zu testen, ist es definitiv nicht die effizienteste. Es ist unpraktisch, fehleranf\u00e4llig und aufgrund menschlicher Fehler nicht immer genau. Beim manuellen Testen muss jede Software immer wieder vom Entwickler getestet werden, was sehr m\u00fchsam und zeitaufw\u00e4ndig sein kann. Um Redundanzen zu vermeiden, k\u00f6nnen Unit-Tests verwendet werden, um den Prozess f\u00fcr uns zu automatisieren und die manuellen Tests effizienter zu gestalten.<\/p>\n<p style=\"text-align: left;\" align=\"justify\">Durch Komponententests k\u00f6nnen wir testen, ob der von uns geschriebene Code wie beabsichtigt funktioniert. Das Hauptaugenmerk liegt darauf, zu testen, ob eine einzelne Einheit (kleinstes St\u00fcck Code, das getestet werden kann) wie eine Methode oder Funktion isoliert gut funktioniert. Das tats\u00e4chliche Verhalten einer Einheit wird mit dem erwarteten Verhalten verglichen und basierend auf dem Ergebnis wird der Test entweder bestanden oder nicht bestanden. Es liegt an uns zu entscheiden, ob der Test f\u00fcr ein bestimmtes Ergebnis bestanden oder nicht bestanden werden soll. Jeder Test muss nur einmal geschrieben werden und kann unz\u00e4hlige Male ausgef\u00fchrt werden, um zu \u00fcberpr\u00fcfen, ob die Software gut funktioniert und wie gut sie auf g\u00fcltige oder ung\u00fcltige Eingaben reagiert. Mit diesem Ansatz sind wir in der Lage, Fehler fr\u00fcher effizient zu erkennen und zu beheben, was letztendlich zu geringeren Kosten f\u00fchrt.<\/p>\n<p style=\"text-align: left;\" align=\"justify\"><div class=\"gap\" style=\"line-height: 10px; height: 10px;\"><\/div>\n<h4 lang=\"hr-HR\" style=\"text-align: left;\" align=\"justify\">Wie schreibt man in Python einen Testfall?<\/h4>\n<p lang=\"hr-HR\" style=\"text-align: left;\" align=\"justify\">Python verf\u00fcgt \u00fcber ein integriertes Unit-Testing-Framework namens <span style=\"color: #3a3a3a;\"><span style=\"font-family: Liberation Serif, serif;\"><span style=\"font-size: medium;\"><span style=\"color: #000000;\"><span style=\"font-family: Courier New, monospace;\">unittest<\/span><\/span><\/span><\/span><\/span>, das Tools zum Schreiben und Ausf\u00fchren von Tests enth\u00e4lt. Damit der Testrunner unterscheiden kann, welche Methoden einen individuellen Test darstellen, m\u00fcssen Testmethoden definiert werden, deren Namen mit den Buchstaben \u201eTest\u201c beginnen.<\/p>\n<p lang=\"hr-HR\" style=\"text-align: left;\" align=\"justify\">Die folgenden Beispiele zeigen ein Diagramm oder eine Struktur einer neuen Testfallklasse namens <span style=\"color: #3a3a3a;\"><span style=\"font-family: Liberation Serif, serif;\"><span style=\"font-size: medium;\"><span style=\"color: #000000;\"><span style=\"font-family: Courier New, monospace;\">Example<\/span><\/span><\/span><\/span><\/span>, die von <span style=\"color: #3a3a3a;\"><span style=\"font-family: Liberation Serif, serif;\"><span style=\"font-size: medium;\"><span style=\"color: #000000;\"><span style=\"font-family: Courier New, monospace;\">unittest.TestCase<\/span><\/span><\/span><\/span><\/span> und in Python implementiertem Code erbt, der derselben Struktur folgt.<\/p>\n<p><img loading=\"lazy\" class=\"wp-image-1861 size-full aligncenter\" src=\"https:\/\/www.gravityvector.com\/wp-content\/uploads\/2022\/02\/unittest_pattern_2.png\" alt=\"\" width=\"580\" height=\"678\" srcset=\"https:\/\/www.gravityvector.com\/wp-content\/uploads\/2022\/02\/unittest_pattern_2.png 580w, https:\/\/www.gravityvector.com\/wp-content\/uploads\/2022\/02\/unittest_pattern_2-257x300.png 257w\" sizes=\"(max-width: 580px) 100vw, 580px\" \/><\/p>\n<div class=\"gap\" style=\"line-height: 10px; height: 10px;\"><\/div>\n<p lang=\"hr-HR\" style=\"text-align: left;\" align=\"justify\">Das Diagramm zeigt, wie sich das <span style=\"color: #3a3a3a;\"><span style=\"font-family: Liberation Serif, serif;\"><span style=\"font-size: medium;\"><span style=\"color: #000000;\"><span style=\"font-family: Courier New, monospace;\">Example<\/span><\/span><span style=\"color: #000000;\">\u00a0<\/span><\/span><\/span><\/span>bei der Ausf\u00fchrung verh\u00e4lt. Die Methoden <span style=\"color: #3a3a3a;\"><span style=\"font-family: Liberation Serif, serif;\"><span style=\"font-size: medium;\"><span style=\"color: #000000;\"><span style=\"font-family: Courier New, monospace;\">setUpClass <\/span><\/span><\/span><\/span><\/span>und <span style=\"color: #3a3a3a;\"><span style=\"font-family: Liberation Serif, serif;\"><span style=\"font-size: medium;\"><span style=\"color: #000000;\"><span style=\"font-family: Courier New, monospace;\">tearDownClass<\/span><\/span><\/span><\/span><\/span> sind als Klassenmethoden definiert, um nur einmal f\u00fcr die gesamte Klasse aufgerufen zu werden. Beide enthalten auszuf\u00fchrende Anweisungen, <span style=\"color: #3a3a3a;\"><span style=\"font-family: Liberation Serif, serif;\"><span style=\"font-size: medium;\"><span style=\"color: #000000;\"><span style=\"font-family: Courier New, monospace;\">setUpClass<\/span><\/span><\/span><\/span><\/span> f\u00fchrt die Anweisungen aus, bevor alle Tests ausgef\u00fchrt werden, und <span style=\"color: #3a3a3a;\"><span style=\"font-family: Liberation Serif, serif;\"><span style=\"font-size: medium;\"><span style=\"color: #000000;\"><span style=\"font-family: Courier New, monospace;\">tearDownClass<\/span><\/span><\/span><\/span><\/span>\u00a0f\u00fchrt sie danach aus.<\/p>\n<p lang=\"hr-HR\" style=\"text-align: left;\" align=\"justify\">Die n\u00e4chste Methode, die nach <span style=\"color: #3a3a3a;\"><span style=\"font-family: Liberation Serif, serif;\"><span style=\"font-size: medium;\"><span style=\"color: #000000;\"><span style=\"font-family: Courier New, monospace;\">setUpClass<\/span><\/span><\/span><\/span><\/span> aufgerufen wird, ist die <span style=\"color: #3a3a3a;\"><span style=\"font-family: Liberation Serif, serif;\"><span style=\"font-size: medium;\"><span style=\"color: #000000;\"><span style=\"font-family: Courier New, monospace;\">setUp <\/span><\/span><\/span><\/span><\/span>Methode. Diese Methode l\u00e4uft vor jeder Testmethode, in diesem Fall <span style=\"color: #3a3a3a;\"><span style=\"font-family: Liberation Serif, serif;\"><span style=\"font-size: medium;\"><span style=\"color: #000000;\"><span style=\"font-family: Courier New, monospace;\">testA<\/span><\/span><\/span><\/span><\/span> und <span style=\"color: #3a3a3a;\"><span style=\"font-family: Liberation Serif, serif;\"><span style=\"font-size: medium;\"><span style=\"color: #000000;\"><span style=\"font-family: Courier New, monospace;\">testB<\/span><\/span><\/span><\/span><\/span>. Die Methode tearDown() wird nach jeder Testmethode ausgef\u00fchrt. Wie bei den vorherigen Klassenmethoden enthalten beide auch Anweisungen, die vor und nach jedem Test ausgef\u00fchrt werden m\u00fcssen.<\/p>\n<p lang=\"hr-HR\" style=\"text-align: left;\" align=\"justify\">Beide Testmethoden, <span style=\"color: #3a3a3a;\"><span style=\"font-family: Liberation Serif, serif;\"><span style=\"font-size: medium;\"><span style=\"color: #000000;\"><span style=\"font-family: Courier New, monospace;\">testA<\/span><\/span><\/span><\/span><\/span> und <span style=\"color: #3a3a3a;\"><span style=\"font-family: Liberation Serif, serif;\"><span style=\"font-size: medium;\"><span style=\"color: #000000;\"><span style=\"font-family: Courier New, monospace;\">testB<\/span><\/span><\/span><\/span><\/span>, werden der Reihe nach ausgef\u00fchrt. Beide haben unterschiedliche Testf\u00e4lle, die Zusicherungen verwenden, um das tats\u00e4chliche Verhalten der Einheit gegen\u00fcber dem erwarteten Verhalten zu validieren. Die Methode <span style=\"color: #3a3a3a;\"><span style=\"font-family: Liberation Serif, serif;\"><span style=\"font-size: medium;\"><span style=\"color: #000000;\"><span style=\"font-family: Courier New, monospace;\">testA<\/span><\/span><\/span><\/span><\/span> ruft die Methode <span style=\"color: #3a3a3a;\"><span style=\"font-family: Liberation Serif, serif;\"><span style=\"font-size: medium;\"><span style=\"color: #000000;\"><span style=\"font-family: Courier New, monospace;\">assertEqual<\/span> <\/span><\/span><\/span><\/span>auf, um nach einem erwarteten Ergebnis oder <span style=\"font-weight: 400;\">Ausgang <\/span>zu suchen. Die Methode <span style=\"color: #3a3a3a;\"><span style=\"font-family: Liberation Serif, serif;\"><span style=\"font-size: medium;\"><span style=\"color: #000000;\"><span style=\"font-family: Courier New, monospace;\">testB<\/span><\/span><\/span><\/span><\/span> ruft die Methoden <span style=\"color: #3a3a3a;\"><span style=\"font-family: Liberation Serif, serif;\"><span style=\"font-size: medium;\"><span style=\"color: #000000;\"><span style=\"font-family: Courier New, monospace;\">assertTrue <\/span><\/span><\/span><\/span><\/span>und <span style=\"color: #3a3a3a;\"><span style=\"font-family: Liberation Serif, serif;\"><span style=\"font-size: medium;\"><span style=\"color: #000000;\"><span style=\"font-family: Courier New, monospace;\">assertFalse <\/span><\/span><\/span><\/span><\/span>auf, <span style=\"font-weight: 400;\">um eine Bedingung zu verifizieren.<\/span><\/p>\n<p lang=\"hr-HR\" style=\"text-align: left;\" align=\"justify\">Am Ende, wenn alle Testmethoden erfolgreich ausgef\u00fchrt wurden, wird die <span style=\"font-size: medium;\"><span style=\"color: #000000;\"><span style=\"font-family: Liberation Serif, serif;\"><span lang=\"hr-HR\"><span style=\"color: #3a3a3a;\"><span style=\"font-family: Courier New, monospace;\">tearDown <\/span><\/span><\/span><\/span><\/span><\/span>Methode noch einmal vor der <span style=\"font-size: medium;\"><span style=\"color: #3a3a3a;\"><span style=\"font-family: Liberation Serif, serif;\"><span style=\"color: #000000;\"><span style=\"font-family: Courier New, monospace;\">tearDownClass<\/span><\/span><\/span><\/span><\/span> ausgef\u00fchrt, die einige abschlie\u00dfende Anweisungen ausf\u00fchrt.<\/p>\n<p align=\"justify\"><div class=\"gap\" style=\"line-height: 10px; height: 10px;\"><\/div>\n<h4 lang=\"hr-HR\" align=\"justify\">F\u00fchren Sie den Code mit einem interaktiven Python-Interpreter aus<\/h4>\n<p><iframe loading=\"lazy\" src=\"https:\/\/trinket.io\/embed\/python\/a78fa88109?runOption=run\" width=\"100%\" height=\"356\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<p lang=\"hr-HR\" align=\"justify\"><span style=\"color: #3a3a3a;\"><span style=\"font-family: Liberation Serif, serif;\"><span style=\"font-size: medium;\"><span style=\"color: #000000;\"><div class=\"gap\" style=\"line-height: 10px; height: 10px;\"><\/div><\/span><\/span><\/span><\/span><\/p>\n<p style=\"text-align: left;\" align=\"justify\">Das folgende Beispiel zeigt die Ausgabe der <span style=\"font-size: medium;\"><span style=\"color: #000000;\"><span style=\"font-family: Liberation Serif, serif;\"><span lang=\"hr-HR\"><span style=\"color: #3a3a3a;\"><span style=\"font-family: Courier New, monospace;\"><b>Example <\/b><\/span><\/span><\/span><\/span><\/span><\/span>Klasse, wenn sie in VS Code ausgef\u00fchrt wird. Die erste Ausgabe zeigt <span style=\"font-size: medium;\"><span style=\"color: #000000;\"><span style=\"font-family: Liberation Serif, serif;\"><span lang=\"hr-HR\"><span style=\"color: #008000;\"><b>OK<\/b><\/span><\/span><\/span><\/span><\/span>, was bedeutet, dass alle Tests erfolgreich bestanden wurden. Die Punkte bedeuten, dass ein Test erfolgreich bestanden wurde. Dank der\u00a0 <span style=\"font-size: medium;\"><span style=\"color: #000000;\"><span style=\"font-family: Liberation Serif, serif;\"><span lang=\"hr-HR\"><span style=\"color: #3a3a3a;\"><span style=\"font-family: Courier New, monospace;\"><b>print <\/b><\/span><\/span><\/span><\/span><\/span><\/span>Methoden, die wir zuvor in allen Methoden verwendet haben, k\u00f6nnen wir auch die Reihenfolge sehen, in der die Methoden aufgerufen wurden.<\/p>\n<table>\n<tbody>\n<tr style=\"background-color: #000000; color: #fffffff;\">\n<td><code style=\"color: #fffffff;\"><br \/>\nsetUpClass<br \/>\nsetUp<br \/>\ntestA<br \/>\ntearDown<br \/>\n.setUp<br \/>\ntestB<br \/>\ntearDown<br \/>\n.tearDownClass<br \/>\n----------------------------------------------------------------------<br \/>\nRan 2 tests in 0.002s<br \/>\nOK<br \/>\n<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p align=\"justify\"><div class=\"gap\" style=\"line-height: 10px; height: 10px;\"><\/div>\n<p style=\"text-align: left;\" align=\"justify\">Um zu zeigen, wie es aussehen w\u00fcrde, wenn der Test nicht bestanden w\u00e4re, haben wir einige kleine \u00c4nderungen an unserer Testmethode <span style=\"font-size: medium;\"><span style=\"color: #000000;\"><span style=\"font-family: Liberation Serif, serif;\"><span lang=\"hr-HR\"><span style=\"color: #3a3a3a;\"><span style=\"font-family: Courier New, monospace;\">testA <\/span><\/span><\/span><\/span><\/span><\/span>vorgenommen, um einen Fehler einzuf\u00fchren. Die Ausgabe zeigt <span style=\"font-size: medium;\"><span style=\"color: #000000;\"><span style=\"font-family: Liberation Serif, serif;\"><span lang=\"hr-HR\"><span style=\"color: #ff0000;\"><b>FAILED<\/b><\/span><\/span><\/span><\/span><\/span>, was bedeutet, dass einige der Tests fehlgeschlagen sind. Oben in der Ausgabe k\u00f6nnen wir sehen, welcher Test fehlgeschlagen ist, und es ist <span style=\"font-size: medium;\"><span style=\"color: #000000;\"><span style=\"font-family: Liberation Serif, serif;\"><span lang=\"hr-HR\"><span style=\"color: #3a3a3a;\"><span style=\"font-family: Courier New, monospace;\">testA<\/span><\/span><\/span><\/span><\/span><\/span>. Aus der Ausgabe k\u00f6nnen wir auch sehen, dass zwei Tests ausgef\u00fchrt wurden und ein Test zu einem Fehler f\u00fchrte.<\/p>\n<table>\n<tbody>\n<tr style=\"background-color: #000000; color: #fffffff;\">\n<td>\n<pre><code style=\"color: #fffffff;\">\r\nsetUpClass\r\nsetUp\r\ntestA\r\ntearDown\r\n.setUp\r\ntestB\r\ntearDown\r\n.tearDownClass\r\n----------------------------------------------------------------------\r\nFAIL: testA (__main__.Example)\r\n----------------------------------------------------------------------\r\nTraceback (most recent call last):\r\n   File \"c:\\unittest_example.py\", line 15, in testA\r\n     self.assertEqual(2 + 3, 6)\r\nAssertionError: 5 != 6\r\n----------------------------------------------------------------------\r\nRan 2 tests in 0.002s\r\n\r\nFAILED (failures=1)\r\n<\/code><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"text-align: left;\" align=\"justify\"><div class=\"gap\" style=\"line-height: 10px; height: 10px;\"><\/div>\n<p style=\"text-align: left;\" align=\"justify\">Zusammenfassend l\u00e4sst sich sagen, dass Unit-Tests bei richtiger Implementierung ein n\u00fctzliches Werkzeug sind, um Fehler w\u00e4hrend der Entwicklung schnell aufzusp\u00fcren und zu beheben. Bestimmte Methoden sollten immer implementiert werden, damit die Automatisierung funktioniert. Alle Tests k\u00f6nnen dann ausgef\u00fchrt werden, wann immer wir wollen. Durch h\u00e4ufiges Ausf\u00fchren der Tests k\u00f6nnen wir Fehler oder Bugs erkennen und die Gesamtqualit\u00e4t unseres Codes verbessern. Damit geben uns Unit-Tests die Gewissheit, dass sich der Code, an dem wir arbeiten, so verh\u00e4lt, wie wir es wollen, und man kann mit Sicherheit sagen, dass es allein daf\u00fcr die M\u00fche wert ist, ihn zu lernen.<\/p>\n<p align=\"justify\"><div class=\"gap\" style=\"line-height: 10px; height: 10px;\"><\/div>\n<p style=\"text-align: right;\" align=\"justify\"><span style=\"font-family: Arial, Helvetica, sans-serif;\">\u00a9 &#8211; Gravity Vector<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Es wird erwartet, dass jede Software nach Abschluss des Entwicklungsprozesses ordnungsgem\u00e4\u00df getestet wird, um Fehler zu erkennen und zu beheben. Es gibt unz\u00e4hlige M\u00f6glichkeiten, das zu tun. Manuelles Testen ist der einfachste Weg, um zu \u00fcberpr\u00fcfen, ob eine Software so funktioniert, wie sie sollte. Obwohl es eine einfache M\u00f6glichkeit ist, es zu testen, ist es&hellip;<\/p>\n","protected":false},"author":3,"featured_media":1970,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[3],"tags":[],"_links":{"self":[{"href":"https:\/\/www.gravityvector.com\/de\/wp-json\/wp\/v2\/posts\/1999\/"}],"collection":[{"href":"https:\/\/www.gravityvector.com\/de\/wp-json\/wp\/v2\/posts\/"}],"about":[{"href":"https:\/\/www.gravityvector.com\/de\/wp-json\/wp\/v2\/types\/post\/"}],"author":[{"embeddable":true,"href":"https:\/\/www.gravityvector.com\/de\/wp-json\/wp\/v2\/users\/3\/"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gravityvector.com\/de\/wp-json\/wp\/v2\/comments\/?post=1999"}],"version-history":[{"count":13,"href":"https:\/\/www.gravityvector.com\/de\/wp-json\/wp\/v2\/posts\/1999\/revisions\/"}],"predecessor-version":[{"id":2606,"href":"https:\/\/www.gravityvector.com\/de\/wp-json\/wp\/v2\/posts\/1999\/revisions\/2606\/"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gravityvector.com\/de\/wp-json\/wp\/v2\/media\/1970\/"}],"wp:attachment":[{"href":"https:\/\/www.gravityvector.com\/de\/wp-json\/wp\/v2\/media\/?parent=1999"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gravityvector.com\/de\/wp-json\/wp\/v2\/categories\/?post=1999"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gravityvector.com\/de\/wp-json\/wp\/v2\/tags\/?post=1999"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}