{"id":518,"date":"2011-02-22T11:56:41","date_gmt":"2011-02-22T10:56:41","guid":{"rendered":"https:\/\/d-mueller.de\/blog\/?p=518"},"modified":"2011-03-06T01:34:20","modified_gmt":"2011-03-06T00:34:20","slug":"testen-mal-anders-phpt","status":"publish","type":"post","link":"https:\/\/d-mueller.de\/blog\/testen-mal-anders-phpt\/","title":{"rendered":"Testen mal anders: phpt"},"content":{"rendered":"<p>phpt ist ein schmuckes, kleines Testframework, welches u.a. auch zur PHP Quality Assurance <a href=\"http:\/\/qa.php.net\/tested-methods.php\">verwendet wird<\/a>, um damit PHP-eigene Funktionen in PHP zu testen. Wir beginnen mit einem Beispiel:<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\n--TEST--\r\nMy first cool test!\r\n--FILE--\r\n&lt;?php \r\nclass Foobar\r\n{\r\n\tpublic function __construct()\r\n\t{\r\n\t\tfor ($i = 0; $i &lt; 6; $i++)\r\n\t\t{\r\n\t\t\tif ($i % 2 != 0)\r\n\t\t\t\techo $i;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nnew Foobar();\r\n?&gt;\r\n--EXPECT--\r\n135\r\n<\/pre>\n<p>Und das Beste: Mit PEAR kommt der Spa\u00df gleich mit:<\/p>\n<div id=\"attachment_519\" style=\"width: 530px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2011\/02\/pear-run-tests.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-519\" src=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2011\/02\/pear-run-tests.png\" alt=\"Pear run-tests\" title=\"Pear run-tests\" width=\"520\" height=\"154\" class=\"size-full wp-image-519\" srcset=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2011\/02\/pear-run-tests.png 520w, https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2011\/02\/pear-run-tests-300x88.png 300w\" sizes=\"auto, (max-width: 520px) 100vw, 520px\" \/><\/a><p id=\"caption-attachment-519\" class=\"wp-caption-text\">Pear run-tests<\/p><\/div>\n<p>Das ists aber lang noch nicht gewesen. Man f\u00fchre sich folgenden Test zu Gem\u00fcte:<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\n--TEST--\r\nSecond example: errortesting\r\n--FILE--\r\n&lt;?php \r\n$foo = array(1, 3) * array(2, 6);\r\n?&gt;\r\n--EXPECTF--\r\nFatal error: Unsupported operand types in %s.php on line %d\r\n<\/pre>\n<p>Wir testen hier etwas, was schiefgehen soll. Dabei kommt gleich noch <a href=\"http:\/\/qa.php.net\/phpt_details.php#expectf_section\">EXPECTF<\/a> (f\u00fcr formatierte Ausgaben im Stil von scanf) zum Einsatz.<\/p>\n<p><b>Aber es wird noch cooler.<\/b> Es gibt sehr sinnvolle &#8211;BL\u00d6CKE&#8211;, mit denen dann auch sowas realisiert werdern kann:<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\n--TEST--\r\nTest filter_input() with GET and POST data.\r\n--DESCRIPTION--\r\nThis test covers both valid and invalid usages of\r\nfilter_input() with INPUT_GET and INPUT_POST data\r\nand several differnt filter sanitizers.\r\n--CREDIT--\r\nFelipe Pena &lt;felipe@php.net&gt;\r\n--INI--\r\nprecision=14\r\n--SKIPIF--\r\n&lt;?php if (!extension_loaded(&quot;filter&quot;)) die(&quot;Skipped: filter extension required.&quot;); ?&gt;\r\n--GET--\r\na=&lt;b&gt;test&lt;\/b&gt;&amp;b=http:\/\/example.com\r\n--POST--\r\nc=http:\/\/example.com\r\n--FILE--\r\n&lt;?php\r\nvar_dump(filter_input(INPUT_GET, &quot;a&quot;, FILTER_SANITIZE_STRIPPED));\r\nvar_dump(filter_input(INPUT_GET, &quot;b&quot;, FILTER_SANITIZE_URL));\r\nvar_dump(filter_input(INPUT_POST, &quot;c&quot;, FILTER_SANITIZE_URL));\r\n?&gt;\r\n--EXPECTF--\r\nstring(4) &quot;test&quot;\r\nstring(18) &quot;http:\/\/example.com&quot;\r\nstring(18) &quot;http:\/\/example.com&quot;\r\n<\/pre>\n<p>Hier sch\u00f6n zu sehen: Per <b>&#8211;INI&#8211;<\/b> werden Werte der php.ini f\u00fcr diesen Test \u00fcberschrieben. Per <b>&#8211;SKIPIF&#8211;<\/b> k\u00f6nnen wir den Test \u00fcberspringen, wenn die notwendigen Voraussetzungen nicht erf\u00fcllt sind. Ein Test der PHP-Filter-Funktionen w\u00e4re ohne eine geladene Filter-Extension schlie\u00dflich witzlos. Anderes sch\u00f6nes Beispiel dazu:<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\n--SKIPIF--\r\n&lt;?php \r\nif (PHP_INT_SIZE != 8) die(&quot;skip this test is for 64bit platforms only&quot;);\r\n?&gt;\r\n<\/pre>\n<p>Mit <b>&#8211;GET&#8211;<\/b> und <b>&#8211;POST&#8211;<\/b> lassen sich schlie\u00dflich auch Requests simulieren. In Anlehnung an die tearDown()-Methode von PHPUnit gibt es zum Aufr\u00e4umen noch:<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\n--CLEAN--\r\n&lt;?php\r\n      unlink($temp_filename);\r\n?&gt;\r\n<\/pre>\n<p>Weiterhin lassen sich auch <a href=\"http:\/\/qa.php.net\/phpt_details.php#headers_section\">Request-Header setzen<\/a> und sogar ein Autoloader f\u00fcr vollwertige Unit-Tests einbetten:<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\n--TEST--\r\nTest filter_input() with GET and POST data.\r\n--FILE--\r\n&lt;?php\r\nfunction __autoload($classname)\r\n{\r\n\trequire $classname.&quot;.php&quot;;\r\n}\r\nvar_dump(SomeClass::add(2, 3));\r\n?&gt;\r\n--EXPECT--\r\nint(5)\r\n<\/pre>\n<p>Wer nach diesem kurzen Anriss richtig einsteigen will, findet <a href=\"http:\/\/qa.php.net\/write-test.php\">hier die Basics<\/a>, eine <a href=\"http:\/\/qa.php.net\/phpt_details.php\">\u00dcbersicht \u00fcber alle M\u00f6glichkeiten<\/a> und auf den <a href=\"http:\/\/wiki.php.net\/qa\/runtests\">QA-Seiten<\/a> den ein oder anderen interessanten Einblick in das PHP-interne Testgebahren.<\/p>\n<p>Erw\u00e4hnenswert ist zum Abschluss noch das tolle Fehlerverhalten. Wir legen bewusst einen falschen Test an, um das mal zu demonstrieren:<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\n--TEST--\r\nTest that is intentionally incorrect\r\n--FILE--\r\n&lt;?php\r\nvar_dump(cos(90 * 2*M_PI));\r\n?&gt;\r\n--EXPECT--\r\nint(0) # erwischt? cos(90) = 1 ;)\r\n<\/pre>\n<p>Der Test schl\u00e4gt also fehl. Freundlicherweise wird zu unserer Testdatei ins Verzeichnis noch eine [testname].log angelegt, die wie folgt aussieht:<\/p>\n<pre data-enlighter-language=\"enlighter\" class=\"EnlighterJSRAW\">\r\n---- EXPECTED OUTPUT\r\nint(0) # erwischt? cos(90) = 1 ;)\r\n---- ACTUAL OUTPUT\r\nint(1)\r\n---- FAILED\r\n<\/pre>\n<p>Da l\u00e4sst sich also echt was mit anfangen. Korrigiert man den Test, werden die nun \u00fcberfl\u00fcssigen Fehler-Logdateien selbstst\u00e4ndig wieder bereinigt, sodass kein Dateim\u00fcll entsteht. <i>phptest<\/i> ist meiner Meinung nach v\u00f6llig zu Unrecht so unbekannt.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>phpt ist ein schmuckes, kleines Testframework, welches u.a. auch zur PHP Quality Assurance verwendet wird, um damit PHP-eigene Funktionen in PHP zu testen. Wir beginnen mit einem Beispiel: &#8211;TEST&#8211; My first cool test! &#8211;FILE&#8211; &lt;?php class Foobar { public function &hellip; <a href=\"https:\/\/d-mueller.de\/blog\/testen-mal-anders-phpt\/\">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,3],"tags":[],"class_list":["post-518","post","type-post","status-publish","format-standard","hentry","category-php","category-software-engineering","category-webdev"],"_links":{"self":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts\/518","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=518"}],"version-history":[{"count":0,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts\/518\/revisions"}],"wp:attachment":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/media?parent=518"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/categories?post=518"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/tags?post=518"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}