Framework de test StrutsTestCase (Partie 2): Ecriture des Tests

Décembre 2016

Voir la première partie de l'astuce Framework de test StrutsTestCase (Partie 1): Présentation



Ecriture des Tests utilisant le Framework de test StrutsTestCase et configuration


1.Ecriture des tests


Le framework StrutsTestCase offre une panoplie de méthodes de validation se basant sur le framework Junit. Ses méthodes servent à écrire un scénario de test moyennant des instructions de bases. Ses méthodes sont décrites dans le tableau ci-après.


Pour mieux expliquer comment procéder pour tester une action struts nous allons traiter un cas pratique simple mais qui illustre bien l’utilisation de StrutsTestCase.

Considérons la classe LoginAction suivante qui permet de vérifier l’authentification d’un user. Dans cette classe on reçoit un ActionForm contenant les informations du login. Premièrement on essaye de récupérer le username et le password et d’assurer que ces informations sont valides. Si il y a une erreur au niveau des valeurs du username ou password on crée un ActionError dans lequel on spécifie le key du message. Et on essaye de faire un forward vers l’écran de login une autre fois. Dans l’autre cas où les informations du login sont valides on stocke ses informations dans la session. Ensuite on essaye de faire un forward vers l’écran suivant.
public class LoginAction extends Action {

	
	public ActionForward perform(ActionMapping mapping,
			ActionForm form,
			HttpServletRequest request,
			HttpServletResponse response)
	{
		
		String username = ((LoginForm)form).getUsername();
		String password = ((LoginForm)form).getPassword();
		ActionErrors errors = new ActionErrors();
		if ((!username.equals("dery")) || (!password.equals("radar")))
		{
			errors.add("password","error.password.mismatch");
		}
		
		if (!errors.empty())
		{
			saveErrors(request,errors);
			return mapping.findForward("login");
			
		}
		
		//sauvegarde du nom utilisateur dans la session
		HttpSession session = request.getSession();
		session.setAttribute("authentification", username);
		
		//forward vers URI success
		return mapping.findForward("success");

	}

}


Scénario de test

Dans cette classe, on peut tester :
  • Est-ce que le bean LoginForm fonctionne correctement : si on insère les paramètres dans le request est-ce l’instanciation du bean est faite correctement ?
  • Si le username ou le password ne correspond pas à la valeur attendue obtient-on la liste des erreurs appropriées à afficher dans l’écran suivant ? par conséquence est-ce qu’il y a renvoi vers la page de login de nouveau ?
  • Si on fourni des informations de logins correct, obtient-on la bonne page vers laquelle le forward a eu lieu ? est-ce qu’on est sûr qu’il n’y a pas eu d’erreurs reportées ? est-ce que les informations d’authentification on bien été enregistrées dans la session ?

StrutsTestCase permet de tester toutes ces conditions moyennant le framework Junit comme indiqué ci-dessous.
  • Création d’une classe de test vide qui étend CactusStrutsTestCase ou MockStrutsTestCase.

	public class TestLoginAction extends CactusStrutsTestCase 
	
	{

		public void setUp() {super.setUp();}
	
		public void tearDown() {super.tearDown();}
	
		public TestLoginAction (String testName) 
		{
			super(testName);
		}
	
		public void testSucessfullLogin(){}		
	}
  • Spécification du mapping à utiliser dans le test : pour cela il suffit de spécifier le path associé au mapping struts moyennant la méthode setRequestPathInfo. Par défaut, Struts cherche le path dans le fichier de configuration WEB-INF/struts-config.xml. pour spécifier un autre emplacement il faut utiliser la méthode setConfigFile ().

public class TestLoginAction extends CactusStrutsTestCase {

	
	
	public TestLoginAction (String testName) 
	{
		super(testName);
	}
	
	public void testSucessfullLogin()
	{
		setRequestPathInfo("/login") ;
	}		

}
  • Ajout des propriétés du formBean via l’objet request.

public class TestLoginAction extends CactusStrutsTestCase {

	
	
	public TestLoginAction (String testName) 
	{
		super(testName);
	}
	
