{"id":6713,"date":"2026-06-08T11:40:14","date_gmt":"2026-06-08T09:40:14","guid":{"rendered":"https:\/\/www.clickstorm.de\/blog\/?p=6713"},"modified":"2026-06-16T11:04:51","modified_gmt":"2026-06-16T09:04:51","slug":"automatisierte-tests-codeception","status":"publish","type":"post","link":"https:\/\/www.clickstorm.de\/blog\/automatisierte-tests-codeception\/","title":{"rendered":"Automatisierte Tests mit Codeception: So sichern wir Webprojekte ab"},"content":{"rendered":"<p>Codeception hilft uns dabei, zentrale Funktionen einer Website nach Updates, Relaunches oder Deployments automatisiert zu testen.<\/p>\n<p>Nach einem Update, Relaunch oder Deployment stellt sich oft dieselbe Frage: Funktioniert noch alles? L\u00e4sst sich das Kontaktformular absenden? \u00d6ffnet sich der Login? Erscheint der Cookie-Banner? Genau an dieser Stelle helfen automatisierte Tests. Sie pr\u00fcfen wiederkehrende Abl\u00e4ufe nicht manuell, sondern reproduzierbar und zuverl\u00e4ssig. In vielen unserer Projekte setzen wir daf\u00fcr Codeception ein \u2013 vor allem f\u00fcr automatisierte Browser-Tests.<\/p>\n<p>In diesem Beitrag zeigen wir dir, welche Testarten es gibt, warum Akzeptanztests f\u00fcr Webprojekte besonders wertvoll sind, wie Codeception funktioniert und welche Erfahrungen wir bei clickstorm damit gemacht haben.<\/p>\n<h2>Welche Testarten gibt es?<\/h2>\n<p>Automatisierte Tests k\u00f6nnen auf unterschiedlichen Ebenen ansetzen. Jede Testart verfolgt ein anderes Ziel und hat ihre eigene Berechtigung. <a href=\"https:\/\/docs.typo3.org\/m\/typo3\/reference-coreapi\/main\/en-us\/Testing\/Index.html\" target=\"_blank\" rel=\"noopener\">TYPO3 unterscheidet in der offiziellen Dokumentation<\/a> ebenfalls zwischen verschiedenen Testebenen wie Unit-, Functional- und Acceptance-Tests.<\/p>\n<h3>Unit-Tests<\/h3>\n<p>Unit-Tests pr\u00fcfen einzelne, m\u00f6glichst kleine Code-Einheiten isoliert. Das k\u00f6nnen Funktionen, Methoden oder Klassen sein. Sie sind schnell, gut automatisierbar und eignen sich besonders f\u00fcr Logik, Berechnungen oder klar abgegrenzte Gesch\u00e4ftsregeln.<\/p>\n<p>Ein Unit-Test beantwortet zum Beispiel die Frage:<\/p>\n<blockquote><p>Liefert diese Methode bei einer bestimmten Eingabe das erwartete Ergebnis?<\/p><\/blockquote>\n<p>Gerade in TYPO3-, Symfony- oder Shopware-Projekten sind Unit-Tests hilfreich, wenn individuelle Logik sauber abgesichert werden soll.<\/p>\n<h3>Funktionale Tests<\/h3>\n<p>Funktionale Tests pr\u00fcfen bestimmte Funktionen innerhalb einer Anwendung. Sie liegen h\u00e4ufig zwischen Unit-Tests und Akzeptanztests. Im TYPO3-Umfeld werden funktionale Tests zum Beispiel genutzt, um Verhalten mit einer realistischeren TYPO3-Umgebung zu testen.<\/p>\n<p>Typische Fragen sind:<\/p>\n<blockquote><p>Wird ein Datensatz korrekt verarbeitet?<br \/>\nWird eine bestimmte Funktion innerhalb der Anwendung wie erwartet ausgef\u00fchrt?<br \/>\nFunktioniert ein Plugin oder eine Extension mit der vorhandenen Konfiguration?<\/p><\/blockquote>\n<h3>Akzeptanztests<\/h3>\n<p>Akzeptanztests pr\u00fcfen komplette Abl\u00e4ufe aus Sicht der Nutzerinnen und Nutzer. Sie simulieren typische Wege durch eine Website oder Webanwendung: Seite \u00f6ffnen, Button klicken, Formular ausf\u00fcllen, absenden und Ergebnis pr\u00fcfen.<\/p>\n<p>TYPO3 beschreibt Acceptance Testing als das Steuern eines Browsers, um durch ein Frontend oder Backend-Szenario zu klicken. Genau in diesem Bereich setzen wir Codeception in vielen Projekten ein.<\/p>\n<h3>Warum Akzeptanztests besonders wertvoll sind<\/h3>\n<p>Akzeptanztests sind besonders nah an der tats\u00e4chlichen Nutzung einer Website. Sie pr\u00fcfen nicht nur, ob einzelne Code-Bausteine funktionieren, sondern ob ein kompletter Ablauf erfolgreich ist.<\/p>\n<p>Ein Beispiel: Ein Kontaktformular besteht aus vielen einzelnen Teilen. Es gibt ein Template, Formularfelder, Validierung, Spam-Schutz, Versandlogik, Weiterleitungen und Erfolgsmeldungen. Ein Akzeptanztest pr\u00fcft nicht jedes Detail isoliert, sondern den gesamten Weg:<\/p>\n<ol>\n<li>Kontaktseite \u00f6ffnen<\/li>\n<li>Formularfelder ausf\u00fcllen<\/li>\n<li>Formular absenden<\/li>\n<li>Erfolgsmeldung pr\u00fcfen<\/li>\n<\/ol>\n<p>Das ist besonders wertvoll bei wiederkehrenden manuellen Tests. Vor einem Deployment muss nicht jedes Formular, jeder Login oder jeder Anfrageprozess per Hand durchgeklickt werden. Stattdessen \u00fcbernehmen automatisierte Tests diese Aufgabe.<\/p>\n<p>Nat\u00fcrlich ersetzen solche Tests keine gute Entwicklung, kein Code-Review und keine fachliche Abnahme. Aber sie schaffen zus\u00e4tzliche Sicherheit und helfen, Fehler fr\u00fchzeitig zu erkennen.<\/p>\n<h2>Was ist Codeception?<\/h2>\n<p>Codeception ist ein Testing-Framework f\u00fcr PHP. Es unterst\u00fctzt verschiedene Testarten und legt einen starken Fokus auf lesbare, nutzernahe Tests. Die offizielle Codeception-Seite beschreibt das Framework als L\u00f6sung f\u00fcr das Testen von PHP-Webanwendungen mit Modulen f\u00fcr unter anderem Browser-Testing und nutzerzentrierte Tests.<\/p>\n<p>F\u00fcr Browser-Tests kann Codeception das WebDriver-Modul nutzen. Damit laufen Tests in echten Browsern \u00fcber das W3C-WebDriver-Protokoll, zum Beispiel mit Chrome oder Firefox.<\/p>\n<p>F\u00fcr uns ist besonders wichtig: Die Tests werden in PHP geschrieben. Als Agentur mit Schwerpunkten in TYPO3, WordPress, Shopware, Symfony und individuellen PHP-Projekten passt das sehr gut zu unserem Alltag. Wir bleiben in einer Sprache und einem \u00d6kosystem, das unser Team ohnehin t\u00e4glich nutzt.<\/p>\n<h3>Wie funktionieren Browser-Tests mit Codeception?<\/h3>\n<p>Ein Browser-Test mit Codeception beschreibt einen Ablauf so, wie ihn auch ein Mensch im Browser durchf\u00fchren w\u00fcrde.<\/p>\n<p>Zum Beispiel:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\">$I-&gt;amOnPage('\/kontakt');\r\n$I-&gt;fillField('Name', 'Max Mustermann');\r\n$I-&gt;fillField('E-Mail', 'max@example.de');\r\n$I-&gt;fillField('Nachricht', 'Das ist eine Testnachricht.');\r\n$I-&gt;click('Absenden');\r\n$I-&gt;see('Vielen Dank');<\/pre>\n<p>Der Test liest sich fast wie eine kleine Anleitung:<\/p>\n<ol>\n<li>Gehe auf die Kontaktseite.<\/li>\n<li>F\u00fclle die Felder aus.<\/li>\n<li>Klicke auf Absenden.<\/li>\n<li>Pr\u00fcfe, ob die Erfolgsmeldung erscheint.<\/li>\n<\/ol>\n<p>Das macht Codeception auch f\u00fcr Teams gut verst\u00e4ndlich, die nicht jeden Tag komplexe Testframeworks konfigurieren m\u00f6chten.<\/p>\n<h2>Codeception installieren<\/h2>\n<p>Codeception kann in einem PHP-Projekt \u00fcber Composer installiert werden. F\u00fcr Browser-Tests werden neben Codeception selbst auch passende Module ben\u00f6tigt.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-linenumbers=\"false\">composer require codeception\/codeception \\\r\ncodeception\/module-asserts \\\r\ncodeception\/module-phpbrowser \\\r\ncodeception\/module-webdriver \\\r\n--dev<\/pre>\n<p>Anschlie\u00dfend wird Codeception initialisiert:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-linenumbers=\"false\">vendor\/bin\/codecept bootstrap<\/pre>\n<p>Dabei erzeugt Codeception die grundlegende Konfiguration und die Teststruktur im Projekt.<\/p>\n<p>Falls Autoloading f\u00fcr Tests oder projektspezifische Namespaces ben\u00f6tigt wird, kann die composer.json entsprechend erweitert werden:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"json\">{\r\n  \"autoload-dev\": {\r\n    \"psr-4\": {\r\n      \"Tests\\\\\": \"tests\"\r\n    }\r\n  }\r\n}<\/pre>\n<p>Danach sollte der Autoloader neu erzeugt werden:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-linenumbers=\"false\">composer dump-autoload -o<\/pre>\n<h3>Selenium starten<\/h3>\n<p>F\u00fcr echte Browser-Tests ben\u00f6tigt Codeception einen WebDriver. H\u00e4ufig wird daf\u00fcr Selenium genutzt.<\/p>\n<p>Eine lokale M\u00f6glichkeit ist selenium-standalone \u00fcber npm:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">npm install selenium-standalone -g\r\nselenium-standalone install\r\nselenium-standalone start<\/pre>\n<p>Wenn der ChromeDriver nicht mehr zur installierten Chrome-Version passt, kann er aktualisiert werden:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-linenumbers=\"false\">selenium-standalone install --drivers.chrome.version=latest<\/pre>\n<p>Das ist eine typische Fehlerquelle in der Praxis. Wenn Tests pl\u00f6tzlich keine Verbindung mehr zum Browser herstellen k\u00f6nnen oder Chrome nicht korrekt startet, lohnt sich oft zuerst ein Blick auf die Versionen von Chrome und ChromeDriver.<\/p>\n<h3>Codeception mit DDEV und Selenium nutzen<\/h3>\n<p>In DDEV-Projekten bietet sich das Add-on ddev-selenium-standalone-chrome an. Es stellt Selenium mit Chrome als Service innerhalb der DDEV-Umgebung bereit. Das Add-on ist laut Projektbeschreibung f\u00fcr browserbasierte Tests mit Selenium in DDEV gedacht und kann grunds\u00e4tzlich mit verschiedenen Projekttypen genutzt werden.<\/p>\n<p>Die Installation erfolgt zum Beispiel mit:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\">ddev add-on get ddev\/ddev-selenium-standalone-chrome\r\nddev restart<\/pre>\n<p>Anschlie\u00dfend muss Codeception so konfiguriert werden, dass es den Selenium-Service innerhalb von DDEV nutzt.<\/p>\n<p>Ein Beispiel f\u00fcr eine codeception.yml oder eine Suite-Konfiguration:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"yaml\">actor: AcceptanceTester\r\nmodules:\r\n  enabled:\r\n    - WebDriver:\r\n        url: https:\/\/myproject.ddev.site\r\n        host: selenium-chrome\r\n        browser: chrome\r\n        capabilities:\r\n          goog:chromeOptions:\r\n            args:\r\n              - '--ignore-certificate-errors'\r\n              - '--disable-dev-shm-usage'<\/pre>\n<p>Die beiden Chrome-Argumente sind in DDEV-Projekten besonders praktisch:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-linenumbers=\"false\">--ignore-certificate-errors<\/pre>\n<p>Damit akzeptiert Chrome selbstsignierte DDEV-Zertifikate.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-linenumbers=\"false\">--disable-dev-shm-usage<\/pre>\n<p>Das kann Probleme mit gemeinsam genutztem Speicher in Container-Umgebungen vermeiden.<\/p>\n<p>Lokale Projekt-URLs sollten nicht fest in Git landen. Deshalb kann die URL auch \u00fcber eine Umgebungsvariable gesetzt werden, zum Beispiel:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-linenumbers=\"false\">url: '%CODECEPTION_URL%'<\/pre>\n<h3>Beispiel: Ein Formular automatisch testen<\/h3>\n<p>Ein typischer Akzeptanztest pr\u00fcft, ob ein Formular erreichbar ist, sich ausf\u00fcllen l\u00e4sst und nach dem Absenden die erwartete R\u00fcckmeldung erscheint.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\">&lt;?php\r\n\r\nclass ContactFormCest\r\n{\r\n    public static string $URL_CONTACT = '\/kontakt';\r\n    public static string $CSS_SUCCESS_MESSAGE = '.success-message';\r\n\r\n    public function contactFormCanBeSubmitted(AcceptanceTester $I): void\r\n    {\r\n        $I-&gt;wantTo('submit the contact form');\r\n\r\n        $I-&gt;amOnPage(static::$URL_CONTACT);\r\n        $I-&gt;see('Kontakt');\r\n\r\n        $I-&gt;fillField('Name', 'Max Mustermann');\r\n        $I-&gt;fillField('E-Mail', 'max@example.de');\r\n        $I-&gt;fillField('Nachricht', 'Das ist eine Testnachricht.');\r\n\r\n        $I-&gt;click('Absenden');\r\n\r\n        $I-&gt;waitForElementVisible(static::$CSS_SUCCESS_MESSAGE, 10);\r\n        $I-&gt;see('Vielen Dank');\r\n    }\r\n}<\/pre>\n<p>Dieser Test ist bewusst einfach gehalten. In echten Projekten kommen h\u00e4ufig weitere Aspekte hinzu: Pflichtfelder, Validierungsfehler, Spam-Schutz, Weiterleitungen, mehrsprachige Formulare oder unterschiedliche Formularvarianten.<\/p>\n<h2>Codeception-Tests ausf\u00fchren<\/h2>\n<p>Codeception-Tests k\u00f6nnen direkt \u00fcber die Konsole gestartet werden:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-linenumbers=\"false\">vendor\/bin\/codecept run --steps --html<\/pre>\n<p>Mit <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">--steps<\/code> werden die einzelnen Schritte ausgegeben. Mit <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">--html<\/code> wird ein HTML-Report erzeugt. Das ist besonders hilfreich, wenn Tests in CI\/CD-Prozessen laufen oder wenn ein Fehler sp\u00e4ter nachvollzogen werden soll.<\/p>\n<p>Ein einzelner Test kann so gestartet werden:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-linenumbers=\"false\">vendor\/bin\/codecept run tests\/Acceptance\/ContactFormCest.php --steps --html<\/pre>\n<p>Nur fehlgeschlagene Tests k\u00f6nnen erneut ausgef\u00fchrt werden:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-linenumbers=\"false\">vendor\/bin\/codecept run --steps --html --group failed<\/pre>\n<p>Wenn veraltete Testreferenzen Probleme machen, hilft manchmal ein Clean-Lauf:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-linenumbers=\"false\">vendor\/bin\/codecept clean<\/pre>\n<h3>Codeception in PhpStorm starten<\/h3>\n<p>Codeception-Tests lassen sich nicht nur \u00fcber die Konsole ausf\u00fchren, sondern auch direkt in PhpStorm. Das ist besonders praktisch, wenn du einzelne Tests w\u00e4hrend der Entwicklung schnell starten m\u00f6chtest.<\/p>\n<p>Damit PhpStorm Codeception korrekt ausf\u00fchren kann, muss zuerst der passende PHP-Interpreter eingerichtet sein.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-6723 size-full\" src=\"https:\/\/www.clickstorm.de\/blog\/wp-content\/uploads\/2026\/06\/codeception-phpstorm-cli-interpreter.png\" alt=\"PhpStorm Einstellungen f\u00fcr Codeception in PHP den richtigen CLI Interpreter festlegen\" width=\"984\" height=\"304\" srcset=\"https:\/\/www.clickstorm.de\/blog\/wp-content\/uploads\/2026\/06\/codeception-phpstorm-cli-interpreter.png 984w, https:\/\/www.clickstorm.de\/blog\/wp-content\/uploads\/2026\/06\/codeception-phpstorm-cli-interpreter-300x93.png 300w, https:\/\/www.clickstorm.de\/blog\/wp-content\/uploads\/2026\/06\/codeception-phpstorm-cli-interpreter-768x237.png 768w\" sizes=\"auto, (max-width: 984px) 100vw, 984px\" \/><\/p>\n<p>Auch der Selenium-Server muss gestartet sein (siehe oben). Anschlie\u00dfend sind folgende Schritte auszuf\u00fchren:<\/p>\n<ol>\n<li>Rechtsklick auf den Test-Ordner<\/li>\n<li>&#8222;Run&#8220; w\u00e4hlen<\/li>\n<li>Klick auf Codeception.<\/li>\n<\/ol>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-6721 size-full\" src=\"https:\/\/www.clickstorm.de\/blog\/wp-content\/uploads\/2026\/06\/codeception-phpstorm-run-tests.png\" alt=\"Codeception Tests in PhpStorm starten mit Rechtsklick auf den Test-Ordner, dann Run, dann Codeception w\u00e4hlen\" width=\"1170\" height=\"655\" srcset=\"https:\/\/www.clickstorm.de\/blog\/wp-content\/uploads\/2026\/06\/codeception-phpstorm-run-tests.png 1170w, https:\/\/www.clickstorm.de\/blog\/wp-content\/uploads\/2026\/06\/codeception-phpstorm-run-tests-300x168.png 300w, https:\/\/www.clickstorm.de\/blog\/wp-content\/uploads\/2026\/06\/codeception-phpstorm-run-tests-1024x573.png 1024w, https:\/\/www.clickstorm.de\/blog\/wp-content\/uploads\/2026\/06\/codeception-phpstorm-run-tests-768x430.png 768w\" sizes=\"auto, (max-width: 1170px) 100vw, 1170px\" \/><\/p>\n<p>Jetzt sollte sich der Chrome-Browser \u00f6ffnen. Unterhalb in PhpStorm \u00f6ffnet sich ebenfalls die Run-Ansicht, wo der Fortschritt der Tests sowie fehlgeschlagene Tests zu sehen sind. Im Anschluss lassen sich auch nur die fehlgeschlagenen wiederholen.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-6720 size-full\" src=\"https:\/\/www.clickstorm.de\/blog\/wp-content\/uploads\/2026\/06\/codeception-phpstorm-results.png\" alt=\"Codeception Tests laufen im PhpStorm. Ein Test bereits fehlgeschlagen, 122 schon passiert.\" width=\"1170\" height=\"354\" srcset=\"https:\/\/www.clickstorm.de\/blog\/wp-content\/uploads\/2026\/06\/codeception-phpstorm-results.png 1170w, https:\/\/www.clickstorm.de\/blog\/wp-content\/uploads\/2026\/06\/codeception-phpstorm-results-300x91.png 300w, https:\/\/www.clickstorm.de\/blog\/wp-content\/uploads\/2026\/06\/codeception-phpstorm-results-1024x310.png 1024w, https:\/\/www.clickstorm.de\/blog\/wp-content\/uploads\/2026\/06\/codeception-phpstorm-results-768x232.png 768w\" sizes=\"auto, (max-width: 1170px) 100vw, 1170px\" \/><\/p>\n<h2>Best Practices aus unserer Praxis<\/h2>\n<p>Mit der Zeit haben sich bei uns einige Regeln bew\u00e4hrt, die Codeception-Tests stabiler und wartbarer machen.<\/p>\n<h3>Selektoren bewusst definieren<\/h3>\n<p>Selektoren, URLs und erwartete Werte sollten nicht \u00fcberall im Test verstreut stehen. Wir legen sie lieber als Variablen an. So bleiben Tests lesbarer und \u00c4nderungen lassen sich schneller durchf\u00fchren.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-linenumbers=\"false\">public static string $URL_TO_TEST = '\/';\r\npublic static string $CSS_LINK_DETAIL = '.test-link-detail';\r\npublic static string $CODE_IN_DETAIL_VIEW = '&lt;h2&gt;';\r\npublic static int $NUMBER_OF_LIST_ITEMS = 6;<\/pre>\n<p>Als Namenskonvention nutzen wir sprechende Pr\u00e4fixe:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-linenumbers=\"false\">CSS_        f\u00fcr CSS-Selektoren\r\nURL_        f\u00fcr URLs\r\nCODE_       f\u00fcr erwarteten HTML-Code\r\nNUMBER_OF_  f\u00fcr erwartete Anzahlen<\/pre>\n<p>Wenn CSS-Klassen nur f\u00fcr Tests eingef\u00fchrt werden, bietet sich ein eindeutiges Pr\u00e4fix an, zum Beispiel:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"css\" data-enlighter-linenumbers=\"false\">.test-link-detail<\/pre>\n<p>So ist sofort sichtbar, dass diese Klasse nicht f\u00fcr Styling oder JavaScript gedacht ist, sondern f\u00fcr automatisierte Tests.<\/p>\n<h3>Robuste XPath-Selektoren verwenden<\/h3>\n<p>Manchmal reicht ein einfacher CSS-Selektor nicht aus. Wenn ein Element anhand einer Klasse und eines konkreten Textes gefunden werden soll, kann XPath helfen:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-linenumbers=\"false\">public static $XPATH_ITEM = '\/\/li[contains(concat(\" \", normalize-space(@class), \" \"), \" mycssclass \")][text()=\"mytext\"]';<\/pre>\n<p>Solche Selektoren sollten sparsam eingesetzt werden, k\u00f6nnen aber bei komplexeren Templates hilfreich sein.<\/p>\n<h3>Nicht fest warten, sondern gezielt warten<\/h3>\n<p>Eine der wichtigsten Regeln: Tests sollten m\u00f6glichst nicht einfach eine feste Anzahl Sekunden warten.<\/p>\n<p>Stattdessen ist es besser, auf einen konkreten Zustand zu warten:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\">$I-&gt;waitForElementVisible(static::$CSS_AJAX_IS_LOADING, $timeout);\r\n$I-&gt;waitForElementNotVisible(static::$CSS_AJAX_IS_LOADING, $timeout);<\/pre>\n<p>Oder darauf, dass das Dokument fertig geladen ist:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-linenumbers=\"false\">$I-&gt;waitForJS('return document.readyState == \"complete\"');<\/pre>\n<p>Codeception unterst\u00fctzt verschiedene Wait-Methoden im WebDriver-Modul; au\u00dferdem beschreibt die Dokumentation mit \u201eSmartWait\u201c einen Mechanismus, bei dem Codeception beim Suchen bestimmter Elemente kurz warten kann, ohne alle Testschritte pauschal auszubremsen.<\/p>\n<p>In der Praxis ist das wichtig, weil viele Websites heute mit Ajax, Animationen, Consent-Bannern oder nachgeladenen Inhalten arbeiten. Ein Test, der zu fr\u00fch klickt oder pr\u00fcft, kann fehlschlagen, obwohl die Website korrekt funktioniert.<\/p>\n<h3>Optionale Elemente mit tryTo pr\u00fcfen<\/h3>\n<p>Nicht jedes Element ist immer sichtbar. Ein Sprachmen\u00fc kann tempor\u00e4r ausgeblendet sein. Ein Veranstaltungskalender kann leer sein. Ein Hinweis kann nur unter bestimmten Bedingungen erscheinen.<\/p>\n<p>F\u00fcr solche F\u00e4lle k\u00f6nnen tryTo-Methoden hilfreich sein. Daf\u00fcr werden Step Decorators in der Konfiguration aktiviert:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"yaml\">suites:\r\n  acceptance:\r\n    actor: AcceptanceTester\r\n    step_decorators:\r\n      - \\Codeception\\Step\\TryTo\r\n      - \\Codeception\\Step\\ConditionalAssertion<\/pre>\n<p>Danach muss Codeception neu gebaut werden:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-linenumbers=\"false\">vendor\/bin\/codecept build<\/pre>\n<p>Anschlie\u00dfend k\u00f6nnen optionale Elemente abgefragt werden, ohne dass der Test sofort abbricht:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\">public function checkLanguageMenu(AcceptanceTester $I): void\r\n{\r\n    if ($I-&gt;tryToSeeElement(static::$CSS_LANG_MENU)) {\r\n        $I-&gt;wantTo('click the language selector');\r\n        $I-&gt;click(static::$CSS_LANG_MENU);\r\n        $I-&gt;seeInCurrentUrl(static::$URL_EN);\r\n    }\r\n}<\/pre>\n<p>Das sollte gezielt eingesetzt werden. Nicht jeder Fehler sollte \u201eweich\u201c abgefangen werden. Wenn ein Element zwingend vorhanden sein muss, sollte der Test auch klar fehlschlagen.<\/p>\n<h3>Testmodus per CSS-Klasse markieren<\/h3>\n<p>Manchmal verhalten sich Websites im Testkontext anders als gew\u00fcnscht. Ein Beispiel ist scroll-behavior: smooth, das bei automatisierten Scroll-Methoden Probleme verursachen kann.<\/p>\n<p>In solchen F\u00e4llen kann eine Klasse am HTML-Element helfen:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-linenumbers=\"false\">$I-&gt;executeJS(\"document.documentElement.classList.add('test-runner');\");<\/pre>\n<p>Im CSS oder Less kann dann gezielt reagiert werden:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"css\">.test-runner {\r\n  scroll-behavior: auto;\r\n}<\/pre>\n<p>Wichtig ist: Solche Anpassungen sollten den Test stabiler machen, aber keine echten Fehler verstecken.<\/p>\n<h3>Mehrere Varianten mit @example testen<\/h3>\n<p>Wenn derselbe Ablauf mit unterschiedlichen Daten getestet werden soll, k\u00f6nnen Beispiele direkt am Test hinterlegt werden.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\">\/**\r\n * @example { \"startDate\": \"1.1.2010\", \"endDate\": \"1.1.2020\", \"expectedDate\": \"01.01.2010\", \"expectedNumber\": \"27 Suchergebnisse\" }\r\n * @example { \"startDate\": \"1.1.2020\", \"endDate\": \"1.1.2024\", \"expectedDate\": \"01.01.2024\", \"expectedNumber\": \"12 Suchergebnisse\" }\r\n *\/\r\npublic function filterAndOpenDetails(AcceptanceTester $I, \\Codeception\\Example $example): void\r\n{\r\n    $I-&gt;wantTo('filter and open details');\r\n\r\n    $I-&gt;fillField(static::$CSS_FILTER_DATE_FROM, $example['startDate']);\r\n    $I-&gt;fillField(static::$CSS_FILTER_DATE_TO, $example['endDate']);\r\n\r\n    $I-&gt;see($example['expectedDate']);\r\n    $I-&gt;see($example['expectedNumber']);\r\n}<\/pre>\n<p>Das ist praktisch f\u00fcr Filter, Suchfunktionen, Datumsbereiche oder Formularvarianten.<\/p>\n<h3>Sensible Daten in der .env-Datei speichern<\/h3>\n<p>Zugangsdaten geh\u00f6ren nicht ins Git-Repository. F\u00fcr Testlogins nutzen wir Umgebungsvariablen, zum Beispiel:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">TEST_EXTENSIONS_CSFEUSER_USER='username'\r\nTEST_EXTENSIONS_CSFEUSER_PASS='password'<\/pre>\n<p>Im Test k\u00f6nnen diese Werte ausgelesen werden:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\">$I-&gt;fillField('Benutzername', getenv('TEST_EXTENSIONS_CSFEUSER_USER'));\r\n$I-&gt;fillField('Passwort', getenv('TEST_EXTENSIONS_CSFEUSER_PASS'));<\/pre>\n<p>So bleiben Tests automatisierbar, ohne sensible Daten im Code abzulegen.<\/p>\n<h3>Hilfsmethoden nicht public machen<\/h3>\n<p>Gut zu wissen: \u00d6ffentliche Methoden in einer Cest-Klasse werden von Codeception als Tests erkannt.<\/p>\n<p>Wenn du Hilfsmethoden schreiben m\u00f6chtest, solltest du sie deshalb protected oder private machen:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\">protected function login(AcceptanceTester $I): void\r\n{\r\n    $I-&gt;amOnPage('\/login');\r\n    $I-&gt;fillField('Benutzername', getenv('TEST_USER'));\r\n    $I-&gt;fillField('Passwort', getenv('TEST_PASS'));\r\n    $I-&gt;click('Einloggen');\r\n}<\/pre>\n<p>Das h\u00e4lt Tests sauber und verhindert, dass Hilfslogik versehentlich als eigener Testlauf ausgef\u00fchrt wird.<\/p>\n<h2>Video: Codeception in der Praxis<\/h2>\n<p>Wenn du Codeception lieber in Aktion sehen m\u00f6chtest, findest du in diesem Video einen guten Einstieg in automatisierte Tests mit PHP und Selenium:<\/p>\n<div class=\"privacy-container js-privacy-msg-video\"><img decoding=\"async\" class=\"privacy-text-image\" src=\"https:\/\/www.clickstorm.de\/blog\/wp-content\/plugins\/clickstorm-embed\/images\/comment-alt-exclamation.svg\" alt=\"Info Icon\"><\/p>\n<p class=\"privacy-text\">Dieses Video wird \u00fcber eine externe Plattform (YouTube) gehostet. Das Laden bedarf der Zustimmung unserer <a class=\"privacy-text-link\" href=\"https:\/\/www.clickstorm.de\/blog\/datenschutz\/\" target=\"_blank\">Datenschutzbestimmungen.<\/a><\/p>\n<p><a class=\"btn btn-primary btn-cookie js-cookie-open-modal\" data-cs-cookie-anchor=\"externalMedia\" href=\"#\">Einstellung vornehmen<\/a><\/div>\n<div class=\"iframe\"><iframe class=\"js-iframe-privacy-video\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen src=\"\" data-src=\"https:\/\/www.youtube-nocookie.com\/embed\/i8spZERpwZQ\"><\/iframe><\/div>\n<h2>Unsere Erfahrungen mit Codeception<\/h2>\n<p>Wir nutzen Codeception in vielen Projekten, weil es gut zu unserem PHP-Stack passt. Gerade f\u00fcr TYPO3-, WordPress-, Symfony- und Shopware-Projekte ist es angenehm, Browser-Tests in PHP schreiben zu k\u00f6nnen.<\/p>\n<p>Unsere wichtigsten Erfahrungen:<\/p>\n<h3>Codeception ist gut lesbar.<\/h3>\n<p>Tests beschreiben Nutzerwege verst\u00e4ndlich: Seite \u00f6ffnen, Feld ausf\u00fcllen, Button klicken, Ergebnis pr\u00fcfen.<\/p>\n<h3>PHP ist f\u00fcr uns ein Vorteil.<\/h3>\n<p>Wir m\u00fcssen f\u00fcr viele Tests nicht in ein separates JavaScript- oder TypeScript-Setup wechseln. Das erleichtert Einstieg, Wartung und Verst\u00e4ndnis im Team.<\/p>\n<h3>Browser-Tests brauchen Pflege.<\/h3>\n<p>Tests sind keine einmalige Aufgabe. Wenn sich Templates, Selektoren oder Abl\u00e4ufe \u00e4ndern, m\u00fcssen auch Tests angepasst werden.<\/p>\n<h3>Wartezeiten sind eine typische Fehlerquelle.<\/h3>\n<p>Viele scheinbar instabile Tests entstehen nicht durch echte Fehler, sondern durch Timing-Probleme. Mit gezielten Methoden wie waitForElementVisible, waitForElementNotVisible oder waitForJS l\u00e4sst sich das meist gut l\u00f6sen.<\/p>\n<h3>ChromeDriver muss gelegentlich aktualisiert werden.<\/h3>\n<p>Wenn Chrome und ChromeDriver nicht mehr zusammenpassen, schlagen Tests unter Umst\u00e4nden fehl. Mit <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">selenium-standalone install --drivers.chrome.version=latest<\/code> l\u00e4sst sich das h\u00e4ufig schnell beheben.<\/p>\n<h3>Reports und Screenshots helfen beim Debugging.<\/h3>\n<p>HTML-Reports, Logs und Screenshots machen Fehler besser nachvollziehbar \u2013 besonders dann, wenn Tests nicht lokal, sondern automatisiert laufen.<\/p>\n<h2>Was automatisierte Tests leisten \u2013 und was nicht<\/h2>\n<p>Automatisierte Browser-Tests sind sehr hilfreich, aber sie sind kein Allheilmittel.<\/p>\n<p>Sie k\u00f6nnen pr\u00fcfen, ob ein definierter Ablauf funktioniert. Sie k\u00f6nnen aber nicht automatisch beurteilen, ob ein Design gut wirkt, ob eine Formulierung verst\u00e4ndlich ist oder ob ein neues Feature fachlich sinnvoll umgesetzt wurde. \u00c4hnlich ist es bei Barrierefreiheit: Automatisierte Checks helfen, ersetzen aber keine manuelle Pr\u00fcfung. Mehr dazu liest du in unserem Beitrag <a href=\"https:\/\/www.clickstorm.de\/blog\/barrierefreiheit-manuelles-testen\/\">\u201eBarrierefreiheit: Warum manuelles Testen unverzichtbar bleibt\u201c<\/a>.<\/p>\n<p>Deshalb sehen wir automatisierte Tests als Erg\u00e4nzung zu sauberer Entwicklung, manueller Pr\u00fcfung, Code-Reviews und fachlicher Abnahme.<\/p>\n<p>Besonders stark sind sie bei wiederkehrenden, kritischen Abl\u00e4ufen:<\/p>\n<ul>\n<li>Kontaktformulare<\/li>\n<li>Login- und Logout-Prozesse<\/li>\n<li>gesch\u00fctzte Bereiche<\/li>\n<li>Such- und Filterfunktionen<\/li>\n<li>Warenkorb- und Checkout-Prozesse<\/li>\n<li>Cookie-Banner und Consent-Flows<\/li>\n<li>zentrale Navigationswege<\/li>\n<li>mehrsprachige Funktionen<\/li>\n<\/ul>\n<h2>Fazit: Automatisierte Tests schaffen Vertrauen<\/h2>\n<p>Automatisierte Tests sind eine Investition in Qualit\u00e4t und Sicherheit. Mit Codeception k\u00f6nnen wir wichtige Nutzerwege im Browser pr\u00fcfen und wiederkehrende Abl\u00e4ufe zuverl\u00e4ssig absichern. Gerade bei Relaunches, Updates und Deployments hilft das enorm: Statt zentrale Funktionen jedes Mal manuell durchzuklicken, k\u00f6nnen Tests viele dieser Pr\u00fcfungen reproduzierbar \u00fcbernehmen.<\/p>\n<p>F\u00fcr uns ist Codeception deshalb aktuell ein sehr wertvolles Werkzeug \u2013 nicht, weil es jeden Testfall l\u00f6st, sondern weil es gut zu unseren Projekten, unserem PHP-Stack und unserer Arbeitsweise passt.<\/p>\n<p>Neben funktionalen Abl\u00e4ufen spielt auch die visuelle Qualit\u00e4t einer Website eine wichtige Rolle. Wenn du wissen m\u00f6chtest, wie sich Layout-Ver\u00e4nderungen automatisch erkennen lassen, lies auch unseren Beitrag zu <a href=\"https:\/\/www.clickstorm.de\/blog\/backstopjs\/\">BackstopJS<\/a> und visuellen Regressionstests.<\/p>\n<p>In einem kommenden Artikel schauen wir uns au\u00dferdem <a href=\"https:\/\/www.clickstorm.de\/blog\/playwright-moderne-browser-tests\/\">Playwright<\/a> an \u2013 ein modernes Tool f\u00fcr browserbasierte End-to-End-Tests, das besonders bei Debugging, Parallelisierung und aktuellen Frontend-Setups spannend ist.<\/p>\n<p>Hast du bereits Erfahrungen mit Codeception oder nutzt du andere Tools, um deine Webprojekte stabiler zu machen? Teile dein Wissen gerne in den Kommentaren.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Funktioniert meine Webseite noch nach einem Update? Mit Codeception in PHP l\u00e4sst sich das leicht pr\u00fcfen. <\/p>\n","protected":false},"author":7,"featured_media":6722,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[135,236,137,138],"tags":[45,43,98,195,77,9],"class_list":["post-6713","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cms","category-ecommerce","category-frontend","category-tools","tag-entwicklung","tag-erfahrungen","tag-php","tag-testen","tag-tutorial","tag-typo3"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Codeception-Tests in PHP f\u00fcr deine Webseite - clickstorm Blog<\/title>\n<meta name=\"description\" content=\"Codeception automatisiert Browser-Tests in PHP. Erfahre, welche Testarten es gibt, wie die Installation gelingt und was sich bew\u00e4hrt.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.clickstorm.de\/blog\/automatisierte-tests-codeception\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Codeception-Tests in PHP f\u00fcr deine Webseite - clickstorm Blog\" \/>\n<meta property=\"og:description\" content=\"Codeception automatisiert Browser-Tests in PHP. Erfahre, welche Testarten es gibt, wie die Installation gelingt und was sich bew\u00e4hrt.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.clickstorm.de\/blog\/automatisierte-tests-codeception\/\" \/>\n<meta property=\"og:site_name\" content=\"clickstorm Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/de-de.facebook.com\/clickstorm\/\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-08T09:40:14+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-16T09:04:51+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.clickstorm.de\/blog\/wp-content\/uploads\/2026\/06\/codeception-tests-trittsteine.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1170\" \/>\n\t<meta property=\"og:image:height\" content=\"534\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Marc\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@clickstorm_gmbh\" \/>\n<meta name=\"twitter:site\" content=\"@clickstorm_gmbh\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Marc\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"13\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.clickstorm.de\\\/blog\\\/automatisierte-tests-codeception\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.clickstorm.de\\\/blog\\\/automatisierte-tests-codeception\\\/\"},\"author\":{\"name\":\"Marc\",\"@id\":\"https:\\\/\\\/www.clickstorm.de\\\/blog\\\/#\\\/schema\\\/person\\\/594fb824a2f049d33b2a1b4406bfc86b\"},\"headline\":\"Automatisierte Tests mit Codeception: So sichern wir Webprojekte ab\",\"datePublished\":\"2026-06-08T09:40:14+00:00\",\"dateModified\":\"2026-06-16T09:04:51+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.clickstorm.de\\\/blog\\\/automatisierte-tests-codeception\\\/\"},\"wordCount\":2221,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.clickstorm.de\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.clickstorm.de\\\/blog\\\/automatisierte-tests-codeception\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.clickstorm.de\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/codeception-tests-trittsteine.png\",\"keywords\":[\"Entwicklung\",\"Erfahrungen\",\"PHP\",\"Testen\",\"Tutorial\",\"TYPO3\"],\"articleSection\":[\"CMS\",\"eCommerce\",\"Frontend\",\"Tools\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.clickstorm.de\\\/blog\\\/automatisierte-tests-codeception\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.clickstorm.de\\\/blog\\\/automatisierte-tests-codeception\\\/\",\"url\":\"https:\\\/\\\/www.clickstorm.de\\\/blog\\\/automatisierte-tests-codeception\\\/\",\"name\":\"Codeception-Tests in PHP f\u00fcr deine Webseite - clickstorm Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.clickstorm.de\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.clickstorm.de\\\/blog\\\/automatisierte-tests-codeception\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.clickstorm.de\\\/blog\\\/automatisierte-tests-codeception\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.clickstorm.de\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/codeception-tests-trittsteine.png\",\"datePublished\":\"2026-06-08T09:40:14+00:00\",\"dateModified\":\"2026-06-16T09:04:51+00:00\",\"description\":\"Codeception automatisiert Browser-Tests in PHP. Erfahre, welche Testarten es gibt, wie die Installation gelingt und was sich bew\u00e4hrt.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.clickstorm.de\\\/blog\\\/automatisierte-tests-codeception\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.clickstorm.de\\\/blog\\\/automatisierte-tests-codeception\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.clickstorm.de\\\/blog\\\/automatisierte-tests-codeception\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.clickstorm.de\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/codeception-tests-trittsteine.png\",\"contentUrl\":\"https:\\\/\\\/www.clickstorm.de\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/codeception-tests-trittsteine.png\",\"width\":1170,\"height\":534,\"caption\":\"Mann l\u00e4uft \u00fcber Trittsteine im Bach als Symbolbild f\u00fcr Testen\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.clickstorm.de\\\/blog\\\/automatisierte-tests-codeception\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.clickstorm.de\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Automatisierte Tests mit Codeception: So sichern wir Webprojekte ab\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.clickstorm.de\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.clickstorm.de\\\/blog\\\/\",\"name\":\"clickstorm Blog\",\"description\":\"Neuigkeiten rund um Webentwicklung\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.clickstorm.de\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.clickstorm.de\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.clickstorm.de\\\/blog\\\/#organization\",\"name\":\"clickstorm GmbH\",\"url\":\"https:\\\/\\\/www.clickstorm.de\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.clickstorm.de\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.clickstorm.de\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/11\\\/logo.svg\",\"contentUrl\":\"https:\\\/\\\/www.clickstorm.de\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/11\\\/logo.svg\",\"caption\":\"clickstorm GmbH\"},\"image\":{\"@id\":\"https:\\\/\\\/www.clickstorm.de\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/de-de.facebook.com\\\/clickstorm\\\/\",\"https:\\\/\\\/x.com\\\/clickstorm_gmbh\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UCEaU1eUbug6OiI4uU6vA-cA\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.clickstorm.de\\\/blog\\\/#\\\/schema\\\/person\\\/594fb824a2f049d33b2a1b4406bfc86b\",\"name\":\"Marc\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/85b6c585f298a873f9f4be166b9fbba00a9ad2482b92863d227e5d227136d135?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/85b6c585f298a873f9f4be166b9fbba00a9ad2482b92863d227e5d227136d135?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/85b6c585f298a873f9f4be166b9fbba00a9ad2482b92863d227e5d227136d135?s=96&d=mm&r=g\",\"caption\":\"Marc\"},\"url\":\"https:\\\/\\\/www.clickstorm.de\\\/blog\\\/author\\\/marc\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Codeception-Tests in PHP f\u00fcr deine Webseite - clickstorm Blog","description":"Codeception automatisiert Browser-Tests in PHP. Erfahre, welche Testarten es gibt, wie die Installation gelingt und was sich bew\u00e4hrt.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.clickstorm.de\/blog\/automatisierte-tests-codeception\/","og_locale":"de_DE","og_type":"article","og_title":"Codeception-Tests in PHP f\u00fcr deine Webseite - clickstorm Blog","og_description":"Codeception automatisiert Browser-Tests in PHP. Erfahre, welche Testarten es gibt, wie die Installation gelingt und was sich bew\u00e4hrt.","og_url":"https:\/\/www.clickstorm.de\/blog\/automatisierte-tests-codeception\/","og_site_name":"clickstorm Blog","article_publisher":"https:\/\/de-de.facebook.com\/clickstorm\/","article_published_time":"2026-06-08T09:40:14+00:00","article_modified_time":"2026-06-16T09:04:51+00:00","og_image":[{"width":1170,"height":534,"url":"https:\/\/www.clickstorm.de\/blog\/wp-content\/uploads\/2026\/06\/codeception-tests-trittsteine.png","type":"image\/png"}],"author":"Marc","twitter_card":"summary_large_image","twitter_creator":"@clickstorm_gmbh","twitter_site":"@clickstorm_gmbh","twitter_misc":{"Verfasst von":"Marc","Gesch\u00e4tzte Lesezeit":"13\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.clickstorm.de\/blog\/automatisierte-tests-codeception\/#article","isPartOf":{"@id":"https:\/\/www.clickstorm.de\/blog\/automatisierte-tests-codeception\/"},"author":{"name":"Marc","@id":"https:\/\/www.clickstorm.de\/blog\/#\/schema\/person\/594fb824a2f049d33b2a1b4406bfc86b"},"headline":"Automatisierte Tests mit Codeception: So sichern wir Webprojekte ab","datePublished":"2026-06-08T09:40:14+00:00","dateModified":"2026-06-16T09:04:51+00:00","mainEntityOfPage":{"@id":"https:\/\/www.clickstorm.de\/blog\/automatisierte-tests-codeception\/"},"wordCount":2221,"commentCount":0,"publisher":{"@id":"https:\/\/www.clickstorm.de\/blog\/#organization"},"image":{"@id":"https:\/\/www.clickstorm.de\/blog\/automatisierte-tests-codeception\/#primaryimage"},"thumbnailUrl":"https:\/\/www.clickstorm.de\/blog\/wp-content\/uploads\/2026\/06\/codeception-tests-trittsteine.png","keywords":["Entwicklung","Erfahrungen","PHP","Testen","Tutorial","TYPO3"],"articleSection":["CMS","eCommerce","Frontend","Tools"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.clickstorm.de\/blog\/automatisierte-tests-codeception\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.clickstorm.de\/blog\/automatisierte-tests-codeception\/","url":"https:\/\/www.clickstorm.de\/blog\/automatisierte-tests-codeception\/","name":"Codeception-Tests in PHP f\u00fcr deine Webseite - clickstorm Blog","isPartOf":{"@id":"https:\/\/www.clickstorm.de\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.clickstorm.de\/blog\/automatisierte-tests-codeception\/#primaryimage"},"image":{"@id":"https:\/\/www.clickstorm.de\/blog\/automatisierte-tests-codeception\/#primaryimage"},"thumbnailUrl":"https:\/\/www.clickstorm.de\/blog\/wp-content\/uploads\/2026\/06\/codeception-tests-trittsteine.png","datePublished":"2026-06-08T09:40:14+00:00","dateModified":"2026-06-16T09:04:51+00:00","description":"Codeception automatisiert Browser-Tests in PHP. Erfahre, welche Testarten es gibt, wie die Installation gelingt und was sich bew\u00e4hrt.","breadcrumb":{"@id":"https:\/\/www.clickstorm.de\/blog\/automatisierte-tests-codeception\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.clickstorm.de\/blog\/automatisierte-tests-codeception\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.clickstorm.de\/blog\/automatisierte-tests-codeception\/#primaryimage","url":"https:\/\/www.clickstorm.de\/blog\/wp-content\/uploads\/2026\/06\/codeception-tests-trittsteine.png","contentUrl":"https:\/\/www.clickstorm.de\/blog\/wp-content\/uploads\/2026\/06\/codeception-tests-trittsteine.png","width":1170,"height":534,"caption":"Mann l\u00e4uft \u00fcber Trittsteine im Bach als Symbolbild f\u00fcr Testen"},{"@type":"BreadcrumbList","@id":"https:\/\/www.clickstorm.de\/blog\/automatisierte-tests-codeception\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.clickstorm.de\/blog\/"},{"@type":"ListItem","position":2,"name":"Automatisierte Tests mit Codeception: So sichern wir Webprojekte ab"}]},{"@type":"WebSite","@id":"https:\/\/www.clickstorm.de\/blog\/#website","url":"https:\/\/www.clickstorm.de\/blog\/","name":"clickstorm Blog","description":"Neuigkeiten rund um Webentwicklung","publisher":{"@id":"https:\/\/www.clickstorm.de\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.clickstorm.de\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/www.clickstorm.de\/blog\/#organization","name":"clickstorm GmbH","url":"https:\/\/www.clickstorm.de\/blog\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.clickstorm.de\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.clickstorm.de\/blog\/wp-content\/uploads\/2017\/11\/logo.svg","contentUrl":"https:\/\/www.clickstorm.de\/blog\/wp-content\/uploads\/2017\/11\/logo.svg","caption":"clickstorm GmbH"},"image":{"@id":"https:\/\/www.clickstorm.de\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/de-de.facebook.com\/clickstorm\/","https:\/\/x.com\/clickstorm_gmbh","https:\/\/www.youtube.com\/channel\/UCEaU1eUbug6OiI4uU6vA-cA"]},{"@type":"Person","@id":"https:\/\/www.clickstorm.de\/blog\/#\/schema\/person\/594fb824a2f049d33b2a1b4406bfc86b","name":"Marc","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/85b6c585f298a873f9f4be166b9fbba00a9ad2482b92863d227e5d227136d135?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/85b6c585f298a873f9f4be166b9fbba00a9ad2482b92863d227e5d227136d135?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/85b6c585f298a873f9f4be166b9fbba00a9ad2482b92863d227e5d227136d135?s=96&d=mm&r=g","caption":"Marc"},"url":"https:\/\/www.clickstorm.de\/blog\/author\/marc\/"}]}},"_links":{"self":[{"href":"https:\/\/www.clickstorm.de\/blog\/wp-json\/wp\/v2\/posts\/6713","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.clickstorm.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.clickstorm.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.clickstorm.de\/blog\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/www.clickstorm.de\/blog\/wp-json\/wp\/v2\/comments?post=6713"}],"version-history":[{"count":21,"href":"https:\/\/www.clickstorm.de\/blog\/wp-json\/wp\/v2\/posts\/6713\/revisions"}],"predecessor-version":[{"id":6775,"href":"https:\/\/www.clickstorm.de\/blog\/wp-json\/wp\/v2\/posts\/6713\/revisions\/6775"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.clickstorm.de\/blog\/wp-json\/wp\/v2\/media\/6722"}],"wp:attachment":[{"href":"https:\/\/www.clickstorm.de\/blog\/wp-json\/wp\/v2\/media?parent=6713"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.clickstorm.de\/blog\/wp-json\/wp\/v2\/categories?post=6713"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.clickstorm.de\/blog\/wp-json\/wp\/v2\/tags?post=6713"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}