{"id":558,"date":"2011-04-20T17:26:27","date_gmt":"2011-04-20T15:26:27","guid":{"rendered":"https:\/\/d-mueller.de\/blog\/?p=558"},"modified":"2011-04-20T17:26:27","modified_gmt":"2011-04-20T15:26:27","slug":"interessante-testarten-mutationstest-und-fuzzing","status":"publish","type":"post","link":"https:\/\/d-mueller.de\/blog\/interessante-testarten-mutationstest-und-fuzzing\/","title":{"rendered":"Interessante Testarten: Mutationstest und Fuzzing"},"content":{"rendered":"<p>Bin heute \u00fcber 2 Testverfahren gestolpert, die ich vorher noch nicht auf der Rechnung hatte. Fangen wir beim <b>Mutationstest<\/b> an. <\/p>\n<h3>Mutationstest<\/h3>\n<p>Dabei wird die zu testende Applikation vollautomatisch von einem Programm abge\u00e4ndert. Das kann etwa so aussehen, dass in einer Schleife aus einem <i>&lt;=<\/i> ein <i>&lt;<\/i> gemacht wird. Hier orientiert sich die Art der eigebauten Fehler an den gern von Programmierern gemachten, also z.B. Schleifengrenzen und Verschachtelungen. Wichtig ist hierbei, dass pro Durchlauf immer nur eine Manipulation vorgenommen wird, sonst l\u00e4sst sich die Auswirkung schlie\u00dflich schlecht lokalisieren.<\/p>\n<p>So, nachdem wir nun also den Code &#8222;mutiert&#8220; haben, werden die Testf\u00e4lle aufs Programm gehetzt. Jetzt wird geschaut, ob die Testf\u00e4lle alle Mutationen identifizieren k\u00f6nnen. Ist das nicht der Fall, fehlt ein Test oder ist schlecht geschrieben. Demnach ist der Mutationstest also eher ein Test f\u00fcr die Testf\u00e4lle. Wichtig zu erw\u00e4hnen ist noch, dass sogenannte &#8222;\u00e4quivalente Mutanten&#8220; den Spa\u00df verderben k\u00f6nnen. Angenommen unser Originalcode ist:<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\n$x = 4;\r\n$y = 2;\r\nif ($x == $y * 2)\r\n{\r\n    ...\r\n}\r\n<\/pre>\n<p>Jetzt geht unser Mutationstest-Framework daher und &#8222;mutiert&#8220; das <i>*<\/i> im if zu einem <i>+<\/i>. Das Ergebnis bleibt das Gleiche, der Modultest ist gl\u00fccklich. Und unser Mutationstest ist traurig, dass der Test nicht angeschlagen hat. Gute Tools k\u00f6nnen damit aber umgehen. Schaut euch mal <a href=\"http:\/\/cs.gmu.edu\/~offutt\/rsrch\/mut.html\">Monthra<\/a> an.<\/p>\n<h3>Fuzzing<\/h3>\n<p>Problem: Programmierer entwickeln bei der Arbeit ein bestimmtes Verst\u00e4ndnis ihrer Aufgabe, welches sich auch auf die Tests niederschl\u00e4gt. Demnach sind Tests, die ein Entwickler f\u00fcr seinen eigenen Code produziert eventuell nicht ausreichend, um wirklich alle relevanten Aspekte durchzuchecken. Darauf basiert das <i>Fuzzing<\/i>. Und zwar werden hier automatisierte gro\u00dfe Mengen von Input-Daten generiert und das Programm damit beschossen. Da wir nicht wissen, welcher zuf\u00e4llige Input zu welchem Output f\u00fchren soll, geht es hierbei also &#8222;nur&#8220; um das Testen der Stabilit\u00e4t.<\/p>\n<p>Allerdings ist eine solche Umgebung nicht sonderlich kompliziert aufzusetzen und verrichtet beim n\u00e4chtlichen Test treue Dienste. Hier wird oft <a href=\"http:\/\/www.beyondsecurity.com\/black-box-testing.html\">beSTORM<\/a> als gutes Tool genannt, habe damit allerdings selbst noch keine Erfahrungen sammeln k\u00f6nnen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bin heute \u00fcber 2 Testverfahren gestolpert, die ich vorher noch nicht auf der Rechnung hatte. Fangen wir beim Mutationstest an. Mutationstest Dabei wird die zu testende Applikation vollautomatisch von einem Programm abge\u00e4ndert. Das kann etwa so aussehen, dass in einer &hellip; <a href=\"https:\/\/d-mueller.de\/blog\/interessante-testarten-mutationstest-und-fuzzing\/\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,5,6,3],"tags":[],"class_list":["post-558","post","type-post","status-publish","format-standard","hentry","category-php","category-software-engineering","category-security","category-webdev"],"_links":{"self":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts\/558","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/comments?post=558"}],"version-history":[{"count":0,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts\/558\/revisions"}],"wp:attachment":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/media?parent=558"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/categories?post=558"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/tags?post=558"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}