Testing SWT GUI with SWTBot
Asked Answered
P

1

9

I want to test a simple SWT GUI application with SWTBot. Unfortunatly, I have no idea how to start. There are several tutorials which describe the testing of an Eclipse plug-in but I could not find anything regarding my problem. I don't even know if it is possible.

Perk answered 19/4, 2011 at 12:16 Comment(0)
E
19

Well it is very much possible. Follow the step as mentioned below.

  1. Download SWTBot for SWT Testing
  2. Put it in the <eclipsehome>/dropins folder
  3. Restart your eclipse

Now at this point you are ready to play with SWTBot.

For the demo purpose I have written a small Login dialog for you and it will look like this: enter image description here

Code

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

public class SampleSWTUI 
{

    public Shell showGUI(final Display display)
    {
        Shell shell = new Shell(display);
        shell.setLayout(new GridLayout(3,true));
        shell.setText("Sample SWT UI");

        new Label(shell, SWT.NONE).setText("User Name: ");
        final Text nameText = new Text(shell, SWT.BORDER);
        nameText.setText ("");
        GridData data = new GridData(SWT.FILL, SWT.FILL, true, false);
        data.horizontalSpan = 2;
        nameText.setLayoutData(data);
        
        new Label(shell, SWT.NONE).setText("Password: ");
        final Text passwordText = new Text(shell, SWT.BORDER|SWT.PASSWORD);
        passwordText.setText ("");
        data = new GridData(SWT.FILL, SWT.FILL, true, false);
        data.horizontalSpan = 2;
        passwordText.setLayoutData(data);

        Button loginButton = new Button (shell, SWT.PUSH);
        loginButton.setText ("Login");
        data = new GridData(SWT.FILL, SWT.FILL, true, false);
        data.horizontalSpan = 3;
        loginButton.setLayoutData(data);
        loginButton.addSelectionListener(new SelectionAdapter(){
            public void widgetSelected(SelectionEvent e) 
            {
                String user = nameText.getText();
                String password = passwordText.getText();
                
                System.out.println("\n\n\n");
                if(user.equals("Favonius") && password.equals("abcd123")){
                    System.out.println("Success !!!");
                }else {
                    System.err.println("What the .. !! Anyway it is just a demo !!");
                }                   
            }
        });

        shell.pack();
        shell.open();
        return shell;

    }

    public static void main(String [] args) 
    {
        Display display = new Display();
        Shell shell = new SampleSWTUI().showGUI(display);
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) display.sleep();
        }

        display.dispose();
    }
}

Now create a JUnit test case (google for it if you are new to it) . Also add all the jar files present in SWTBot (the one you have downloaded) in your classpath.

Now first create a display (because application needs one). Also get the handle of container in which your widgets/controls are present. In my case it is the Shell.

SWTBot Code

import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swtbot.swt.finder.SWTBot;
import org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotButton;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotText;
import org.junit.Test;


public class SWTBotDemo 
{
    @Test
    public void test() 
    {
        SWTBotPreferences.PLAYBACK_DELAY = 100; // slow down tests...Otherwise we won't see anything
        
        Display display = new Display();
        Shell shell = new SampleSWTUI().showGUI(display);
        SWTBot bot = new SWTBot(shell);
        
        SWTBotButton loginButton = bot.button("Login");
        SWTBotText userText = bot.textWithLabel("User Name: ");
        SWTBotText passwordText = bot.textWithLabel("Password: ");
        
        userText.setFocus();
        userText.setText("Superman");
        
        assert(userText.getText().equals("Superman"));
        
        passwordText.setFocus();
        passwordText.setText("test123");
        
        assert(userText.getText().equals("test123"));
        
        loginButton.setFocus();
        loginButton.click();    
        
        
        userText.setFocus();
        userText.setText("Favonius");
        
        assert(userText.getText().equals("Favonius"));
        
        passwordText.setFocus();
        passwordText.setText("abcd123");
        
        assert(userText.getText().equals("abcd123"));
        
        loginButton.setFocus();
        loginButton.click();    

        while (!shell.isDisposed()) {
             if (!display.readAndDispatch()) display.sleep();
        }

        display.dispose();
    }
}

Now all the SWTBot methods and variables are well defined in the source and the source is bundled within the SWTBot jars. So you can always go ahead and hack its source code.

Further Reading

  1. http://wiki.eclipse.org/SWTBot/FAQ
  2. http://wiki.eclipse.org/SWTBot/UsersGuide

Hope this will help.

Eccentricity answered 20/4, 2011 at 5:53 Comment(3)
hello favonius, thank you for this tutorial! i did it the same as you said and it works. now i try to use this for my own application.Perk
Hello favonius, when I do this I just have a new Eclipse window that opens and close. Should I set up something else in the Run Config to target the login window and not Eclipse? ThanksPartake
Hi @zylootino: the post is almost a year old and I am no longer in touch with SWT or eclipse development. I would suggest you to tweak your code here and there and see. If it still doesn't work then post it as question on SO. Someone here on SO will definitely answer that.Eccentricity

© 2022 - 2024 — McMap. All rights reserved.