Direkt zum Inhalt
MP-Development Code, Bikes and more

Wie man in PHPUnit Data Provider benutzt

Gespeichert von Michael am
PHP und PHPUnit Logos

Unit-Tests sind ein wichtiger Bestandteil der Softwareentwicklung, um sicherzustellen, dass einzelne Komponenten unserer Anwendung korrekt funktionieren. In PHP ist PHPUnit das am häufigsten verwendete Test-Framework. Ein nützliches Feature von PHPUnit sind Data Provider, die es ermöglichen, dasselbe Test-Szenario mit unterschiedlichen Datensätzen auszuführen. In diesem Blogbeitrag werde ich erläutern, wie man Data Provider in PHPUnit benutzt, und verschiedene Beispiele dafür zeigen.

Was sind Data Provider?

Ein Data Provider in PHPUnit ist eine Methode, die eine Sammlung von Datensätzen zurückgibt. Jede Datensammlung besteht aus einem Array von Werten, die als Argumente für den Testfall verwendet werden. Dies ist besonders nützlich, wenn Sie denselben Test mit verschiedenen Eingabewerten ausführen möchten, ohne den Testcode mehrfach zu schreiben.

Wie benutzt man Data Provider?

Um einen Data Provider zu verwenden, müssen Sie:

  1. Eine Methode definieren, die die Testdaten zurückgibt.
  2. Diese Methode mit der Annotation @dataProvider im Testfall referenzieren.

Beispiel 1: Einfache Verwendung eines Data Providers

Nehmen wir an, wir haben eine Funktion, die überprüft, ob eine Zahl gerade ist. Hier ist eine einfache Implementierung:

class Math
{
   public static function isEven($number)
   {
       return $number % 2 === 0;
   }
}

 

Nun schreiben wir einen Unit-Test für diese Funktion mit einem Data Provider.

 

use PHPUnit\Framework\TestCase;

class MathTest extends TestCase
{
   /**
    * @dataProvider evenNumberProvider
    */
   public function testIsEven($number, $expected)
   {
       $this->assertEquals($expected, Math::isEven($number));
   }
   
   public static function evenNumberProvider(): array
   {
       return [
           [2, true],
           [3, false],
           [4, true],
           [5, false],
       ];
   }
}

 

In diesem Beispiel liefert die Methode evenNumberProvider verschiedene Zahlen und die erwarteten Ergebnisse. Der Test testIsEven wird für jedes Datensatzpaar (Zahl und erwartetes Ergebnis) ausgeführt.

 

Beispiel 2: Data Provider mit mehreren Parametern

 

Nehmen wir an, wir haben eine Funktion, die zwei Zahlen addiert. Wir wollen testen, ob die Addition korrekt ist.

 

class Math
{
   public static function add($a, $b)
   {
       return $a + $b;
   }
}

 

Hier ist der entsprechende Unit-Test mit einem Data Provider:

 

use PHPUnit\Framework\TestCase;

class MathTest extends TestCase
{
   /**
    * @dataProvider additionProvider
    */
   public function testAdd($a, $b, $expected)
   {
       $this->assertEquals($expected, Math::add($a, $b));
   }
   
   public static function additionProvider(): array
   {
       return [
           [1, 1, 2],
           [2, 2, 4],
           [1, 2, 3],
           [0, 0, 0],
       ];
   }
}

 

Hier liefert der Data Provider additionProvider Arrays mit drei Werten: die beiden Zahlen, die addiert werden sollen, und das erwartete Ergebnis.

 

Beispiel 3: Data Provider aus externer Quelle

 

Manchmal kann es nützlich sein, Daten aus einer externen Quelle wie einer Datei oder Datenbank zu laden. Hier ist ein Beispiel, wie man Daten aus einer CSV-Datei verwenden kann.

Zuerst erstellen wir eine CSV-Datei testdata.csv:

 

a,b,expected
1,1,2
2,2,4
3,5,8

 

Dann schreiben wir unseren Test:

 

use PHPUnit\Framework\TestCase;

class MathTest extends TestCase
{
   /**
    * @dataProvider additionProviderFromCsv
    */
   public function testAddFromCsv($a, $b, $expected)
   {
       $this->assertEquals($expected, Math::add($a, $b));
   }
   
   public static function additionProviderFromCsv()
   {
       $data = [];
       if (($handle = fopen('testdata.csv', 'r')) !== FALSE) {
           // Skip the first line (header)
           fgetcsv($handle);
           while (($row = fgetcsv($handle, 1000, ',')) !== FALSE) {
               $data[] = [(int)$row[0], (int)$row[1], (int)$row[2]];
           }
           fclose($handle);
       }
       return $data;
   }
}

 

Hier wird der Data Provider additionProviderFromCsv die Daten aus der CSV-Datei lesen und sie als Testdaten bereitstellen.

Fazit

Data Provider in PHPUnit sind eine leistungsstarke Möglichkeit, Tests mit verschiedenen Datensätzen effizient zu erstellen und zu verwalten. Sie helfen, Redundanz im Testcode zu vermeiden und Tests besser zu strukturieren. In diesem Beitrag haben wir verschiedene Beispiele gesehen, wie Data Provider genutzt werden können, von einfachen Arrays bis hin zu Daten aus externen Quellen.

Durch die Nutzung von Data Providern können Sie Ihre Tests leichter wartbar und erweiterbar machen, was zu einer robusteren und fehlerresistenteren Anwendung führt.

Neuen Kommentar hinzufügen

CAPTCHA
Diese Sicherheitsfrage überprüft, ob Sie ein menschlicher Besucher sind und verhindert automatisches Spamming.
Blog-Tags