JUnit Tests pour l'interface graphique en Java
Je voudrais écrire des cas de test pour une interface graphique. Je veux savoir comment simuler un clic de JButton, ou comment extraire les éléments d'une JTable.
Aux fins de la présente, j'ai construit une interface simple d'augmenter le nombre par 1 si le bouton est cliqué et que le component swing jtextfield est vide, mais le nombre est remplacé par le nombre entier dans le component swing jtextfield si un numéro est fourni. Bien sûr, je voudrais utiliser une expression régulière pour assurer que le texte entré dans le component swing jtextfield est en fait un entier, mais supposons que les utilisateurs n'ont pas lésiné sur les moyens et entrez un non-entier. En outre, le JLabel les mises à jour de l'actuel comte, tandis que la JTable ajoute une nouvelle ligne.
Voici le code:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
public class sampleGUI extends JFrame implements ActionListener {
private Integer previous_count;
private Integer current_count;
private JButton Button;
private JTable table;
private JTextField text;
private DefaultTableModel model;
private JScrollPane scroll;
private JLabel label;
public sampleGUI() {
previous_count = null;
current_count = 0;
JFrame frame = new JFrame("Sample");
JPanel panel = new JPanel();
GroupLayout layout = new GroupLayout(panel);
panel.setLayout(layout);
label = new JLabel("Current Count: " + Integer.toString(current_count));
text = new JTextField(15);
Button = new JButton("Change the Count!");
model = new DefaultTableModel();
model.addColumn("Previous Count");
model.addColumn("Current Count");
table = new JTable(model);
scroll = new JScrollPane(table);
layout.setHorizontalGroup(layout
.createParallelGroup(GroupLayout.Alignment.LEADING)
.addGroup(
layout.createSequentialGroup().addComponent(label)
.addComponent(text).addComponent(Button))
.addComponent(scroll));
layout.setVerticalGroup(layout
.createSequentialGroup()
.addGroup(
layout.createParallelGroup(
GroupLayout.Alignment.BASELINE)
.addComponent(label).addComponent(text)
.addComponent(Button)).addComponent(scroll));
Button.addActionListener(this);
frame.add(panel);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == Button) {
if (text.getText().equals("")) {
previous_count = current_count;
current_count++;
label.setText("Current Count: "
+ Integer.toString(current_count));
model.addRow(new Object[] { current_count, previous_count });
} else {
previous_count = current_count;
current_count = Integer.parseInt(text.getText());
label.setText("Current Count: "
+ Integer.toString(current_count));
text.setText("");
model.addRow(new Object[] { current_count, previous_count });
}
table.changeSelection(table.getRowCount() - 1, 0, false,
false);
}
}
public static void main(final String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
sampleGUI gui = new sampleGUI();
}
});
}
}
Disons que je voudrais simuler l'ouverture de l'interface graphique, puis cliquez sur le bouton une fois de plus, sans entrer de texte, puis entrez 1234 et cliquez sur le bouton, puis cliquez sur le bouton sans entrer n'importe quel texte, la JTable doit avoir 3 colonnes: {{1,0}, {1234, 1}, {1235, 1234}}. Comment puis-je passer le test pour qui? Merci!
- Vous avez besoin de regarder autour de soi, il y a quelques projets qui utilisent
JUnit
comme bases pour construire automatisé Swing infrastructures de test. Jetez un oeil à FESTIVAL, UISpec4j et je suis sûr qu'il y a de plus en plus (pas eu le temps de vérifier, trop occupé à tester :P) - J'ai effectivement essayé de chercher des exemples de code sur Stackoverflow/google mais je n'ai pas de chance.
- Avez-vous consulter l'un des liens que j'ai fournis? Avez-vous essayez de faire une recherche Google pour "Swing JUnit" ou "Swing Tests automatisés"? Parce que c'est tout ce que j'ai fait
- Ouais. Comment utilisez-vous ces deux lignes de code dans mon cas? la boîte de dialogue.zone de texte("nom d'utilisateur").enterText("alex.ruiz"); boîte de dialogue.bouton("ok").cliquez sur();
- Je n'ai absolument aucune idée 😉 - 1. Il dépend du cadre et 2. Vous aurez besoin de lire la documentation. J'ai voulu vérifier un peu, mais je n'ai pas le temps 😛
- J'ai essayé, mais il ne semble pas pour initialiser la fenêtre correctement. Qu'entendez-vous par cela dépend du cadre?
- Il dépend de la structure de test de la façon dont ils vous permettent d'automatiser certaines tâches...
- Je ne peux pas le faire fonctionner. :(. J'ai abandonné pour l'instant.
Vous devez vous connecter pour publier un commentaire.
Java SE est livré avec un outil standard pour le faire, le Robot classe. Je n'ai jamais utilisé pour écrire des bots pour les jeux et de contrôler à distance un autre ordinateur via un socket client/serveur de paire, mais il était en fait destiné à automatiser les tests, et donc, il faut travailler pour vous. Le format de base est simple:
Bien sûr, vous pouvez simuler des événements de clavier dans une semblable façon que bien à l'aide de la touche/keyRelease méthodes. J'ai parfois trouvé utile d'utiliser le screenCapture méthode de la classe de robot ainsi à la recherche pour les images sur l'écran et de déterminer où cliquer.
Remarque: cela ne nécessite pas que les fenêtres sont les tests sont construits sur awt/swing, mais il nécessite que le java implementaton vous utilisez prend en charge awt.
AssertJ est un fork de FEST qui fonctionne très bien pour moi, et a un support pour Swing. Le développement est actif (au moment de l'écriture), prend en charge Java 8, a assertions de quelques bibliothèques populaires comme la Goyave et Joda Temps, et est très bien documenté. Il est également libre et ouvert.
J'avais un projet quelques années en arrière où nous avons besoin d'automatiser des tests.
Nous avons fini par aller avec :
jfcunit
Nous avons également essayé
fest - mais bon c'était au moment de la rédaction était seulement monothread.
swingunit - également ok, mais nous avons eu quelques problèmes subtils nous avons donc du fossé, il
Généralement une bonne pratique pour la conception de votre point de vue de la couche aussi mince que possible de sorte que vous n'avez pas à le tester et de vous concentrer sur une logique d'entreprise. Dans le but d'obtenir que les gens sont à l'aide de modèles de conception comme Model View Presenter ou un Modèle de Présentation.
Mais si vous avez de test GUI alors vous pouvez essayer de windowlicker:
- https://code.google.com/p/windowlicker/
normalement, vous devez garder à l'esprit ce que vous voulez la tester dans votre application.disons que vous voulez tester les composants de l'application afin de vérifier si des changements ont eu lieu dans l'avenir qui affectent le format actuel.et la deuxième pour vérifier la logique ou de la méthode fournie dans l'application swing c'est à dire,si un changement dans le flux sera en effet le retour des déclarations.
je vais placer un morceau de code de test
permet de considérer cette méthode de mise en œuvre
donc la suite de cas de test peut être(en utilisant junit)
plus loin si vous voulez stimuler cliquez sur le bouton vous pouvez utiliser doClick méthode de l'instance de l'objet