Les tests unitaires automatisés offrent la possibilité de réaliser très rapidement un ensemble de contrôles sur le code. Ils permettent notamment de vérifier un certain nombre d'exigences, de règles de gestion et contrôler leur stabilité dans le temps (non régression). Le framework retenu pour la réalisation de ces tests est JUnit (http://www.junit.org)
Il existe plusieurs façons de mettre en oeuvre JUnit. Il est également possible d'utiliser d'autres outils connexes. Voici celle retenue pour Lutece.
LuteceTestCase
La granularité d'un test unitaire est la classe. Pour chaque classe à tester, une classe dérivée de LuteceTestCase
doit être créée et regroupera l'ensemble des tests à réaliser. L'arborescence des classes de test doit reproduire celle des sources de l'application.
Pour réaliser les tests de la classe :
src/java/fr/paris/lutece/plugins/myplugin/web/MyClass
il faudra créer la classe :
test/java/fr/paris/lutece/plugins/myplugin/web/MyClassTest
La classe LuteceTestCase
étend la classe abstraite TestCase
du framework JUnit en réalisant l'initialisation de l'ensemble des services de Lutèce dans l'implémentation de sa méthode setUp()
. Il est ainsi possible, pour toutes les méthodes de test de la classe, d'accéder à des services de Lutèce : AppTemplateService
, AppPropertiesService
, AppConnectionService
, etc.
Chaque méthode de test à l'intérieur de la classe est préfixée, comme l'exige le framework, par "test". Ceci permet, par introspection de retrouver dynamiquement l'ensemble des tests à lancer dans la classe.
L'objet MockHttpServletRequest
Pour réaliser certains tests, il est nécessaire de disposer d'objets de substitution (Mock objects) pour simuler des objets réels. Par exemple, dans la réalisation des tests de méthodes recevant un objet request
en paramètre, il n'est pas possible de simuler un client HTTP pour fournir cet objet request
. La classe MockHttpServletRequest
, implémente l'interface HttpServletRequest
et dispose d'accesseurs permettant de lui ajouter paramètres, attributs, sessions et cookies de manière à tester une situation réelle.
import fr.paris.lutece.test.LuteceTestCase;
import fr.paris.lutece.test.MokeHttpServletRequest;
import javax.servlet.http.Cookie;
public class MyClassTest extends LuteceTestCase
{
/**
* Test getNameFromCookie
*/
public void testGetNameFromCookie( )
{
MokeHttpServletRequest request = new MokeHttpServletRequest( );
Cookie cookieName = new Cookie( "mycookie", "name" );
Cookie[] cookies = { cookieName };
request.setMokeCookies( cookies );
assertEquals( getNameFromCookie( request ) , "name" );
}
...
}
Enchainement des tests (TestSuite)
JUnit propose un dispositif d'enchainement des tests basé sur les TestSuites. Pour Lutece, une classe AllTests
est réalisée au niveau de chaque niveau de package et dispose d'une méthode static suite()
renvoyant une TestSuite contenant tous les tests du package et les suites des sous packages. Ce dispositif permet de lancer les tests à n'importe quel niveau de package, en traitant automatiquement tous les tests des sous packages.
Voici un exemple d'implémentation d'une classe AllTests.
public final class AllTests
{
/**
* Constructor (private)
*/
private AllTests( )
{
}
/**
* A set of tests
* @return Test the tests
*/
public static Test suite( )
{
TestSuite suite = new TestSuite( "Test of the package fr.paris.lutece.plugins.myplugin" );
//$JUnit-BEGIN$
// Add tests of the current package
suite.addTest( new TestSuite( MyClassTest.class ) );
// Add tests of sublevel packages
suite.addTest( fr.paris.lutece.plugins.myplugin.business.AllTests.suite( ) );
suite.addTest( fr.paris.lutece.plugins.myplugin.web.AllTests.suite( ) );
//$JUnit-END$
return suite;
}
}
Il y a une erreur de communication avec le serveur Booktype. Nous ne savons pas actuellement où est le problème.
Vous devriez rafraîchir la page.