Gibt es eine Möglichkeit, prozeduralen Code zu testen? Ich habe mir PHPUnit angesehen, das eine großartige Möglichkeit zu sein scheint, automatisierte Tests zu erstellen. Es scheint jedoch auf objektorientierten Code ausgerichtet zu sein. Gibt es Alternativen für prozeduralen Code?
Oder sollte ich die Website auf objektorientiert umstellen, bevor ich versuche, die Website zu testen? Dies kann eine Weile dauern, was ein kleines Problem darstellt, da ich nicht viel Zeit verlieren kann.
PHPUnit verwendet selbst objektstrukturierte Schnittstellen zur Parität mit anderen xUnit-Inkarnationen und weil dies seine eigene Implementierung vereinfacht. Das bedeutet jedoch nicht, dass es nicht zum Testen von prozeduralem Code verwendet werden kann. (Möglicherweise ist dies jedoch nicht die einzige/beste Option.)
– Mario
16. Februar 2011 um 19:42 Uhr
Ja Mario, ich habe andere wie SimpleTest gesehen, aber PHPUnit scheint am häufigsten verwendet zu werden und ich habe einige Erfahrung mit JUnit, daher sollte der Lernaufwand ziemlich minimal sein!
– Daniel West
16. Februar 2011 um 20:26
Sie können prozeduralen Code mit PHPUnit testen. Unit-Tests sind nicht an die objektorientierte Programmierung gebunden. Sie testen Codeeinheiten. In OO ist eine Codeeinheit eine Methode. In prozeduralem PHP handelt es sich meiner Meinung nach um ein ganzes Skript (eine Datei).
Obwohl OO-Code einfacher zu warten und zu testen ist, bedeutet das nicht, dass prozedurales PHP nicht getestet werden kann.
class testSimple_add extends PHPUnit_Framework_TestCase {
private function _execute(array $params = array()) {
$_GET = $params;
ob_start();
include 'simple_add.php';
return ob_get_clean();
}
public function testSomething() {
$args = array('arg1'=>30, 'arg2'=>12);
$this->assertEquals(42, $this->_execute($args)); // passes
$args = array('arg1'=>-30, 'arg2'=>40);
$this->assertEquals(10, $this->_execute($args)); // passes
$args = array('arg1'=>-30);
$this->assertEquals(10, $this->_execute($args)); // fails
}
}
Für dieses Beispiel habe ich eine deklariert _execute Methode, die ein Array von GET-Parametern akzeptiert, die Ausgabe erfasst und zurückgibt, anstatt sie immer wieder einzuschließen und zu erfassen. Anschließend vergleiche ich die Ausgabe mit den regulären Assertionsmethoden von PHPUnit.
Natürlich schlägt die dritte Behauptung fehl (hängt jedoch von error_reporting ab), da das getestete Skript eine ausgibt Undefinierter Index Fehler.
Natürlich sollten Sie beim Testen error_reporting angeben E_ALL | E_STRICT.
Danke für die ausführliche Antwort! Es hat mir sehr geholfen. Ich habe tatsächlich Funktionen, die sich mit der gesamten Geschäftslogik befassen, also schätze ich, dass ich die PHP-Datei darin einbinden und diese auf ähnliche Weise testen kann?
– Daniel West
16. Februar 2011 um 20:25
@Daniel: Ja. Tatsächlich ähnelt das Testen von Funktionen stark dem Testen von Objektmethoden. Sie senden ihm eine Eingabe und überprüfen, ob die Ausgabe Ihren Erwartungen entspricht.
– Netcoder
16. Februar 2011 um 20:27
Für Folgendes abgelehnt Meinung In dieser Antwort heißt es: „OO-Code ist einfacher zu warten und zu testen“. Das stimmt absolut nicht.
– vhs
18. Mai 2017 um 5:28
Diese Antwort hilft nicht wirklich beim Unit-Test-Prozedurcode. Bitte schlagen Sie vor, wie wir mit Abhängigkeiten zwischen Funktionen umgehen können. Eine Funktion ruft möglicherweise mehrere andere darin enthaltene Funktionen auf. Wie kann ich also diese eine Funktion isoliert von ihren Abhängigkeiten testen? Wenn der Code objektorientiert wäre, könnte ich Schein-/Stub-Objekte usw. verwenden, um das Verhalten verschiedener Abhängigkeiten zu simulieren und so mehrere mögliche Testfälle zu generieren.
– rineez
9. Okt. 2017 um 7:48
Wie sollen wir Skript-URIS und damit Include-Anweisungen verwalten? Sicherlich ist es nicht der richtige Weg, sie nur fest in die Testmethode zu codieren?
– tscherg
11. Mai 2018 um 10:42 Uhr
14531900cookie-checkWie teste ich prozedurales PHP? [duplicate]yes
PHPUnit verwendet selbst objektstrukturierte Schnittstellen zur Parität mit anderen xUnit-Inkarnationen und weil dies seine eigene Implementierung vereinfacht. Das bedeutet jedoch nicht, dass es nicht zum Testen von prozeduralem Code verwendet werden kann. (Möglicherweise ist dies jedoch nicht die einzige/beste Option.)
– Mario
16. Februar 2011 um 19:42 Uhr
Ja Mario, ich habe andere wie SimpleTest gesehen, aber PHPUnit scheint am häufigsten verwendet zu werden und ich habe einige Erfahrung mit JUnit, daher sollte der Lernaufwand ziemlich minimal sein!
– Daniel West
16. Februar 2011 um 20:26