Hallo,
gibt es eine Art Anleitung, wie man bei der Entwicklung in Extbase die allerersten Tests in PHPUnit zustande bringt. Das Buch von Rau und Kurfürst erläutert das nicht ganz erschöpfend.
Bisher hatte ich das Problem, dass in PHPUnit die Extension nicht gefunden wurde, obwohl ein Verzeichnis /tests angelegt war.
Bin dankbar für jede Hilfe ... 🙂
Kurzer Nachtrag: Codeschnipsel wären echt klasse ... :p
Habe mittlerweile herausgefunden, dass es nur funktioniert, wenn man die testcase-Dateien wie einname_testcase.php benennt.
... möchte das Thema hier nochmals aufwärmen. Gibt es hier mittlerweile neue Erkenntnisse, wie man bei dem besagten Beispiel des Buches phpunit zum Laufen bewegt.
Auch mit dem Tipp von moberndoerfer tut sich leider nichts und die Extension wird nicht aufgeführt.
Dann will ich mal etwas weiter ausholen ...
Zunächst mal habe ich im Root-Verzeichnis meiner Extension ein Verzeichnis Tests angelegt. In diese kommen dann die TestCase Dateien hinein, am besten für jedes Model eins.
Zuvor habe ich aber gemäß dem Blog Example eine Datei BaseTestCase.php erstellt, in der ich eine abstrakte Klasse für die Erweiterung der Extbase BaseTestCase drin habe:
if (!class_exists('Tx_Extbase_Utility_ClassLoader')) {
require(t3lib_extmgm::extPath('extbase') . 'Classes/Utility/ClassLoader.php');
}
$classLoader = new Tx_Extbase_Utility_ClassLoader();
spl_autoload_register(array($classLoader, 'loadClass'));
require_once(t3lib_extmgm::extPath('extbase') . 'Tests/BaseTestCase.php');
abstract class Tx_Extensionname_BaseTestCase extends Tx_Extbase_BaseTestCase {
}
Dann zu jeder Model-Klasse eine eigene Testcase anlegen, etwa Beispiel_testcase.php:
require_once('BaseTestCase.php');
class Tx_Extensionname_Domain_Model_Beispiel_Testcase extends Tx_Extensionname_BaseTestCase {
/**
* @test
*/
public function anInstanceOfABeispielCanBeCreated() {
$beispiel = new Tx_Extensionname_Domain_Model_Beispiel();
$this->assertTrue(is_object($beispiel));
return $beispiel;
}
/**
* @test
* @depends anInstanceOfABeispielCanBeCreated
*/
public function theTitleOfABeispielCanBeSet($beispiel) {
$beispiel->setTitle('NewTitle');
$this->assertEquals('NewTitle', $beispiel->getTitle());
}
Damit sollten die ersten beiden Tests dieses Modells im PHPUnit-Modul ausgewählt werden dürfen.
Danke erstmal für die Ausführung. Leider tut sich nichts, d.h. weder die Extension noch der Test selbst ist in phpunit zu finden bzw. auswählbar.
Ich gehe doch richtig in der Annahme, das die Existenz des Verzeichnisses "Tests" ausreichend sein müsste, also ohne Installation der Extension per Extension_builder und diversen ext_Dateien, um phpunit zu nutzen ?
Der Verzeichnisstruktur (und die betreffende Datei Organization.php sowie BaseTestCase.php) sieht so aus:
extname
- Classes
- - Domain
- - - Model
- - - - Organization.php
- Tests
- - Domain
- - - Model
- - - - OrganizationTest_testcase.php
- BaseTestCase.php
In habe die BaseTestCase.php angelegt und noch den folgenden Pfad angepasst:
Anstatt:
require_once(t3lib_extmgm::extPath('extbase') . 'Tests/BaseTestCase.php');
nun:
require_once(t3lib_extmgm::extPath('extbase') . 'Tests/Unit/BaseTestCase.php');
Ist alles leider nicht von Erfolg gekrönt. Auswählbare Extensions sind lediglich "phpunit", "extbase" und "fluid", mehr nicht.
eddy schrieb
Ich gehe doch richtig in der Annahme, das die Existenz des Verzeichnisses "Tests" ausreichend sein müsste, also ohne Installation der Extension per Extension_builder und diversen ext_Dateien, um phpunit zu nutzen ?
Kein Heiermann ins Schweinderl! (Für die älteren, die noch Robert Lem_b_ke und das heitere Beruferaten kennen ...)
Damit die Extension im PHPUnit Modul getestet werden kann, muss sie im Extension Manager installiert sein. Dafür braucht es natürlich die ext_* Dateien im Root-Verzeichnis.
Man sollte also erst mal ein solides Grundgerüst der Extension bauen, um dann als nächstes das Model nach und nach zu entwickeln. Dieser Schritt ist dann mit TDD und dem PHPUnit Modul möglich.
Ok, danke. Bin ich doch schon mal einen Schritt weiter (obwohl das für mich jetzt so nicht direkt aus der Beschreibung im Buch deutlich wurde).
Dann frisch ans Werk.
Dann viel Erfolg!
Leider bin ich auch nach dem Model hängen geblieben. Als testbar geht noch die Instanzierung von Controllern und Repositories, aber wie dann einzelne Funktionen dort sinnvoll getestet werden sollen, habe ich auch noch nicht heraus gefunden. Hier jedenfalls mal der Test der Instanzierung von einem Controller:
/**
* @test
*/
public function anInstanceOfTheBeispielControllerCanBeCreated() {
// Instanz des Extbase Dispatchers erzeugen, um den injectReflectionService
// zu ermöglichen
t3lib_div::makeInstance('Tx_Extbase_Dispatcher');
$beispielcontroller = t3lib_div::makeInstance('Tx_Extensionname_Controller_BeispielController');
$this->assertTrue(is_object($beispielcontroller ));
unset($beispielcontroller);
}
Daher noch mal der Ruf in die Wüste, ob es für die Funktionen in Controllern und Repositories auch eine Art Tutorial oder zumindest Hinweise gibt ...
Hallo
ich bin heute mit dem gleichen Problem auf der Suche nach einer Lösung hier angekommen.
keine Ahnung ob es noch irgendwem hilft aber
ich hab heute eine bereits bestehende Extbase/Fluid Extension erfolgreich um 2 PHP Unit Test erweitert, nachdem auch zuerst die Extension ums Verrecken nicht in der Dropdownliste von PHPunit auftauchen wollte:
Und so gehts.
- installiert ist die PHPUnit 3.5.14 by Sebastian Bergmann.
meine Extension heist "nem_mysupport"
darunter hab ich die folgenden Order angelegt
/Tests/Unit/Controller
(logischerweise wie bei Extabse üblich die genaue Schreibweise beachten "T" Gross und Rest klein. analog "Unit" und "Controller"
Darin befindet sich die Datei
CreatecallTest_testcase.php
Inhalt der Datei siehe unten:
vermutlich auch wichtig: der Name der Klasse in der TestUnit setzt sich zusammen aus Extensionname und Pfad und Datei und alles immer schön CamelCase und "_" im Extensionnamen weglassen dafür auch CamelCase ..
also
TX_ + Extensionname (=nem_mysupport) + _ + Pfad (=Controller) + _ Dateianme ergibt:
Tx_NemMysupport_Controller_CreatecallTest_testcase
Statt Controller kann man natürlich auch Domain/Model oder helper Klassen einbinden..
PS: ich hab nach dem ihc hier keine grosse erkenntnis gewonnen habe, mir die beispiele in der extension fluid/Tests angeschaut ...
Grüße
Jörg V.
<?PHP
/*
**
*/
class Tx_NemMysupport_Controller_CreatecallTest_testcase extends Tx_Extbase_BasetestCase {
/**
* @test
* @author jvelletti <jv>
*/
public function DummyTestForPHPunit() {
if ( date( 's' ) < 30 ) {
return true;
} else {
$this->fail('Die Sekunde der Rechnerzeit ist zwischen 30 und 59') ;
}
}
/**
* @test
* @author jvelletti <jv>
*/
public function CreateHotlineCallonTestDB() {
// cut Code of second test ....
return true;
}
}
PS: die Dummytest funktion ist nur um auch mal einen Fehlerfall zu simulieren .. z.b. jetzt um 17:52:32 wegen der 32. sek ...
