Dataprovider

Dataprovider in PHPUnit

Jeder Testfall testet den Code mit bestimmten Testdaten. Manchmal soll der Code jedoch mit mehreren Daten getestet werden um sicherzustellen, dass der Code in allen Fällen das richtige Ergebnis liefert.

Zu diesem Zweck gibt es Dataprovider. Ein Dataprovider ist eine Methode in einem Testfall, die einen Array mit Testdaten zurückgibt. An dem Testfall, der einen Dataprovider nutzt wird mittels der Annontation „@dataProvider“ angeben welche Methode als Dataprovider fungiert. Dabei ist zu beachten dass der Dataprovider eine „public“ Methode sein muss und jede Zeile des Arrays die Argumente des Testfalles in der richtigen Reihenfolge enthalten muss.


Als Beispiel dient ein Testfall zum testen eines Email Validators. Er soll testen ob der Validator korrekte Adressen validiert, während er falsche Adresse zurückweist. Da es viele verschiedene Domainnamen gibt und mittlerweile auch Umlaute in Domainnamen, gibt es jede Menge Sonderfälle.

Das finden des richtigen regulären Ausdruckes zu validieren der Email Adresse wird hierbei dem Leser überlassen :)


Zunächst der Testfall mit Dataprovider:

class EMailValidatorTest extends PHPUnit_Framework_TestCase {
		
	protected $emailValidator;
		
	/**
	* @return void
	*/
	public function setUp() {
		$this->validator = new EMailValidator();
	}

	/**
	* @return array
	*/
	public function isValidEMailDataprovider () {
		return array(
			//incomplete
			array('foo',false),
			array('äää',false),
			array('@',false),
			//umlaut in topleveldomain
			array('test@test.öü',false),
			//invalid character in name
			array('foo/dsd@bar.de',false),
			//own toplevel domain, but valid			
			array('max.mustermann@company.intranet',false),
			//umlauts in name
			array('karl.müller@123test.de',true),
			//long domainname with subdomains
			array('herber-müller@servers.campus.univercity.edu',true),

		);
	}

	/**
	* @param string
	* @param bool
	* @dataProvider isValidEMailDataprovider 
	* @test
	*/
	public function testIsValid($email,$expectedValidationState) {
		$isValid = $this->validator->isValid($email);
		$message = 'Validatotr return unexpected result for EMail '.$email;
		$this->assertEquals($expectedValidationState, $isValid,$message);
	}
}

?>

Besonders wichtig im oberen Beispiel, ist die Annotation in Zeile 38 dadurch wird dem PHPUnit Framework mitgeteilt welche Methode als Dataprovider fungieren soll. Jede Zeile im Array des Dataproviders spiegel die Argumente des Testfalles wieder.

Der folgende Code zeigt die noch unvollständige Implementierung des EMail Validators:

class EMailValidator {

	/**
	*@param string $email
	*@return boolean
	*/
	public function isValid($email) {
		$pattern = "";
		$result = preg_match($pattern,$email) > 0;
		return $result;
	}
}

Navigation