{"id":541,"date":"2011-03-14T21:57:19","date_gmt":"2011-03-14T20:57:19","guid":{"rendered":"https:\/\/d-mueller.de\/blog\/?p=541"},"modified":"2011-03-15T00:21:36","modified_gmt":"2011-03-14T23:21:36","slug":"webtesting-mit-simpletest-selenium-light","status":"publish","type":"post","link":"https:\/\/d-mueller.de\/blog\/webtesting-mit-simpletest-selenium-light\/","title":{"rendered":"Webtesting mit SimpleTest &#8211; Selenium light"},"content":{"rendered":"<p><a href=\"http:\/\/simpletest.org\/index.html\">SimpleTest<\/a> f\u00fchrt neben dem \u00fcberm\u00e4chtigen PHPUnit ein Schattendasein in der PHP-Community. Vielleicht nicht ganz zu Unrecht, schlie\u00dflich kommt es mit deutlich weniger Features daher. Eher durch Zufall entdeckte ich beim Durchst\u00f6bern der <a href=\"http:\/\/www.simpletest.org\/en\/overview.html\">Dokumentation<\/a> das verdammt coole <b>Webtesting Feature<\/b> &#8211; zwar nicht so m\u00e4chtig wie Selenium (das ja u.a. einen echten Browser fernsteuern kann), aber f\u00fcr kleine Checks durchaus gut zu gebrauchen. Aber der Reihe nach.<\/p>\n<h2>SimpleTest installieren<\/h2>\n<p>Die <a href=\"http:\/\/simpletest.org\/en\/download.html\">aktuelle Alpha-Version 1.1<\/a> herunterladen. Zus\u00e4tzlich noch das File <a href=\"http:\/\/simpletest.svn.sourceforge.net\/viewvc\/simpletest\/simpletest\/trunk\/arguments.php\">arguments.php<\/a> direkt aus dem SVN herunterladen und ins simpletest-Verzeichnis stecken. Das wurde anscheinend in der alpha <a href=\"http:\/\/cakephp.1045679.n5.nabble.com\/Error-on-test-php-page-missing-arguments-php-on-Simple-Test-td3246103.html\">vergessen<\/a> und f\u00fchrt sonst zu einem Fehler.<\/p>\n<h2>Test anlegen<\/h2>\n<p>Auf der selben Ebene des <i>simpletest<\/i>-Ordners erstellen wir eine Datei:<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\nrequire_once &#039;simpletest\/autorun.php&#039;;\r\nrequire_once &#039;simpletest\/web_tester.php&#039;;\r\n\r\nclass BlogSearchTest extends WebTestCase \r\n{\r\n\tfunction testDoesBlogSearchWork() \r\n\t{\r\n\t\t$this-&gt;get(&#039;https:\/\/d-mueller.de\/blog\/&#039;);\r\n\t\t\r\n\t\t\/\/we want a &quot;200 - OK&quot; response\r\n\t\t$this-&gt;assertResponse(200);\r\n\t}\r\n}\r\n<\/pre>\n<p>Das wars schon.<br \/>\n<div id=\"attachment_542\" style=\"width: 381px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2011\/03\/firsttest.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-542\" src=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2011\/03\/firsttest.png\" alt=\"Erster Test\" title=\"Erster Test\" width=\"371\" height=\"105\" class=\"size-full wp-image-542\" srcset=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2011\/03\/firsttest.png 371w, https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2011\/03\/firsttest-300x84.png 300w\" sizes=\"auto, (max-width: 371px) 100vw, 371px\" \/><\/a><p id=\"caption-attachment-542\" class=\"wp-caption-text\">Erster Test<\/p><\/div><\/p>\n<h2>Der Test<\/h2>\n<p>Um gleich mal ein &#8222;full featured&#8220; Beispiel zu bringen, wo alle grundlegenden Funktionalit\u00e4ten des Webtesters gezeigt werden, planen wir folgendes: <\/p>\n<blockquote><p>Es soll die Seite <i>&#8222;https:\/\/d-mueller.de\/blog\/&#8220;<\/i> besucht werden, in das Suchfeld rechts oben der Text <i>&#8222;timestamps&#8220;<\/i> eingegeben werden und der <i>&#8222;Suchen&#8220;<\/i> Button gedr\u00fcckt werden. Auf der <a href=\"https:\/\/d-mueller.de\/blog\/?s=timestamps\">Ergebnisseite<\/a> soll der Link <i>&#8222;Dealing with Trusted Timestamps in PHP (RFC 3161)&#8220;<\/i> gesucht und geklickt werden. Letztendlich suchen wir noch im Artikel selbst einen speziellen Text.<\/p><\/blockquote>\n<p>Dabei pr\u00fcfen wir alles, was wir pr\u00fcfen k\u00f6nnen: Response-Code, Vorhandensein der Links etc.pp. Hier <b>das gesamte Beispiel, was f\u00fcr sich selbst spricht:<\/b><\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\n&lt;?php\r\nrequire_once &#039;simpletest\/autorun.php&#039;;\r\nrequire_once &#039;simpletest\/web_tester.php&#039;;\r\n\r\nclass BlogSearchTest extends WebTestCase \r\n{\r\n\tfunction testDoesBlogSearchWork() \r\n\t{\r\n\t\t\/\/we are impatient! If a request takes longer than 6 seconds, the test should fail\r\n\t\t$this-&gt;setConnectionTimeout(6);\r\n\t\t\r\n\t\t\/\/pretend to be a real browser\r\n\t\t$this-&gt;addHeader(&quot;User-Agent: Mozilla\/4.0 (compatible; MSIE 6.0; Windows NT 5.0)&quot;);\r\n\r\n\t\t$this-&gt;get(&#039;https:\/\/d-mueller.de\/blog\/&#039;);\r\n\t\t\r\n\t\t\/\/we want a &quot;200 - OK&quot; response\r\n\t\t$this-&gt;assertResponse(200);\r\n\t\t\r\n\t\t\/\/only html is accepted as response format\r\n\t\t$this-&gt;assertMime(&quot;text\/html&quot;);\r\n\r\n\t\t\/\/dump the headers for fun\r\n\t\t$this-&gt;showHeaders();\r\n\t\t\r\n\t\t\/\/check if a certain response header matches\r\n\t\t$this-&gt;assertHeader(&quot;Server&quot;, &quot;Apache\/2.2.14 (Ubuntu)&quot;);\r\n\t\t\r\n\t\t\/\/is the &lt;title&gt; equal to what we are expecting?\r\n\t\t$this-&gt;assertTitle(&quot;davblog: webdev and stuff | jeden Tag ein bisschen besser&quot;);\r\n\t\t\t\r\n\t\t\/\/Is a Textfield with name=&quot;s&quot; present? -&gt; search field\r\n\t\t$this-&gt;assertField(&quot;s&quot;);\r\n\r\n\t\t\/\/enter the text &quot;timestamps&quot; in the search field\r\n\t\t$this-&gt;setField(&quot;s&quot;, &quot;timestamps&quot;);\r\n\t\t\r\n\t\t\/\/hit search button\r\n\t\t$this-&gt;clickSubmit(&quot;Suchen&quot;);\r\n\r\n\t\t\/\/check if search returns &quot;200 - OK&quot;\r\n\t\t$this-&gt;assertResponse(200);\r\n\t\t\r\n\t\t\/\/check if a link &lt;a href=&quot;...&quot;&gt;Dealing with Trusted Timestamps in PHP (RFC 3161)&lt;\/a&gt; is on the page\r\n\t\t$this-&gt;assertLink(&quot;Dealing with Trusted Timestamps in PHP (RFC 3161)&quot;);\r\n\t\t\r\n\t\t\/\/click the link\r\n\t\t$this-&gt;clickLink(&quot;Dealing with Trusted Timestamps in PHP (RFC 3161)&quot;);\r\n\t\t\r\n\t\t\/\/... and visit the article page\r\n\t\t$this-&gt;assertResponse(200);\r\n\r\n\t\t\/\/the url has to be &quot;https:\/\/d-mueller.de\/blog\/dealing-with-trusted-timestamps-in-php-rfc-3161\/&quot; now\r\n\t\t$this-&gt;assertEqual($this-&gt;getUrl(), &quot;https:\/\/d-mueller.de\/blog\/dealing-with-trusted-timestamps-in-php-rfc-3161\/&quot;);\r\n\r\n\t\t\/\/check if the text &quot;Explanation of the concept behind Trusted Timestamp&quot; is present on the page\r\n\t\t$this-&gt;assertText(&quot;Explanation of the concept behind Trusted Timestamp&quot;);\r\n\t\t\r\n\t\t\/\/dump the request-headers\r\n\t\t$this-&gt;showRequest();\r\n\t}\r\n}\r\n<\/pre>\n<p>Ausgef\u00fchrt sieht das dann so aus:<\/p>\n<div id=\"attachment_543\" style=\"width: 552px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2011\/03\/secondtest.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-543\" src=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2011\/03\/secondtest.png\" alt=\"Testergebnis\" title=\"Testergebnis\" width=\"542\" height=\"383\" class=\"size-full wp-image-543\" srcset=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2011\/03\/secondtest.png 542w, https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2011\/03\/secondtest-300x211.png 300w\" sizes=\"auto, (max-width: 542px) 100vw, 542px\" \/><\/a><p id=\"caption-attachment-543\" class=\"wp-caption-text\">Testergebnis<\/p><\/div>\n<p>Geht also schon einiges. Eine vollst\u00e4ndige <a href=\"http:\/\/simpletest.org\/en\/web_tester_documentation.html\">Auflistung aller Webtest-M\u00f6glichkeiten<\/a> gibt es auch. Letztendlich l\u00e4sst sich das webtest-Modul auch <b>als simpler, scriptbarer Browser verwenden<\/b>, ganz ohne dabei etwas zu testen:<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\n&lt;?php\r\nrequire_once(&#039;simpletest\/browser.php&#039;);\r\n    \r\n$browser = new SimpleBrowser();\r\n$browser-&gt;get(&#039;https:\/\/d-mueller.de\/blog\/&#039;);\r\n$browser-&gt;setField(&quot;s&quot;, &quot;timestamps&quot;);\r\n$browser-&gt;clickSubmit(&#039;Suchen&#039;);\r\n$browser-&gt;clickLink(&#039;Dealing with Trusted Timestamps in PHP (RFC 3161)&#039;);\r\n\r\n\/\/print the page &lt;title&gt;\r\necho $browser-&gt;getTitle(); \/\/Dealing with Trusted Timestamps in PHP (RFC 3161) | davblog: webdev and stuff\r\n\r\n\/\/get all urls on the site\r\nprint_r($browser-&gt;getUrls());\r\n\/*\r\nArray\r\n(\r\n    [0] =&gt; https:\/\/d-mueller.de\/blog\/\r\n    [1] =&gt; https:\/\/d-mueller.de\/blog\/dealing-with-trusted-timestamps-in-php-rfc-3161\/#content\r\n    [2] =&gt; https:\/\/d-mueller.de\/blog\/\r\n    [3] =&gt; https:\/\/d-mueller.de\/blog\/archiv\/\r\n    [4] =&gt; https:\/\/d-mueller.de\/blog\/rss-feed\/\r\n\t...\r\n}\r\n<\/pre>\n<p>Im Detail <a href=\"http:\/\/simpletest.org\/en\/browser_documentation.html\">gibt es auch hierzu wieder eine Dokuseite<\/a>. Da wird dann auch das Handling mit Authentication, Sessions und Cookies demonstriert.<\/p>\n<p><b>Fazit:<\/b> Simpel in der Bedinung und f\u00fcr kleine Aufgaben definitv m\u00e4chtig genug<\/p>\n","protected":false},"excerpt":{"rendered":"<p>SimpleTest f\u00fchrt neben dem \u00fcberm\u00e4chtigen PHPUnit ein Schattendasein in der PHP-Community. Vielleicht nicht ganz zu Unrecht, schlie\u00dflich kommt es mit deutlich weniger Features daher. Eher durch Zufall entdeckte ich beim Durchst\u00f6bern der Dokumentation das verdammt coole Webtesting Feature &#8211; zwar &hellip; <a href=\"https:\/\/d-mueller.de\/blog\/webtesting-mit-simpletest-selenium-light\/\">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,8,3],"tags":[],"class_list":["post-541","post","type-post","status-publish","format-standard","hentry","category-php","category-quicktips","category-webdev"],"_links":{"self":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts\/541","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=541"}],"version-history":[{"count":0,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts\/541\/revisions"}],"wp:attachment":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/media?parent=541"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/categories?post=541"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/tags?post=541"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}