Kurz eine Frage: Kann phpunit beim Ausführen von Tests mehrere Datenanbieter verwenden?
Zum Beispiel habe ich eine Methode namens getById, und ich muss sowohl erfolgreiche als auch erfolglose Testfälle dafür ausführen.
Die erfolgreichen Testfälle bedeuten, dass es einen entsprechenden Datensatz zurückgeben kann. Und für die nicht erfolgreichen kann die Eingabe in zwei Kategorien fallen: ungültig und fehlgeschlagen.
Ungültig bedeutet, dass die Eingabe nicht zulässig ist, während fehlgeschlagen bedeutet, dass die Eingabe gültig sein könnte, aber es gibt keinen entsprechenden Datensatz mit dieser ID.
Der Code geht also so:
/**
* @dataProvider provideInvalidId
* @dataProvider provideFailedId
*/
public function testGetByIdUnsuccess($id)
{
$this->assertNull($this->model->getById($id));
}
Es stellte sich jedoch heraus, dass nur der erste Datenanbieter verwendet wurde und der zweite ignoriert wurde. Ich bin mir zwar nicht sicher, ob dieses Senario üblich ist oder nicht, aber hier ist die Frage. Können wir mehrere Datenanbieter verwenden? Und wenn wir können, wie?
Ich befinde mich in einer ähnlichen Situation, in der separate DataProvider den Code lesbarer machen würden (eine Art Dokumentation des Codes und der Testfälle durch die ihnen bereitgestellten Daten). Ich frage mich, was wäre die beste Praxis?
– Pitt
13. April 2016 um 4:31 Uhr
Nur ein Update zur Frage, a Pull-Anfrage wurde akzeptiert und jetzt der Code:
/**
* @dataProvider provideInvalidId
* @dataProvider provideFailedId
*/
public function testGetByIdUnsuccess($id)
{
$this->assertNull($this->model->getById($id));
}
Funktioniert auf PHPUnit 5.7, Sie können so viele Anbieter hinzufügen, wie Sie möchten.
Ein Problem: Ich hatte sehr allgemeine Testfallnamen. Wenn Sie Namen vergeben, müssen Sie darauf achten, dass diese über Ihre Provider hinweg eindeutig sind oder nur der letzte Testfall mit diesem Namen ausgeführt wird.
– Adam P.
19. Februar 2021 um 7:53 Uhr
Sie können eine Hilfsfunktion wie unten gezeigt verwenden. Das einzige Problem besteht darin, dass es mühsam sein kann, herauszufinden, welcher Testfall ein Problem verursacht, wenn die Gesamtzahl der von allen „Unterdatenanbietern“ bereitgestellten Testfälle groß ist.
/**
* @dataProvider allIds
*/
public function testGetByIdUnsuccess($id)
{
$this->assertNull($this->model->getById($id));
}
public function allIds()
{
return array_merge(provideInvalidId(),provideFailedId());
}
Danon
Sie können auch verwenden CrossDataProvider wodurch Sie eine Kombination von Datenanbietern miteinander verwenden können
<?php
/**
* @dataProvider provideInvalidIdAndValues
*/
public function testGetByIdUnsuccess($id, $value)
{
$this->assertNull($this->model->getById($id));
}
function provideInvalidIdAndValues() {
return DataProviders::cross(
[[1], [2], [3]],
[['Rob'], ['John'], ['Dennis']]
);
}
Sie können Ihrem dataProvider-Array einen Kommentar hinzufügen, um die gleiche Funktionalität bereitzustellen, ohne dass mehrere dataProvider erforderlich sind.
public static function DataProvider()
{
return array(
'Invalid Id' => array(123),
'Failed Id' => array(321),
'Id Not Provided' => array(NULL),
);
}
Nun, Sie könnten es von einer anderen Seite betrachten;) Sie wissen genau, was Sie erwarten, zum Beispiel getById(1) erwartetes Ergebnis ist $result_expected, nicht $result_null, also könnten Sie einen Datenprovider wie diesen erstellen
$dataProvider = array(1, 'unexpected');
dann Ihre Testmethode wie folgt:
public function testGetById($id) {
$this->assertEquals($result_expected, $obj::getById($id));
}
Testergebnis ist also:
.F
12524800cookie-checkKann phpunit mehrere Datenanbieter verwendenyes
Ich befinde mich in einer ähnlichen Situation, in der separate DataProvider den Code lesbarer machen würden (eine Art Dokumentation des Codes und der Testfälle durch die ihnen bereitgestellten Daten). Ich frage mich, was wäre die beste Praxis?
– Pitt
13. April 2016 um 4:31 Uhr