SWTBot/FAQ

From Eclipsepedia

Jump to: navigation, search


SWTBot
Website
Update Sites
Community
Mailing List
Forums/Newsgroups
IRC
Contribute
Open Bugzilla tickets
Open Gerrit reviews
Browse Source
Continuous Integration


Contents

Can SWTBot be used to test RCP Applications?

Yes SWTBot can be used to test any kind of SWT apps -- SWT, Eclipse plugins and RCP applications.

What platforms is SWTBot tested on?

SWTBot is continuously tested on a grid of cruise servers that run windows XP/2003, linux/gtk 32 bit and 64 bit and macosx(carbon).

Why do tests run on a non-UI thread?

A lot of events that SWTBot sends to the UI are blocking. SWT dialogs are one of them. This means that functions opening dialogs, will block until the dialog closes. Since we do not want tests to block when a dialog open up, SWTBot runs in a non-UI thread, and posts events to the UI thread.

There are two solutions to this:

  1. Make the dialog non-modal, by invoking Dialog#setBlockOnOpen(false)
  2. Open the dialog in a non-ui thread

SWTBot chooses the later approach, since the first approach is not always practical.

How do I execute parts of tests that need UI thread?

Since SWTBot runs on a non-UI thread, all your code using PlatformUI.getWorkbench() will generally result with a NullPointerException, since PlatformUI.getWorkbench() returns null in non-UI threads.

If you really need to invoke or execute code that needs UI-thread (such as opening an editor without simulating click on New and so on), you can use the following piece of code to wrap the piece of code that requires UI-thread in your tests:

@Test
public void testDiagram() throws ExecutionException {
	// part of test that requires UI-thread
	Display.getDefault().syncExec(new Runnable() {
		public void run() {
			try {
				new NewProcessCommandHandler().execute(null); // requires UI-thread since it is gonna invoke PlatformUI.getWorkbench()
			} catch (Exception ex) {
				ex.printStackTrace();
			}
		}
	});
 
	// Normal SWTBot execution
	SWTBotEditor botEditor = bot.activeEditor();
	SWTBotGefEditor gmfEditor = bot.gefEditor(botEditor.getTitle());
	gmfEditor.activateTool("Step");
	gmfEditor.mouseMoveLeftClick(200, 200);
}

Why do I have to run tests as SWTBot tests, instead of PDE-JUnit tests?

PDE-Junit tests run on the UI thread. SWTBot needs that tests run on a non-UI thread, hence a new run configuration. See Why do tests run on a non-UI thread? for more info.

Can I slow down the execution speed of SWTBot tests?

Yes you can! To slow down the speed of execution of SWTBot, you need to set the system property "org.eclipse.swtbot.playback.delay". This delay is in milliseconds. You can also set this property in code as follows:

// slow down tests
SWTBotPreferences.PLAYBACK_DELAY = 10;
// set to the default speed
SWTBotPreferences.PLAYBACK_DELAY = 0;

Can I change the timeout for execution of SWTBot tests?

Yes you can! To change the timeout, you need to set the system property "org.eclipse.swtbot.search.timeout". The timeout is specified in milliseconds. You can also set this property in code as follows:

// increase timeout to 10 seconds
SWTBotPreferences.TIMEOUT = 10000;
// set to the default timeout of 5 seconds
SWTBotPreferences.TIMEOUT = 5000;

Can I change the poll delay for evaluating conditions in SWTBot tests?

Yes you can! To change the poll delay, you need to set the system property "org.eclipse.swtbot.playback.poll.delay". The poll delay is specified in milliseconds. You can also set this property in code as follows:

// increase timeout to 1 second
SWTBotPreferences.DEFAULT_POLL_DELAY = 1000;
// set to the default timeout of 500ms.
SWTBotPreferences.DEFAULT_POLL_DELAY = 500;

How do I configure log4j to turn on logging for SWTBot?

Copy the file http://dev.eclipse.org/svnroot/technology/org.eclipse.swtbot/trunk/org.eclipse.swtbot.swt.finder.test/src/log4j.xml to the src directory in your plugin. Ensure that the plugin's MANIFEST.MF contains the following lines, note the dependency on org.apache.log4j

Require-Bundle: com.example.foo,
 org.apache.log4j
Eclipse-RegisterBuddy: org.apache.log4j

If you still get the message:

log4j:WARN No appenders could be found for logger (net.sf.swtbot.matcher.WidgetMatcherFactory$MenuMatcher).
log4j:WARN Please initialize the log4j system properly.

Then there's something else not right. Drop an email on the mailing list.

Does SWTBot support my keyboard layout?

Yes it does. See SWTBot/Keyboard_Layouts for how to configure SWTBot for your own keyboard layout.

How do I use SWTBot to test native dialogs (File Dialogs, Color Dialogs, etc)?

You can't! Very unfortunate but true.

SWT does not have support to recognize native dialogs, and SWTBot therefore cannot test them. See eclipse bug #164191 for more info. Consider adding a comment and a vote on that bug as well.

How do I test a login dialog using SWTBot

You can't! The login dialog pops up before SWTBot gets an opportunity to initialize itself. A good workaround is to make the license dialog a bit intelligent so you can bypass it by setting the username and password as a system property. A login dialog like this is a good choice:

public class LoginDialog {
  ...
  public void open() {
    String username = System.getProperty("com.yourapp.username");
    String password = System.getProperty("com.yourapp.password");
    if (isValid(username, password){
        // the password is good, continue doing whatever ?
    } else {
        // revalidate password ?
    }
  }
  ...
}


You can then start SWTBot tests with the following JVM arguments. You may set these JVM args in the target platform(preferred) or the launch configuration for the SWTBot test.

-Dcom.yourapp.username=joe -Dcom.yourapp.password=secret

Can I test an exported eclipse product

You can. You need to ensure that some bits of SWTBot are present in your product. SWTBot cannot run tests on a product if there's no agent sitting inside the product :)

Here's the gory details:

If your product file is based on features, it will look like this:

<features>
  <feature id="com.yourcompany.feature1" version="x.y.z"/>
  <feature id="com.yourcompany.feature2" version="x.y.z"/>
  <feature id="org.eclipse.whatever" version="x.y.z"/>
  ... some other features...
</features> 

Make a copy of your .product file. Lets call it test.product for the time being. If your product is based on features, add the following lines in the test.product:

<features>
  <feature id="com.yourcompany.feature1" version="x.y.z"/>
  <feature id="com.yourcompany.feature2" version="x.y.z"/>
  <feature id="org.eclipse.whatever" version="x.y.z"/>
   ... some other features...  
  <feature id="org.eclipse.swtbot" />
  <feature id="org.eclipse.swtbot.eclipse" />
  <feature id="org.eclipse.pde" />
</features>

Once you have that in place, you can run the tests using the method described in headless execution. See this thread for a discussion on executing tests with products.