Der Albtraum von Code des Unit -Tests mit $ Global
Die Verwendung von $ globals wird Unit -Tests zerstören, da sie versteckte Abhängigkeiten einführt, was zu einem staatlichen Austausch zwischen Tests, verwirrenden Einstellungen, schlechter Isolation und schwer zu simulieren. 2. Lösungen umfassen: Zuerst speichern und dann den globalen Staat wiederherstellen, um eine Kontamination zu vermeiden; 3.. Einkapseln $ globals zugreifen in Serviceklassen und übergeben Sie sie durch die Abhängigkeitsinjektion, um die Verwendung von Scheinobjekten in Tests zu erleichtern. 4. Selbst leichte Abhängigkeitsinjektion kann die Testbarkeit der Tests erheblich verbessern und die globalen Variablen direkt vermieden werden. 5. Um zukünftige Probleme zu vermeiden, sollten $ globals deaktiviert sein und Konfigurationsobjekte, Abhängigkeitsinjektionsbehälter oder Umgebungsvariablen verwenden und statische Analyse -Tools verwenden, um die Verwendung von Hyperglobalvariablen zu erkennen. Die endgültige Antwort lautet: Die Abhängigkeit von $ globals muss durch Einkapselungs- und Abhängigkeitsinjektion nach und nach elektrisch beseitigt werden, um zuverlässige und aufrechterhaltene Unit -Tests zu ermöglichen.
Der Unit -Testcode, der stark auf $GLOBALS
beruht, ist ein häufiger Schmerzpunkt in Legacy -PHP -Anwendungen. Es ist nicht nur unpraktisch - es kann Tests unzuverlässig, schwer zu pflegen und eng mit dem globalen Staat verbunden zu machen. Hier ist, warum es ein Problem ist und wie man damit umgeht.

Warum $ Globals Unit -Tests bricht
$GLOBALS
ist ein superglobales Array in PHP, das Verweise auf alle Variablen enthält, die derzeit im globalen Bereich definiert sind. Wenn Code von $ global liest oder auf $GLOBALS
schreibt, wird versteckte Abhängigkeiten eingeführt. Dies macht Unit -Tests schwierig, weil:
- Der Staat wird über Tests hinweg geteilt : Ein Test kann eine globale Variable verändern und das Ergebnis eines anderen beeinflussen.
- Das Setup wird chaotisch : Sie müssen den globalen Zustand vor und nach jedem Test manuell aufstellen.
- Tests sind nicht isoliert : Echte Unit -Tests sollten isoliert durchgeführt werden, aber Globale erzeugen Nebenwirkungen.
- Schwer zu verspotten oder stumm zu sein : Im Gegensatz zu injizierten Abhängigkeiten können
$GLOBALS
nicht einfach ersetzt oder verspottet werden.
Zum Beispiel:

Funktion getuSerrol () { $ globals ['user_role'] zurückgeben? 'Gast'; }
Testen Dies erfordert, dass $GLOBALS['user_role']
direkt festgelegt wird - das globale Umfang und Risikointerferenz mit anderen Tests.
So testen Code, der $ Global verwendet (ohne alles umzuschreiben)
Manchmal kann man die gesamte Codebasis nicht sofort widerspiegeln. Hier sind praktische Strategien, um Tests sowieso zu schreiben.

