In diesem Artikel werden hauptsächlich die Funktionen von PHPUnit zum Testen privater Eigenschaften und Methoden vorgestellt. Außerdem werden die relevanten Betriebstechniken und Vorsichtsmaßnahmen für die Verwendung von PHPUnit zum Testen privater Eigenschaften und Methoden in Form von Beispielen detailliert analysiert it
Das Beispiel in diesem Artikel beschreibt das PHPUnit-Testen privater Eigenschaften und Methodenfunktionen. Teilen Sie es als Referenz mit allen. Die Details lauten wie folgt:
1. Private Methoden in der Testklasse:
class Sample { private $a = 0; private function run() { echo $a; } }
Das Obige schreibt einfach eine Klasse, die eine private Variable und eine private Methode enthält. Da geschützte und private Methoden nicht direkt wie öffentliche Methoden aufgerufen werden können, ist die Verwendung von phpunit für Einzeltests sehr unpraktisch, insbesondere wenn eine Klasse nur wenige Schnittstellen zur Außenwelt bereitstellt und eine große Anzahl privater Methoden verwendet intern. Situation.
Für geschützte Methoden wird empfohlen, die Vererbung zum Testen zu verwenden, daher werde ich hier nicht auf Details eingehen. Zum Testen privater Methoden wird empfohlen, den Reflexionsmechanismus von PHP zu verwenden. Hier ist ohne weiteres der Code:
class testSample() { $method = new ReflectionMethod('Sample', 'run'); $method->setAccessible(true); //将run方法从private变成类似于public的权限 $method->invoke(new Sample()); //调用run方法 }
Wenn die Ausführungsmethode statisch ist, wie zum Beispiel:
private static function run() { echo 'run is a private static function'; }
Dann kann die Aufruffunktion auch so geschrieben werden:
$method->invoke(null); //只有静态方法可以不必传类的实例化
Wenn run auch Parameter übergeben muss, zum Beispiel:
private function run($x, $y) { return $x + $y; }
Dann kann der Testcode geändert werden in:
$method->invokeArgs(new Sample(), array(1, 2)); //array中依次写入要传的参数。执行结果返回3
[Hinweis ]: Verwenden Sie Reflection, um Private zu testen. Obwohl die Methode gut ist, wird die setAccessible-Funktion erst nach PHP5.3.2 (>=5.3.2) unterstützt.
2. Private abrufen/festlegen Attribute
Nachdem wir über private Methoden gesprochen haben, werfen wir einen Blick auf private Attribute. Nehmen wir immer noch die Sample-Klasse als Beispiel, wenn Sie den Wert des privaten Attributs $ abrufen oder festlegen möchten a in der Sample-Klasse können Sie die folgende Methode verwenden:
public function testPrivateProperty() { $reflectedClass = new ReflectionClass('Sample'); $reflectedProperty = $reflectedClass->getProperty('a'); $reflectedProperty->setAccessible(true); $reflectedProperty->getValue(); //获取$a的值 $reflectedProperty->setValue(123); //给$a赋值:$a = 123; }
Die obige Methode ist weiterhin für statische Attribute gültig.
An diesem Punkt hat man das Gefühl, dass das Testen privater Methoden oder Eigenschaften sofort einfach geworden ist.
Anhang: PHPunit testet private Methoden (englisches Original)
Dieser Artikel ist Teil einer Serie zum Testen von nicht testbarem Code:
Private Methoden testen
Code testen, der Singletons verwendet
Statische Methoden stubbing
Stubbing hartcodierter Abhängigkeiten
Nein, nicht diese privaten Abhängigkeiten. Wenn Sie dabei Hilfe benötigen, könnte dieses Buch hilfreich sein.
Eine Frage, die ich bekomme Immer wieder, wenn es um Unit-Tests geht, lautet:
„Wie teste ich die privaten Attribute und Methoden meiner Objekte?“
Nehmen wir an, wir haben ein Klasse Foo:
<?php class Foo { private $bar = 'baz'; public function doSomething() { return $this->bar = $this->doSomethingPrivate(); } private function doSomethingPrivate() { return 'blah'; } } ?>
Bevor wir untersuchen, wie geschützte und private Attribute und Methoden direkt getestet werden können, werfen wir einen Blick darauf, wie sie getestet werden können indirekt.
Der folgende Test ruft die testDoSomething()-Methode auf, die wiederum die doSomethingPrivate()-Methode aufruft:
<?php class FooTest extends PHPUnit_Framework_TestCase { /** * @covers Foo::doSomething * @covers Foo::doSomethingPrivate */ public function testDoSomething() { $foo = new Foo; $this->assertEquals('blah', $foo->doSomething()); } } ?>
Der obige Test geht davon aus testDoSomething() funktioniert nur dann korrekt, wenn testDoSomethingPrivate() korrekt funktioniert. Das Problem bei diesem Ansatz besteht darin, dass wir nicht direkt wissen, wo die Grundursache für den Fehler liegen könnte entweder in testDoSomething() oder testDoSomethingPrivate(). Dies macht den Test weniger wertvoll.
PHPUnit unterstützt das Lesen geschützter und privater Attribute über die Methode PHPUnit_Framework_Assert::readAttribute().
<?php class FooTest extends PHPUnit_Framework_TestCase { public function testPrivateAttribute() { $this->assertAttributeEquals( 'baz', /* expected value */ 'bar', /* attribute name */ new Foo /* object */ ); } } ?>
PHP 5.3.2 führt die Methode ReflectionMethod::setAccessible() ein, um den Aufruf geschützter und privater Methoden über die Reflection-API zu ermöglichen:
<?php class FooTest extends PHPUnit_Framework_TestCase { /** * @covers Foo::doSomethingPrivate */ public function testPrivateMethod() { $method = new ReflectionMethod( 'Foo', 'doSomethingPrivate' ); $method->setAccessible(TRUE); $this->assertEquals( 'blah', $method->invoke(new Foo) ); } } ?>
Im obigen Test testen wir testDoSomethingPrivate() direkt. Wenn es fehlschlägt, wissen wir sofort, wo wir nach der Grundursache suchen müssen.
Ich stimme Dave Thomas und Andy Hunt zu, die in ihrem Buch „Pragmatic Unit Testing“ schreiben:
Verwandte Empfehlungen:„Im Allgemeinen möchte man zum Testen keine Kapselung aufbrechen (oder wie Mama immer sagte: „Tu es nicht.“ Legen Sie Ihre privaten Daten offen!“) In den meisten Fällen sollten Sie in der Lage sein, eine Klasse zu testen, indem Sie ihre öffentlichen Methoden ausführen. Wenn sich hinter privatem oder geschütztem Zugriff eine wichtige Funktionalität verbirgt, kann dies ein Warnsignal dafür sein, dass es eine andere Klasse gibt Da drin kämpft es darum, rauszukommen
Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er wird für das Studium aller hilfreich sein. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website.
Analyse des von PHP und Redis implementierten pessimistischen Sperrmechanismus
Zusammenfassung der Verwendung variabler Funktionen in PHP
Das obige ist der detaillierte Inhalt vonFunktionsanalyse privater Eigenschaften und Methoden für PHPUnit-Tests. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!