	public void testSucessfullLogin()
	{
		setRequestPathInfo("/login") ;
		addRequestParameter("username", "dery");
		addRequestParameter("password", "radar");
	}		

}
  • Lancement de l’action via la méthode actionPerform : Cela permet de traiter le request par l’ActionServlet. Il reste de tester que tout le traitement se déroule comme attendu.

public class TestLoginAction extends CactusStrutsTestCase {

	
	
	public TestLoginAction (String testName) 
	{
		super(testName);
	}
	
	public void testSucessfullLogin()
	{
		setRequestPathInfo("/login") ;
		addRequestParameter("username", "dery");
		addRequestParameter("password", "radar");
		actionPerform();
	}		

}
  • Vérification du fait que le forward se passe sur la bonne destination.

public class TestLoginAction extends CactusStrutsTestCase {

	
	
	public TestLoginAction (String testName) 
	{
		super(testName);
	}
	
	public void testSucessfullLogin()
	{
		setRequestPathInfo("/login") ;
		addRequestParameter("username", "dery");
		addRequestParameter("password", "radar");
		actionPerform();
		verifyForward("success");
	}		

}
  • Vérification du fait que les informations d’authentification ont été bien enregistrées dans la session.

public class TestLoginAction extends CactusStrutsTestCase {

	
	
	public TestLoginAction (String testName) 
	{
		super(testName);
	}
	
	public void testSucessfullLogin()
	{
		setRequestPathInfo("/login") ;
		addRequestParameter("username", "dery");
		addRequestParameter("password", "radar");
		actionPerform();
		verifyForward("success");
		assertEquals("dery", (String) getSession().getAttribute("authentification"));
	}
}
  • Vérification du fait qu’il n’y a pas de messages ActionError renvoyés. Ceci est suffisant pour tester le cas d’authentification correct

public class TestLoginAction extends CactusStrutsTestCase {

	
	
	public TestLoginAction (String testName) 
	{
		super(testName);
	}
	
	public void testSucessfullLogin()
	{
		setRequestPathInfo("/login") ;
		addRequestParameter("username", "dery");
		addRequestParameter("password", "radar");
		actionPerform();
		verifyForward("success");
		assertEquals("dery", (String)	getSession().getAttribute("authentification"));
		verifyNoActionErrors();
	}		

}
  • Test du cas d’authentification en echec. Voici un exemple

public void testFailedLogin()
{
	
		setRequestPathInfo("/login");
		addRequestParameter("username", "dery");
		addRequestParameter("password", "error");
		actionPerform();
		verifyForward("login");
		verifyActionErrors(new String[] {"error.password.mismatch"});
		assertNull((String)getSession().getAttribute("authentification"));
}

2.Best Practises lors de l’écriture des classes de tests cactus


Les développeurs des tests cactus doivent faire attention aux règles suivantes :
  • sûreté du code : Les classes de tests doivent êtes codés proprement il faut pas qu’elles même face l’objet d’un test. Ces classes sont des classes d’audit ils doivent donc être suffisamment sûres.
  • pertinence du code : Les classes de tests doivent tester les fonctionnalités de l’application minutieusement dans le bute de détecter au maximum les éventuels bugs.
  • bonne couverture fonctionnelle : Les classes de tests doivent couvrir tous les détails des uses case afin de détecter tous les anomalies potentielles dans un scénario donné.
  • évolutivité des classes de tests : souvent les applications subissent des compagnes de refactoring ceci doit être accompagné d’une mise à jour des classes de tests en parallèle afin de tenir compte de l’évolutivité du code à tester.

3.Configuration du Cactus


Fichier cactus.properties :
Le fichier cactus.properties contient les paramètres nécessaires à l’exécution des scripts ANT utilisés pour le lancement des tests.
La propriété cactus.servletRedirectorName désigne le nom du servlet de redirection cactus qui doit obligatoirement être défini dans le fichier web.xml, comme suit :
<servlet>
<servlet-name>StrutsServletRedirector</servlet-name>
<servlet-class>
org.apache.cactus.server.ServletTestRedirector
</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>StrutsServletRedirector</servlet-name>
<url-pattern>/StrutsServletRedirector</url-pattern>
</servlet-mapping>

A voir également :

Ce document intitulé «  Framework de test StrutsTestCase (Partie 2): Ecriture des Tests  » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.