Je cherche a effectuer des tests unitaires et fonctionnels sur une application java, que je n'ai pas moi meme codee, comprenant des composants Swing. J'ai choisi d'utiliser la "library" UISpec4J qui me paraissait assez bien concue pour cet usage.
Je souhaite verifier que la fentre permettant de se logger reagit bien comme prevu (messages d'erreurs differents en fonction de l'absence du login ou de l'utilisation d'un login n'existant pas)
Apres avoir lu la doc sur le site web d'UISpec4J, j'ai trouve une facon d'intercepter une "window" : http://www.uispec4j.org/interception.html
J'ai donc tente d'utiliser cette fonctionnalite pour capturer la fenetre login de mon application. Pour cela, je lance l'application principale dans la classe UISpecAdapter (http://www.uispec4j.org/apidocs/org/...ecAdapter.html) puis je cree une JWindow grace au Jpanel LoginPanel lance precedemment comme inscrit sur le site de UISpec4J.
Dans ma fonction test, j'utilise ensuite la fonctionnalite WindowInterceptor et appelle la fonction getMainWindow.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 public class Adapter implements UISpecAdapter { public org.uispec4j.Window getMainWindow() { //lance l'application lanceWindow(); //recupere le Jpanel puis cree une JWindow LoginPanel logpanel=LoginPanel.getInstance(); JWindow window = new JWindow(); window.getContentPane().add(logpanel); //affiche ce JWindow window.show(); //cree la Window de UISpec4J et y affecte la JWindow org.uispec4j.Window uispec4jwin = new org.uispec4j.Window(window); return uispec4jwin; } }
J'essaie ensuite de simuler l'appui de differentes touches puis de tester la validite de mon message.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72 public class TestLoginPanel extends UISpecTestCase { static { UISpec4J.init(); } static LoginPanel logpanel=LoginPanel.getInstance(); public TestLoginPanel() { super(new Adapter()); } public void testLoginFailed() throws AWTException { try { Window appWindow = WindowInterceptor.run(new Trigger() { public void run() { getMainWindow(); } }); //simuler l'appui d'une touche grace a la classe Robot Robot rob = new Robot(); //login rob.keyPress(KeyEvent.VK_A); rob.keyRelease(KeyEvent.VK_A); rob.keyPress(KeyEvent.VK_B); rob.keyRelease(KeyEvent.VK_B); //Tab pour aller jusqu'au champ password rob.keyPress(KeyEvent.VK_TAB); rob.keyRelease(KeyEvent.VK_TAB); //password rob.keyPress(KeyEvent.VK_A); rob.keyRelease(KeyEvent.VK_A); rob.keyPress(KeyEvent.VK_A); rob.keyRelease(KeyEvent.VK_A); //tab puis entrer pour valider rob.keyPress(KeyEvent.VK_TAB); rob.keyRelease(KeyEvent.VK_TAB); rob.keyPress(KeyEvent.VK_ENTER); rob.keyRelease(KeyEvent.VK_ENTER); //entrer pour fermer le Message d'erreur rob.keyPress(KeyEvent.VK_ENTER); rob.keyRelease(KeyEvent.VK_ENTER); //UISpec4J JTextComponent jt = new JTextPane(); jt.setText(logpanel.getJOptionPaneInstance().getName()); TextBox box = new TextBox(jt); box.assertTextEquals("Login Failed"); } catch (SecurityException e) { System.err.println(e.getMessage()); } } }
Lorsque je lance le test, la fenetre JUnit apparait ainsi qu'une version de ma fenetre login denuee de tout caracteres mais fonctionnant nomalement (ce qui est deja bizarre). La simulation de l'appui sur les touches ne fonctionne pas du tout mais je peux moi meme appuyer sur des touches et tester manuellement les differentes possibilites. Une fois que j'ai termine, je ferme la fenetre login et Junit affiche cette erreur:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 junit.framework.AssertionFailedError: No window was shown (timeout expired) at org.uispec4j.interception.handlers.ShownInterceptionDetectionHandler.waitWindow(ShownInterceptionDetectionHandler.java:31) at org.uispec4j.interception.WindowInterceptor.run(WindowInterceptor.java:239) at ui.securityinterface.TestLoginPanel.testLoginFailed(TestLoginPanel.java:252) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
Je ne sais pas comment resoudre ce probleme et le code de l'application est difficilement comprehensible. Si quelqu'un a une solution magique a me proposer, j'en serais ravie! Il est tres difficile de trouver de la documentation sur les tests des composants Swing et encore plus sur UISpec4J...
Partager