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.
la source
Error: Call to undefined method JController::getInstance()
pour ça.Désolé si ma réponse ne répond pas directement à votre problème, mais il est important de comprendre ce qu'est le test unitaire et comment l'utiliser, peu importe si nous parlons de Joomla ou non. Vous avez abordé de nombreux problèmes et il est assez difficile de les traiter tous.
Tout d'abord, il est important de lire la documentation sur PHPUnit . Construisez-vous une petite classe (indépendamment de Joomla) et essayez d'écrire des tests pour cela. Obtenez d'abord PHPUnit dans un tel scénario. Comprenez ce qu'il fait. Je crains que vous ne vous concentriez trop sur l'exécution de PHPUnit au lieu de comprendre comment cela aide votre développement.
Pour lancer Joomla , vous aurez besoin de:
L'erreur que vous obtenez est aussi claire que possible. 'ContentController' n'est clairement pas chargé automatiquement par Joomla. Vérifiez auprès d'un débogueur si l'autochargeur dans Joomla est appelé et pourquoi il ne parvient pas à charger la classe. Dans le pire des cas, fournissez votre propre chargeur automatique et utilisez le fichier d'amorçage pour l'appeler. Une solution rapide consiste également à charger manuellement le fichier requis avec require_once.
Décidez de ce que vous voulez tester et utiliser des maquettes
Dans l'exemple fourni, vous utilisez JModel pour extraire des données de la base de données. Il s'agit d'une interdiction du point de vue TDD. Tester que vous pouvez extraire des données de la base de données n'a aucune valeur à mon humble avis. Que testez-vous exactement là-bas?
Si vous devez travailler avec des données de la base de données, utilisez des simulations pour modéliser une réponse à partir de la base de données. De cette façon, vos tests auront un comportement cohérent dans le temps. Vous ne voulez pas avoir échoué aux tests simplement parce que vous avez changé quelque chose dans la base de données.
Si vous avez une méthode qui calcule quelque chose ou toute autre chose qui a du sens à tester. Il s'agit de tests unitaires: vous prenez une petite unité de votre système complexe, vous l'alimentez avec de fausses données de test et testez son comportement.
Besoin de voir que votre système fonctionne dans son ensemble, utilisez des tests système.
la source