当前位置: 首页 > 面试题库 >

JUnit在Java中测试GUI

姬天宇
2023-03-14
问题内容

我想为GUI编写测试用例。我想知道如何模拟JButton的单击,或者如何提取JTable的元素。

为此,我构建了一个简单的GUI,如果单击按钮并且JTextfield为空,则将计数增加1,但是如果提供了数字,则计数将被JTextfield中的整数代替。当然,我想使用Regex来确保输入到JTextfield中的文本实际上是整数,但是让我们假设用户不会四处乱逛并输入非整数。另外,当JTable添加新行时,JLabel将更新当前计数。

这是代码:

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();
            }
        });
    }
}

假设我要模拟打开GUI,然后单击一次按钮而不输入任何文本,然后输入1234并单击按钮,然后单击按钮而不输入任何文本,JTable应该具有3列:{{1,0
},{1234、1},{1235、1234}}。我该如何编写测试?谢谢!


问题答案:

Java
SE随附了用于执行此操作的标准工具,即Robot类。我只用它来编写游戏机器人并通过套接字服务器/客户端对远程控制单独的计算机,但是它实际上是用于自动测试的,因此它应该对您有用。基本格式很简单:

Robot bot = new Robot();
bot.mouseMove(10,10);
bot.mousePress(InputEvent.BUTTON1_MASK);
//add time between press and release or the input event system may 
//not think it is a click
try{Thread.sleep(250);}catch(InterruptedException e){}
bot.mouseRelease(InputEvent.BUTTON1_MASK);

当然,您也可以使用适当的keyPress /
keyRelease方法以类似的方式模拟键盘事件。我有时发现使用机械手类的screenCapture方法以及在屏幕上查找图像并确定单击位置很有用。

注意:这并不要求您要测试的窗口是基于awt / swing构建的,但是它确实要求您使用的java实现支持awt。



 类似资料:
  • 我正在使用Eclipse中的 JUnit5位于modul-path上,并且在module-info.Java中是必需的。 当我尝试运行代码时,总是会收到以下消息: 初始化引导层java.lang.module.findException时出错:无法为C:\users\tim hp.p2\pool\plugins\org.junit.jupiter.migrationsupport_5.0.0.v2

  • 以下测验提供了与JUnit Framework相关的多项选择题(MCQ)。 您必须阅读所有给定的答案并单击正确的答案。 如果您不确定答案,则可以使用“ Show Answer按钮Show Answer 。 您可以使用“ Next Quiz按钮在Next Quiz中检查新的问题集。 问题1 - 关于JUnit,以下哪项是正确的? A - JUnit测试可以组织成包含测试用例甚至其他测试套件的测试套件

  • 我正在学习JUnit测试。我想在JUnit中测试getter和setter,但它不起作用。这是第一节课。 我需要如何更改以测试setter?我如何测试它?

  • 我正在使用和构建一个简单的rest API。生产应用程序应该使用redis-session实现,而测试应该使用默认的(非Redis)Spring-Session。 但是,当在项目中声明maven依赖项时,spring-boot将自动创建,而在测试配置中没有注释。 我的设置 申请代码: 测试:

  • 我已经从https://howtodoinjava.com/spring-batch/java-config-multiple-steps/'复制了Spring批处理程序。 我从https://docs.spring.io/spring-batch/docs/current/reference/html/testing.html创建了以下JUnit测试用例: 我的Maven pom文件是: 谢谢

  • 问题内容: 我正在为现有的Java Swing应用程序执行一些测试,以便可以安全地重构和扩展代码而不会破坏任何内容。我从JUnit中的一些单元测试开始,因为这似乎是最简单的入门方法,但是现在我的首要任务是创建一些端到端测试,以对整个应用程序进行练习。 我将每种测试方法放在一个单独的测试用例中,并在Ant的任务中使用该选项,从而在每个测试中重新启动应用程序。但是,我想作为测试实现的一些用例涉及用户退