Hi, ich bin gerade dabei, mir Unittesting genauer anzuschauen.
Wieviel Testing machen eigentlich Sinn? Hier mal ein paar Beispiele bzw Fragen dazu:
Erstes Beispiel
GetAll-Funktion von meinem ORM.
Ich teste hier:
- ob das result not empty ist
- ob die Anzahl mit dem Fixture übereinstimmt (damit kann ich den test davor entfernen oder?)
- ob ein item vom resultarray die richtige klasse hat (assertContainsOnlyInstancesOf)
was würde man noch testen oder ist das so ok?
Zweites Beispiel als Code
ist sowas ok oder mist?
Drittes Beispiel
wenn ich eine löschenfunktion habe
teste ich dann den count in der db von vorher und nachher
oder vergleiche ich die anzahl zwischen db und fixture, beides vorher und beides nachher oder reicht der unterschied zwischen beiden am ende?
Viertes Beispiel
dann habe ich noch eine save funktion die je nach id ein update oder insert ausführt. schreibt man hier für alle 3 funktionen tests, sicher oder ?
Fünftes Beispiel
Wenn ich in einer Modelklasse immer wieder ein Objekt benötige, kann ich das einmalig in getConnections ausführen?
Sechstes Beispiel
Ich habe eine abstrakte Klasse, die eine leere protected queryPre- und queryPost-Funktion hat, wie kann ich sowas testen ??
Ich kann problemlos über die erbende Klasse die Funktionen der abstrakten Klasse testen (erkennt codecoverage), aber wie siehts mit ner leeren funktion aus ? ^^
Siebentens Beispiel
ist sowas ok/normal?
Achtes Beispiel
Wenn ich eine abstrakte klasse habe und mit den unterklassen teile der oberklasse teste, kann ich dann für die testklassen dann auch eine übergeordnete machen, um die tests nur einmal zu schreiben und jedesmal mit auszuführen, oder ist das quatsch? wenn quatsch, wie markiere ich für mich den test, das hier auch die oberklasse getestet wird?
€dit: hab grad gelesen, dass es sinn macht und man direkt die getConnctions abstract setzen und die tests davon erben sollen
Neuntes Beispiel
Pro Klasse gibt es Mindestens eine Testfile. Wie kann ich die selbe DB verbindung nutzen, oder sollte man daran garnicht denken? Baut ihr die bei jeder Testklasse neu auf?
btw
vlt könnt ihr mal schreiben, was ihr beim standard-CRUD testet
Status
nach ca 1tag sieht es so aus phpunit.jpg
Next
sobald alle funktionen getestet sind, schaue ich mir optimierungen der tests an, aktuell brauch er für 29 Tests / 106 asserts knapp 9 Sekunden. Habe aber auch noch keine iteratorklasse, abstr.testklasse, globals, usw. verwendet
Wieviel Testing machen eigentlich Sinn? Hier mal ein paar Beispiele bzw Fragen dazu:
Erstes Beispiel
GetAll-Funktion von meinem ORM.
Ich teste hier:
- ob das result not empty ist
- ob die Anzahl mit dem Fixture übereinstimmt (damit kann ich den test davor entfernen oder?)
- ob ein item vom resultarray die richtige klasse hat (assertContainsOnlyInstancesOf)
was würde man noch testen oder ist das so ok?
Zweites Beispiel als Code
PHP-Code:
public function testToArrayWithId()
{
$objectToArray = $this->getOne();
$array = $objectToArray->toArray();
$this->assertArrayHasKey('id', $array);
$this->assertArrayHasKey('name', $array);
$this->assertArrayHasKey('wert', $array);
$this->assertArrayHasKey('bezeichnung', $array);
$this->assertArrayNotHasKey('db', $array);
$this->assertArrayNotHasKey('tableName', $array);
}
public function testToArrayWithoutId()
{
$objectToArray = $this->getOne();
$arrayWithoutId = $objectToArray->toArray(false);
$this->assertArrayNotHasKey('id', $arrayWithoutId);
}
Drittes Beispiel
wenn ich eine löschenfunktion habe
teste ich dann den count in der db von vorher und nachher
oder vergleiche ich die anzahl zwischen db und fixture, beides vorher und beides nachher oder reicht der unterschied zwischen beiden am ende?
Viertes Beispiel
dann habe ich noch eine save funktion die je nach id ein update oder insert ausführt. schreibt man hier für alle 3 funktionen tests, sicher oder ?
Fünftes Beispiel
Wenn ich in einer Modelklasse immer wieder ein Objekt benötige, kann ich das einmalig in getConnections ausführen?
Sechstes Beispiel
Ich habe eine abstrakte Klasse, die eine leere protected queryPre- und queryPost-Funktion hat, wie kann ich sowas testen ??
Ich kann problemlos über die erbende Klasse die Funktionen der abstrakten Klasse testen (erkennt codecoverage), aber wie siehts mit ner leeren funktion aus ? ^^
Siebentens Beispiel
ist sowas ok/normal?
PHP-Code:
/**
* @covers ::save
* @covers ::insert
* @covers ::queryPre
* @covers ::query
* @covers ::queryPost
*/
public function testSaveNew()
{
}
/**
* @covers ::save
* @covers ::update
* @covers ::query
*/
public function testSaveOld()
Wenn ich eine abstrakte klasse habe und mit den unterklassen teile der oberklasse teste, kann ich dann für die testklassen dann auch eine übergeordnete machen, um die tests nur einmal zu schreiben und jedesmal mit auszuführen, oder ist das quatsch? wenn quatsch, wie markiere ich für mich den test, das hier auch die oberklasse getestet wird?
€dit: hab grad gelesen, dass es sinn macht und man direkt die getConnctions abstract setzen und die tests davon erben sollen
Neuntes Beispiel
Pro Klasse gibt es Mindestens eine Testfile. Wie kann ich die selbe DB verbindung nutzen, oder sollte man daran garnicht denken? Baut ihr die bei jeder Testklasse neu auf?
btw
vlt könnt ihr mal schreiben, was ihr beim standard-CRUD testet
Status
nach ca 1tag sieht es so aus phpunit.jpg
Next
sobald alle funktionen getestet sind, schaue ich mir optimierungen der tests an, aktuell brauch er für 29 Tests / 106 asserts knapp 9 Sekunden. Habe aber auch noch keine iteratorklasse, abstr.testklasse, globals, usw. verwendet
Kommentar