J'ai posé cette question sur StackOverflow , et il a été suggéré de la poser ici.
Je connais les tests unitaires / système / d'intégration et je voudrais pouvoir tester mon composant Joomla. Existe-t-il une manière standard de procéder?
Je travaille sur cet exemple de composant joomla mvc , qui n'inclut pas de tests. Tout ce que je peux trouver dans la documentation Joomla et sur divers sites Web, ce sont des fragments de code de test et des fichiers bootstrap.php. Plus précisément, je voudrais savoir:
- Où mettre le code de test des composants
- Dois-je fournir mon propre bootstrap.php, ou existe-t-il un moyen de simplement 'inclure joomla' et d'exécuter mes tests
Idéalement, quelqu'un pourrait me diriger vers un composant Joomla open source qui a des tests et des instructions sur la façon de les exécuter (a jeté un coup d'œil, les 5 premiers environ n'ont pas eu de tests).
Le plus proche que j'ai trouvé est celui-ci , sur lequel j'ai basé mon test factice.
Ce que j'ai fait jusqu'à présent
Structure du répertoire des composants:
- Bonjour le monde/
- admin /
- ...
- tests /
- bootstrap.php
- phpunit.xml
- modelHelloWorldsTest.php
- site/
- ...
- helloworld.xml
- admin /
Premier essai
Pour exécuter les tests, j'installe / copie le composant dans mon installation Joomla. J'exécute ensuite la commande suivante à partir de ~ joomla / administration / components / com_helloworld / tests:
php phpunit-4.2.phar --bootstrap bootstrap.php .
dont je reçois
Fatal error: Class 'ContentController' not found in C:\inetpub\wwwroot\ws_cairnstest\administrator\components\com_helloworld\tests\modelsHelloWorldsTest.php on line 5
Je suppose que cela signifie que mon bootstrap.php n'est pas correct et n'a pas chargé les classes Joomla nécessaires. J'examinerai cela à un moment donné, mais cela semble être beaucoup de configuration juste pour obtenir des tests.
bootstrap.php:
<?php
error_reporting(E_ALL);
define('_JEXEC', 1);
define('BASEPATH',realpath(dirname(__FILE__).'/../../'));
define('JOOMLA_PATH',realpath(dirname(__FILE__).'/../../../../../'));
define('JOOMLA_ADMIN_PATH',realpath(dirname(__FILE__).'/../../../../'));
$_SERVER['HTTP_HOST'] = 'localhost';
$_SERVER['REQUEST_METHOD'] = 'GET';
if (file_exists(JOOMLA_ADMIN_PATH . '/defines.php'))
{
include_once JOOMLA_ADMIN_PATH . '/defines.php';
}
if (!defined('_JDEFINES'))
{
define('JPATH_BASE', JOOMLA_ADMIN_PATH);
require_once JPATH_BASE . '/includes/defines.php';
}
require_once JPATH_BASE . '/includes/framework.php';
require_once JPATH_BASE . '/includes/helper.php';
require_once JPATH_BASE . '/includes/toolbar.php';
define('JPATH_COMPONENT',JOOMLA_ADMIN_PATH.'/components/com_content');
$app = JFactory::getApplication('administrator');
include BASEPATH.'/controller.php';
modelsHelloWorldsTest.php:
<?php
class HelloWorldsTest extends \PHPUnit_Framework_TestCase {
public function testList(){
$c = new ContentController();
$model = $c->getModel('helloworlds');
$worlds = $model->getItems();
var_dump($worlds);
$this->assertNotEmpty($worlds);
}
}
phpunit.xml:
<phpunit bootstrap="bootstrap.php"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false"
syntaxCheck="false"
verbose="true">
</phpunit>
Deuxième essai
Après avoir vu cette réponse , j'ai mis mes tests sous test / unit sous mon installation joomla, copié phpunit.dist.xml et bootstrap.php du repo joomla-cms à leurs emplacements appropriés, et j'ai quand même obtenu le
Fatal error: Class 'ContentController' not found in C:\inetpub\wwwroot\ws_cairnstest\administrator\components\com_helloworld\tests\modelsHelloWorldsTest.php on line 5
erreur que je recevais avant.