Heim > Backend-Entwicklung > PHP-Tutorial > Funktionsanalyse privater Eigenschaften und Methoden für PHPUnit-Tests

Funktionsanalyse privater Eigenschaften und Methoden für PHPUnit-Tests

不言
Freigeben: 2023-03-31 20:00:02
Original
1434 Leute haben es durchsucht

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;
  }
}
Nach dem Login kopieren

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方法
}
Nach dem Login kopieren

Wenn die Ausführungsmethode statisch ist, wie zum Beispiel:

private static function run()
{
  echo 'run is a private static function';
}
Nach dem Login kopieren

Dann kann die Aufruffunktion auch so geschrieben werden:

$method->invoke(null); //只有静态方法可以不必传类的实例化
Nach dem Login kopieren

Wenn run auch Parameter übergeben muss, zum Beispiel:

private function run($x, $y)
{
  return $x + $y;
}
Nach dem Login kopieren

Dann kann der Testcode geändert werden in:

$method->invokeArgs(new Sample(), array(1, 2));
//array中依次写入要传的参数。执行结果返回3
Nach dem Login kopieren

[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;
}
Nach dem Login kopieren

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 = &#39;baz&#39;;
  public function doSomething()
  {
    return $this->bar = $this->doSomethingPrivate();
  }
  private function doSomethingPrivate()
  {
    return &#39;blah&#39;;
  }
}
?>
Nach dem Login kopieren

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(&#39;blah&#39;, $foo->doSomething());
  }
}
?>
Nach dem Login kopieren

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(
     &#39;baz&#39;, /* expected value */
     &#39;bar&#39;, /* attribute name */
     new Foo /* object     */
    );
  }
}
?>
Nach dem Login kopieren

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(
     &#39;Foo&#39;, &#39;doSomethingPrivate&#39;
    );
    $method->setAccessible(TRUE);
    $this->assertEquals(
     &#39;blah&#39;, $method->invoke(new Foo)
    );
  }
}
?>
Nach dem Login kopieren

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:

„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.

Verwandte Empfehlungen:

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage