Ich habe eine Vielzahl von PHP-Skripten, die die mysqli
-Suite von Funktionen verwenden, um auf eine Datenbank zuzugreifen. Ich habe diese Skripts geschrieben, um die verschiedenen Fehlerbedingungen zu behandeln (z. B. mysqli_stmt_execute
gibt false zurück).
Gibt es eine einfache Möglichkeit, diese Fehlerbedingungen so zu fälschen, dass die vom Benutzer empfangene Ausgabe für diese Bedingungen geeignet ist?
zum Beispiel:
%Vor%Alles was Sie ändern müssen, damit jede Execute-Methode false zurückgibt, ist:
%Vor%zum Beispiel:
%Vor% Ihr Skript wird my_faking_namespace\mysqli_stmt_execute()
anstelle der PHP-Version aufrufen.
Hinweis: Dies funktioniert nicht, wenn Sie die Funktionen wie \mysqli_stmt_execute()
aufrufen, da diese Version explizit den globalen Namespace aufruft.
Diese ändern die Funktionen auf der Call-Stack-Ebene und ändern php intern durch die Verwendung von benutzerdefinierten Erweiterungsmodulen (erfordert eine Installation).
override_function()
und rename_function()
runkit_function_copy
, runkit_function_redefine
, runkit_function_remove
, runkit_function_rename
und kann sich ändern so ziemlich alles, was du begehrst. nJoy!
Wenn Sie nach automatischen Tests suchen, ist der beste Weg (mit PHP) PHPUnit .
Mit PHPUnit können Sie Komponententests (insbesondere Assertions) schreiben, mit denen Sie überprüfen können, ob die vom Benutzer empfangene Ausgabe unter verschiedenen Bedingungen geeignet ist.
Wenn Sie sich nicht in einer Produktionsumgebung befinden, ändern Sie am besten die verschiedenen Datenbankparameter in Ihrem PHP.
Vielleicht stellen Sie die falsche Frage: Warum hängt Ihre Kerngeschäftslogik von Bibliotheken / APIs von Drittanbietern ab? Hast du von der sogenannten Zwiebelarchitektur gehört? Wenn Sie Ihre Anwendung mehr auf diese Bereiche aufteilen - Domain, Business, Infrastruktur / Tests -, können Sie die Dinge, die sich nicht ändern, viel einfacher testen: Ihre Geschäftslogik.
Da PHP jedoch eine dynamisch typisierte Sprache ist, ist Spott im Wesentlichen frei. Solange Sie OO-Funktionen und nicht die globalen Funktionen verwenden, ist alles, was Sie testbaren Code erstellen müssen, eine Möglichkeit, einen falschen Datenbank-Handle in Ihren Code zu injizieren. Ein guter Weg ist, einen $db
Parameter zu Ihren Funktionen / Methoden hinzuzufügen. Etwas triviales wie folgt:
Übergeben Sie dann in Ihren Unit-Tests, die updateStuff
abdecken, ein Mock-Objekt als $db
-Parameter.