1. Speichern und wiederherstellen Sie den globalen Staat
PHPUNIT bietet eine integrierte Option zur Erhaltung des globalen Zustands:
/** * @runtestSinSesparateProcess * @PreserveGlobalState aktiviert */
Aber das ist langsam und klobig. Ein besserer manueller Ansatz:
public function testgetUserRole () { $ original = $ global; $ Globals ['user_role'] = 'admin'; $ this-> assertequals ('admin', getuserrole ()); // Wiederherstellen $ Globals = $ original; }
Das funktioniert, aber es ist zerbrechlich. Das Vergessen zur Wiederherstellung kann andere Tests durchbrechen.
2. Wickeln Sie $ Globals Access in einen Service ein
Einführung Eine dünne Wrapper zum abstrakten Zugriff auf Globale:
Klasse GlobalConfig { Öffentliche Funktion get ($ key, $ default = null) { Return $ global [$ key] ?? $ Standard; } öffentliche Funktionssatz ($ Key, $ value) { $ Globals [$ key] = $ value; } }
Aktualisieren Sie dann Ihre Funktionen, um dies als Abhängigkeit zu akzeptieren:
Funktion getuSerRole (GlobalConfig $ config) { $ config-> get ('user_role', 'guest') zurückgeben; }
Jetzt können Sie in Tests einen Schein bestehen:
public function testgetUserrolwithmock () { $ config = $ this-> createMock (globalConfig :: class); $ config-> methode ('get')-> WillReturn ('admin'); $ this-> assertequals ('admin', getuSerrol ($ config)); }
Dies ist ein sicheres, inkrementelles Refactoring.
3.. Verwenden Sie die Abhängigkeitsinjektion (sogar leicht)
Vermeiden Sie es, globale Variablen direkt anzurufen. Geben Sie stattdessen die erforderlichen Werte als Parameter übergeben:
Funktion sendemail ($ to, $ subjekt, $ von = null) { $ von = $ von ?? $ Globals ['admin_email']; // ... }
Besser:
Funktion Sendemail ($ to, $ Betreff, $ von) { // $ von ist jetzt explizit }
Jetzt ist der Anrufer dafür verantwortlich, den Wert bereitzustellen - Tests unkompliziert.
Zukünftige Probleme verhindern
Sobald Sie die Kontrolle erlangen, setzen Sie bessere Praktiken durch:
- Vermeiden Sie $ Globals vollständig in neuem Code.
- Verwenden Sie Konfigurationsobjekte oder Abhängigkeitsinjektionsbehälter.
- Nutzen Sie Umgebungsvariablen oder Konfigurationsdateien mit explizitem Laden.
- PSR -Standards und moderne PHP -Praktiken übernehmen .
Statische Analysewerkzeuge wie Phpstan oder Psalm können dazu beitragen, die Verwendung von Superglobal zu erkennen und zu kennzeichnen.
Grundsätzlich schafft $GLOBALS
versteckte Abhängigkeiten, die die Testbarkeit untergraben. Während Sie vorübergehend daran arbeiten können, indem Sie Status sparen oder Zugang einwickeln, ist die tatsächliche Korrektur in Bezug auf explizite Abhängigkeiten nachgearbeitet. Es ist nicht glamourös, aber es macht Ihren Code - und Tests - zuverlässiger.
Das obige ist der detaillierte Inhalt vonDer Albtraum von Code des Unit -Tests mit $ Global. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Abhängigkeitsinjektion (DI) Issuperiortousing $ GlobalsBecauseitMakesDependenciesExPlicit, wohingegen $ GlobalShidestheM.2.diimProvestabilitätsbylowingAsymockingofDependenzen, im Gegensatz zu $ GlobalSwhichRequiresManipulationsgloboBalstate.3.DireducestightChouPlyDecouPling -byDecoubling -byDecouPling -byDecouPling -byDecouPlingCouPling -byDecouPling -byDecouPling -ByDecouPlingCouPlingChouPlingChouPlingChouPlingChouPling -BydecouPling -byDouPlit

$ Global und global werden verwendet, um in Funktionen auf globale Variablen zuzugreifen, aber es gibt wichtige Unterschiede: 1. $ Globals ist ein Hyperglobal -Array, das über Schlüsselnamen wie $ Globals ['var'] zugreift, während global eine Sprachstruktur ist und global $ var deklariert werden muss. 2. $ global erfordert keine Vordeklaration und kann direkt verwendet werden. Global muss zuerst deklariert und dann verwendet werden. 3. $ global unterstützt dynamischen Zugriff wie $ global [$ varname], global unterstützt keine dynamische Erklärung. 4.Unset ($ globals ['var']) löscht die globale Variable selbst, während sich Unset ($ var) in globaler $ v befindet

Deaktiviert $ globalSallowsuninteredVariableOverwriting, aktivieren die AngriffeInipulateCriticalDatalikeSerIdSorroles-THoutValidation; 2.itincreasheteteTackSurfaceBreakingCapsulation, MakingFunctionsDependendongloboBalStaThatcanbeexplotloted

$ GlobalsManipulationCancauseUnpredictableBugsinphp; todebugandresolveit, 1.Ver Verständnis $ GlobalSprovidesglobalaccesstoAllvariables, MakingStatechangeshardtotracker;

Die Verwendung von $ globals wird Unit -Tests zerstören, da sie versteckte Abhängigkeiten einführt, was zu einem staatlichen Austausch zwischen Tests, verwirrenden Einstellungen, schlechter Isolation und schwer zu simulieren. 2. Lösungen umfassen: Zuerst einsparen und dann den globalen Staat wiederherstellen, um Kontaminationen zu vermeiden; 3.. Einkapseln $ global zugreifen in Serviceklassen und über die Abhängigkeitsinjektion weitergeben, was die Verwendung von Scheinobjekten in Tests erleichtert. 4. Selbst leichte Abhängigkeitsinjektion kann die Testbarkeit erheblich verbessern, und das direkte Lesen globaler Variablen sollte vermieden werden. 5. Um zukünftige Probleme zu vermeiden, sollten $ globale deaktiviert sein, und Konfigurationsobjekte, Abhängigkeitsinjektionsbehälter oder Umgebungsvariablen sollten stattdessen verwendet werden, und mit Hilfe statischer Analyse -Tools sollten Hyperglobal -Variablen erkannt werden. Die endgültige Antwort lautet: Die Abhängigkeit von $ global

Mit $ globalScreateShiddendependenzen, MakingFunctionShardertotest, fragil und unreusebar;

ModernPhpFrameWorkSlikelaravelandSymfonyusedEpendencyInjectionToeliminatereliance $ globalsByInjectingDependencisexplicitly, Verbesserung der Testabilität und Reduzierung der Kopplung.2.

Mit $ globalSmaybeAcceptableInlegacysystems LikewordpressPluginSwhereTensuresCompatibilität, 2.itcanBeUsedTeTeTinguringBootstrappingBeForatePendencyInjunctionSpaceableable, 3.ItissougableableFableForread-OnlydebuggingTool-Invelopmentenventorenien.Despitethescescescescescescescescescesces
