{"id":43,"date":"2005-07-04T23:03:00","date_gmt":"2005-07-04T21:03:00","guid":{"rendered":"http:\/\/www.forksoft.de\/blog\/2005\/07\/04\/unittest-mit-navision\/"},"modified":"2007-11-08T15:53:40","modified_gmt":"2007-11-08T14:53:40","slug":"unittest-mit-navision","status":"publish","type":"post","link":"http:\/\/www.navision-blog.de\/blog\/2005\/07\/04\/unittest-mit-navision\/","title":{"rendered":"Unittest mit Navision"},"content":{"rendered":"<p><strong>Manuelle Tests<\/strong><\/p>\n<p align=\"justify\">Das Testen von Software war schon immer eine der wichtigsten und auch unbeliebtesten Aufgaben beim Software-Entwicklungsprozess. Generell gibt es viele unterschiedliche Arten des Testens. Im herk&#246;mmlichen Verfahren wurde meistens w&#228;hrend der Entwicklung mit dem Debugger und Tracing-Ausgaben gearbeitet und im Anschluss vor dem Release ein umfangreicher manueller Test des kompletten Systems durchgef&#252;hrt. Aber damit ist es ja bekanntlich noch lange nicht getan, denn der Entwicklungsprozess ist mit der Fertigstellung von Programmteilen l&#228;ngst nicht beendet. &#196;nderungen am Programmcode, z.B. f&#252;r Updates oder neue Features k&#246;nnen unabsehbare Auswirkungen auf bereits getestete Programmteile haben. Die Folge ist, dass der komplette Test vor jedem neuen Release wiederholt werden muss. Da dies nat&#252;rliche gewaltige Kosten verursacht wurden schon fr&#252;h automatisierte Tests eingesetzt, die genau auf die Stellen aufmerksam machen, bei denen nun Fehlfunktionen auftreten. Beispiel f&#252;r solche Test-Systeme sind JUnit (Java) oder auch NUnit (.NET), was in abgewandelter Form nun sogar in das neue Visual Studio 2005 integriert wurde.\u00a0<strong>Doch was genau verbirgt sich hinter dem Unittesting?<\/strong><\/p>\n<p>Beim Unittesting (Unit = Einheit, Bauteil) wird die Funktion eines atomaren Teils des Systems (z.B. einer Berechnungsfunktion) isoliert von allen anderen getestet und validiert. Unittests k&#246;nnen prinzipiell als Whitebox- und Blackbox-Tests betrieben werden. In der Regel wird jedoch der Entwickler im besten Fall schon vor der Entwicklung der Funktionalit&#228;t die Testf&#228;lle anlegen. Nach jeder gr&#246;&#223;eren Quellcode-&#196;nderung sollte dann durch Ablaufen lassen aller Testf&#228;lle die Fehlerfreiheit &#252;berpr&#252;ft werden.<\/p>\n<p><img src=\"http:\/\/www.forksoft.de\/UnitTest\/TestCycle.jpg\" alt=\"Software-Entwicklungszyklus\" \/><\/p>\n<p><strong>Automatisiert und wiederholbar Testen durch Unit-Tests<\/strong><\/p>\n<p align=\"justify\">Ein Unit-Test pr&#252;ft in der Regel immer nur einen sehr kleinen und autarken Teil des Software-Systems \u2013 wie beispielsweise eine einzelne Funktion. Dabei wird bei jedem Test die zu testende Funktion oder Methode mit Testdaten (Parametern) konfrontiert und deren Reaktion auf diese Testdaten gepr&#252;ft. Die zu erwartenden Ausgabewerte werden nun mit den von der jeweiligen Funktion oder Methode gelieferten Ergebnisdaten verglichen (Assertions). Stimmt das erwartete Ergebnis mit dem gelieferten Ergebnis der Funktion oder Methode &#252;berein, so gilt der Test als bestanden.<\/p>\n<p align=\"justify\">Ein TestRun besteht im Allgemeinen aus einer ganzen Reihe von Testf&#228;llen, die nicht nur ein Parameter-Ergebnis-Paar pr&#252;fen, sondern gleich mehrere.<\/p>\n<p><strong>Unittest mit Navision<\/strong><\/p>\n<p align=\"justify\">Auch f&#252;r Microsoft Navision Entwickler sollten UnitTests zum t&#228;glichen Programmieralltag geh&#246;ren. Bisher gab es jedoch kein Testframework f&#252;r Navision, so dass wir uns bei der <a href=\"http:\/\/www.msu-solutions.de\">msu solutions GmbH<\/a> (Microsoft Certified Partner) entschlossen haben ein eigenes zu entwickeln. Die Einsatzm&#246;glichkeiten des Navision-UnitTest-Frameworks m&#246;chte ich hier vorstellen.<\/p>\n<p><img src=\"http:\/\/www.forksoft.de\/UnitTest\/UnitTest_Architecture.jpg\" alt=\"Architektur\" \/><\/p>\n<p><strong>Leistungsmerkmale:<\/strong><\/p>\n<ul>\n<li>Labeln von Testgruppen und Testl&#228;ufen:<br \/>\n<em>UnitTest.LabelTestRun(&#8216;This run has to succeed&#8217;);<\/em><\/li>\n<li>Einfache Funktionstest mit definierten Vergleich:<br \/>\n<em>UnitTest.IntAssert( 4\/2 ,2, &#8216;Is 4\/2 = 2?&#8217;);<\/em><\/li>\n<li>Unterst&#252;tzt erwartete Exceptions:<br \/>\n<em>UnitTest.AssumeError(&#8216;Test 3 Error&#8217;);<\/em><\/li>\n<li>Komplette Assertions &#252;ber Feldinhalte, Recods bis zu ganzen Tabellen:<br \/>\n<em>UnitTest.TableAssertion(TableID);<\/em><\/li>\n<\/ul>\n<p><strong>Testauswahl-Formular<\/strong><\/p>\n<p><img src=\"http:\/\/www.forksoft.de\/UnitTest\/UnitTest_Form.jpg\" alt=\"UnitTest Start-Form\" \/><\/p>\n<ul>\n<li>Auswahl der zu testenden Testgruppen<\/li>\n<li>Import\/Export von Fehlertextbausteinen<\/li>\n<\/ul>\n<p><strong>Unittest-Viewer<\/strong><\/p>\n<p><img src=\"http:\/\/www.forksoft.de\/UnitTest\/UnitTest_Viewer.jpg\" alt=\"UnitTest Viewer\" \/><\/p>\n<ul>\n<li>Anzeige des Testprotokolls<\/li>\n<li>Anzeige, welche Methoden fehlerfrei abliefen und wo Fehler auftraten<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Manuelle Tests Das Testen von Software war schon immer eine der wichtigsten und auch unbeliebtesten Aufgaben beim Software-Entwicklungsprozess. Generell gibt es viele unterschiedliche Arten des Testens. Im herk&#246;mmlichen Verfahren wurde meistens w&#228;hrend der Entwicklung mit dem Debugger und Tracing-Ausgaben gearbeitet und im Anschluss vor dem Release ein umfangreicher manueller Test des kompletten Systems durchgef&#252;hrt. Aber [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[5],"tags":[148,219,238,237,236],"_links":{"self":[{"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/posts\/43"}],"collection":[{"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/comments?post=43"}],"version-history":[{"count":0,"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/posts\/43\/revisions"}],"wp:attachment":[{"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/media?parent=43"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/categories?post=43"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/tags?post=43"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}