GUI MUTATION TESTING USING PITEST, JUnit, JAVA SWING

36 views
Skip to first unread message

ES

unread,
May 22, 2022, 9:01:42 AM5/22/22
to PIT Users
Hello, 

First of all, I'd want to thank you for taking the time to read this email. And I wanted to let you know that I'm new to mutation testing. I have run some unit tests but the output iI always got is no coverage. Is that because Im using GUI?

I'm just curious if Pitest can be used to test against a GUI. Because, if I'm not mistaken, the GUI's  mutation operator requires customization. If so, what is the step in performing the testing based on the GUI mutation operator, given that the mutation operator must be customised?

Please help. 

Regards, 
Ema

Henry Coles

unread,
May 22, 2022, 10:57:10 AM5/22/22
to pitu...@googlegroups.com
Hi Ema,

I'm afraid I have no experience of mutation testing GUI code (or indeed of writing it for quite some time now). I suspect it will be a poor fit for mutation testing though, the last time I did any GUI work testing was limited to integration testing and I suspect this situation has not changed greatly.

That said, if you can post a minimal project that reproduces your no coverage issue (i.e the smallest possible amount of code that shows the problem and a working build script) I can take a look and see what's going on.

Henry

--
You received this message because you are subscribed to the Google Groups "PIT Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to pitusers+u...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/pitusers/be7e3653-5e63-42fc-a1ac-537ee28e7fedn%40googlegroups.com.

ES

unread,
May 22, 2022, 11:18:24 PM5/22/22
to PIT Users
I take this code as example. How to create the unit test for the button/size button or remove some button? Can u give me one example? 

import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
class calculator extends JFrame implements ActionListener {
    // create a frame
    static JFrame f;
    // create a textfield
    static JTextField l;
    // store operator and operands
    String s0, s1, s2;
    // default constructor
    calculator()
    {
        s0 = s1 = s2 = "";
    }

    // main function
    public static void main(String args[])
    {
        // create a frame
        f = new JFrame("calculator");

        try {
            // set look and feel
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }
        catch (Exception e) {
            System.err.println(e.getMessage());
        }

        // create a object of class
        calculator c = new calculator();

        // create a textfield
        l = new JTextField(16);

        // set the textfield to non editable
        l.setEditable(false);

        // create number buttons and some operators
        JButton b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, ba, bs, bd, bm, be, beq, beq1;
        // create number buttons
        b0 = new JButton("0");
        b1 = new JButton("1");
        b2 = new JButton("2");
        b3 = new JButton("3");
        b4 = new JButton("4");
        b5 = new JButton("5");
        b6 = new JButton("6");
        b7 = new JButton("7");
        b8 = new JButton("8");
        b9 = new JButton("9");
        // equals button
        beq1 = new JButton("=");
        // create operator buttons
        ba = new JButton("+");
        bs = new JButton("-");
        bd = new JButton("/");
        bm = new JButton("*");
        beq = new JButton("C");
        // create . button
        be = new JButton(".");

        // create a panel
        JPanel p = new JPanel();
        // add action listeners
        bm.addActionListener(c);
        bd.addActionListener(c);
        bs.addActionListener(c);
        ba.addActionListener(c);
        b9.addActionListener(c);
        b8.addActionListener(c);
        b7.addActionListener(c);
        b6.addActionListener(c);
        b5.addActionListener(c);
        b4.addActionListener(c);
        b3.addActionListener(c);
        b2.addActionListener(c);
        b1.addActionListener(c);
        b0.addActionListener(c);
        be.addActionListener(c);
        beq.addActionListener(c);
        beq1.addActionListener(c);

        // add elements to panel
        p.add(l);
        p.add(ba);
        p.add(b1);
        p.add(b2);
        p.add(b3);
        p.add(bs);
        p.add(b4);
        p.add(b5);
        p.add(b6);
        p.add(bm);
        p.add(b7);
        p.add(b8);
        p.add(b9);
        p.add(bd);
        p.add(be);
        p.add(b0);
        p.add(beq);
        p.add(beq1);

        // set Background of panel
        p.setBackground(Color.blue);

        // add panel to frame
        f.add(p);

        f.setSize(200, 220);
        f.show();
    }
    public void actionPerformed(ActionEvent e)
    {
        String s = e.getActionCommand();

        // if the value is a number
        if ((s.charAt(0) >= '0' && s.charAt(0) <= '9') || s.charAt(0) == '.') {
            // if operand is present then add to second no
            if (!s1.equals(""))
                s2 = s2 + s;
            else
                s0 = s0 + s;

            // set the value of text
            l.setText(s0 + s1 + s2);
        }
        else if (s.charAt(0) == 'C') {
            // clear the one letter
            s0 = s1 = s2 = "";

            // set the value of text
            l.setText(s0 + s1 + s2);
        }
        else if (s.charAt(0) == '=') {

            double te;

            // store the value in 1st
            if (s1.equals("+"))
                te = (Double.parseDouble(s0) + Double.parseDouble(s2));
            else if (s1.equals("-"))
                te = (Double.parseDouble(s0) - Double.parseDouble(s2));
            else if (s1.equals("/"))
                te = (Double.parseDouble(s0) / Double.parseDouble(s2));
            else
                te = (Double.parseDouble(s0) * Double.parseDouble(s2));

            // set the value of text
            l.setText(s0 + s1 + s2 + "=" + te);

            // convert it to string
            s0 = Double.toString(te);

            s1 = s2 = "";
        }
        else {
            // if there was no operand
            if (s1.equals("") || s2.equals(""))
                s1 = s;
            // else evaluate
            else {
                double te;

                // store the value in 1st
                if (s1.equals("+"))
                    te = (Double.parseDouble(s0) + Double.parseDouble(s2));
                else if (s1.equals("-"))
                    te = (Double.parseDouble(s0) - Double.parseDouble(s2));
                else if (s1.equals("/"))
                    te = (Double.parseDouble(s0) / Double.parseDouble(s2));
                else
                    te = (Double.parseDouble(s0) * Double.parseDouble(s2));

                // convert it to string
                s0 = Double.toString(te);

                // place the operator
                s1 = s;

                // make the operand blank
                s2 = "";
            }

            // set the value of text
            l.setText(s0 + s1 + s2);
        }
    }


Pernollet Martin

unread,
Jun 16, 2022, 5:23:39 AM6/16/22
to PIT Users
Hi,

One useful hint : running PIT by default disable the ability to get GUI so you will need to use an extra option to avoid an HeadlessException :

mvn test-compile org.pitest:pitest-maven:mutationCoverage -Dverbose -DjvmArgs=java.awt.headless=false




Pernollet Martin

unread,
Jun 16, 2022, 5:43:16 AM6/16/22
to PIT Users
Sorry, I copy pasted the wrong line. The good one is : 

mvn test-compile org.pitest:pitest-maven:mutationCoverage -DjvmArgs=-Djava.awt.headless=false

Discussed here
Reply all
Reply to author
Forward
0 new messages