Four reasons why SWTBot doesn’t work out (for me)
After my little blog series about Jubula, I thought I’d try out something similar using SWTBot. However, there’s no use in writing the same tutorial again for the RCP mail application because it’s already there…
Nevertheless, I attempted to implement the same few tests I wrote for Jubula, and you can view the results in the piece of code below:
package de.johoop;
import static org.junit.Assert.*;
import org.eclipse.jface.bindings.keys.KeyStroke;
import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot;
import org.eclipse.swtbot.swt.finder.keyboard.Keystrokes;
import org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotShell;
import org.junit.Before;
import org.junit.Test;
public class FirstSwtBotTest {
private SWTWorkbenchBot bot;
@Before
public void setUp() throws Exception {
bot = new SWTWorkbenchBot();
}
@Test
public void mailToolbarButtonShouldOpenMessageDialog()
throws Exception {
bot.toolbarButton(1).click();
assertThatCorrectDialogIsDisplayed();
}
@Test
public void openMessageMenuEntryShouldOpenMessageDialog()
throws Exception {
bot.menu("Open Message").click();
assertThatCorrectDialogIsDisplayed();
}
@Test
public void keyboardShortcutShouldOpenMessageDialog()
throws Exception {
SWTBotPreferences.KEYBOARD_LAYOUT = "EN_US";
bot.activeShell().pressShortcut(
Keystrokes.CTRL, KeyStroke.getInstance("3"));
assertThatCorrectDialogIsDisplayed();
}
private void assertThatCorrectDialogIsDisplayed() {
final SWTBotShell openDialog = bot.activeShell();
assertEquals("Open", openDialog.getText());
assertTrue(bot.label("Open Message Dialog!").isVisible());
bot.button("OK").click();
assertFalse(openDialog.isOpen());
}
}
It’s a set of three tests opening the “Open Message” dialog via toolbar button, keyboard shortcut or menu entry. Simple.
At first glance, this looks neat, especially if you’re a developer: few lines of code, all directly in Java, using the already familiar JUnit framework, well supported from within the Eclipse IDE.
Nevertheless, here’s my list of things I don’t like about this:
- Let’s begin with a minor nitpick: I’m using a German keyboard layout, and SWTBot complains that it can’t find my layout. This means that I either have to somehow create one (which might be easy, I haven’t checked), or I have to set my keyboard layout to the US one (it doesn’t matter for my simple
Ctrl-3test). - Next, I can’t write these tests in Scala for some reason (I’d really like to use Scala for my tests, so very much more concise): In Scala, the following line:
new SWTWorkbenchBot().toolbarButton(1).click()
fails with a compile error in Eclipse: “Access to protected method
clicknot permitted because enclosing class objectScalaUseris not a subclass of classAbstractSWTBotin packagewidgetswhere target is defined”. – What’s that?If you ask me, it’s somehow caused by the
SWTBotToolbarButtonhaving an abstract public methodclick()returning anSWTBotToolbarButton, and inheriting fromAbstractSWTBot<T>, which has an abstract protected methodclick()returning anAbstractSWTBot<T>. - Also, I don’t want to use JUnit for system tests. JUnit is a great framework if all you do is unit tests. If you’re testing on the level of integration or system tests, however, TestNG is a way better fit if you ask me. The execution model of TestNG is a lot more flexible than that of JUnit (even if you use decorators and stuff there). For example, have a look at the data providers of TestNG. Unfortunately, there’s no TestNG integration for SWTBot.
- Finally, here’s what I’d call a showstopper. Have you noticed how I say
toolbarButton(1)in my code instead of thetoolbarButtonWithTooltip("Open Message")you’d probably expect? That’s because using the latter method will require another dependency in your plug-in project. That dependency will have to get injected into your test object, too (the RCP mail application in my case). And unfortunately, it will add toolbar buttons and keyboard shortcuts to your test object!In my case, this leads to
Ctrl-3suddenly not working as expected anymore: The tests have changed the behaviour of the test object! I absolutely can’t have that happening.
For me, these four reasons unfortunately mean that SWTBot is not a viable tool for automating UI tests. I would really like to use it, especially combined with Scala, for quick and easy developer UI testing; I’d be quite happy if you could refute any of my four reasons above.
I’ve still got hope that maybe I’m just too stupid to use SWTBot correctly.
This is great. I think the community could use your help fixing these problems you found. It is a great framework and I encourage you to engage the project and contribute back support specially for TestNG.
I’ll look into it. If there’s something easy I can fix, I’ll try.
The fix for the Scala problem seems to be easy. I forked on github and sent a pull request to Ketan.
@Jmhofer
I don’t know what’s the status of your contribution, but Ketan is no more active on SWTBot, moreover, GitHub is not the regular way to contribute to Eclipse projects. You should open bugs instead.
Gerrit will soon be available for SWTBot.
Also, you could easily contribute German keyboard: http://wiki.eclipse.org/SWTBot/Keyboard_Layouts#Creating_keyboard_layouts
About issue #4, I was not aware of it. Could you please describe it with details in a bug report?