29

GUI のテスト ケースを書きたいと思います。JButton のクリックをシミュレートする方法、または JTable の要素を抽出する方法を知りたいです。

この目的のために、ボタンがクリックされ、JTextfield が空の場合にカウントを 1 増やす単純な GUI を作成しましたが、数値が提供された場合、カウントは JTextfield の整数に置き換えられます。もちろん、正規表現を使用して、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 を開くことをシミュレートし、テキストを入力せずにボタンを 1 回クリックし、1234 を入力してボタンをクリックし、テキストを入力せずにボタンをクリックすると、JTable には 3 つの列が必要です: {{1,0 }、{1234、1}、{1235、1234}}。そのためのテストをどのように書くことができますか?ありがとう!

4

5 に答える 5

4

数年前、テストを自動化する必要があるプロジェクトがありました。

最終的には次のようになりました:

jfcunit

私たちも試してみました

fest - 良かったのですが、執筆時点ではシングル スレッドのみでした。

スウィングユニット- これもOKですが、微妙な問題がいくつかあったので、それを捨てる必要がありました

于 2013-05-07T12:22:19.250 に答える
0

一般に、ビュー レイヤーをできるだけ薄く設計することをお勧めします。これにより、テストする必要がなくなり、ビジネス ロジックに集中できます。これを実現するために、人々は Model View Presenter や Presentation Model などのデザイン パターンを使用しています。

ただし、GUI をテストする必要がある場合は、windowlicker を試すことができます: - https://code.google.com/p/windowlicker/

于 2013-10-17T14:16:35.067 に答える
0

通常、アプリケーションで何をテストしたいかを念頭に置いておく必要があります。アプリケーションのコンポーネントをテストして、現在のフォーマットに影響を与える変更が将来行われたかどうかを確認したいとします。次に確認する必要があります。 swing アプリケーションで提供されるロジックまたはメソッド。つまり、フローの変更が return ステートメントに影響するかどうか。

テストコードを配置します

この実装方法を考えてみましょう

  public void activate() 
{  
    f=new JPanel();  
    tf=new JTextField();  
    tf.setBounds(50,50, 150,20);  
    tf.setName("b1");
    b=new JButton("Click Here");
    b.setName("Click Here");
    b.setBounds(50,100,95,30);  
    f.add(b);
    f.add(tf);  
    f.setSize(400,400);  
    f.setLayout(null);  
    f.setVisible(true);
    //b.doClick();
}

したがって、次のテストケースが可能です(junitを使用)

@Test
public void testActivate()
    {
        btn=new Button();
        assertNotNull(btn);
        JPanel jf=btn.f;
        btn.activate();
        int height=b.getHeight();
        int width=b.getWidth();
        assertEquals(30,height);
        assertEquals(95,width);
        int x=b.getX();
        int y=b.getY();
        assertEquals(50,x);
        assertEquals(100,y);
        int x1=tf.getX();
        int y1=tf.getY();
        assertEquals(50,x1);
        assertEquals(50,y1);
    }

さらにボタンクリックを刺激したい場合は、そのオブジェクトインスタンスの doClick メソッドを使用できます

    btn.run();
    b.doClick();

    String str=tf1.getText().toString();
    assertEquals("Welcome to junit.",str);
于 2017-01-24T09:53:44.570 に答える