![PHP und PHPUnit Logos](/sites/default/files/2024-05/php-unit.png)
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:
- Eine Methode definieren, die die Testdaten zurückgibt.
- 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.