My test setup is for a little wicket 1.5.x based web application with ui tests running during integration-test phase of maven 3.x. The problem here is that my ubuntu 12.01 server has only a console and no gnome or kde running like a desktop linux. Inside eclipse is a test, which starts a browser like firefox to run automated clicks, no problem. I decided to use the webdriver based selenium tests which can use several driver for the different browser. Each driver supports a different browser like chrome, internet explorer or firefox. My tests starts a firefox with explicit locale setting. The wicket application is i18n localized for english an german speaking customer. On the server is a jenkins ci installed with subversion polling to run automated tests during maven build. You can run the scenario with no problems as well under hudson as ci. The solution use xvfb a virtual xwindow system for firefox as desktop. It will automatically started and stopped by jenkins during a job build.
Software Installation on the server
Installation of xvfb
apt-get install xvfb gtk2-engines-pixbuf
Installation of fonts
apt-get install xfonts-base xfonts-75dpi xfonts-100dpi
apt-get install xfonts-scalable xfonts-cyrillic
Installation of tools for testing xvfb
apt-get install x11-apps imagemagick
Testing server installation
1. Console run server
Xvfb -ac :99 -screen 0 1280x1024x16
2. console start firefox
export DISPLAY=:99
firefox http://ralf.schaeftlein.com
3. console make a screenshot
xwd -root -display :99 | convert xwd:- capture.png
And see a result like this when you retrieve the file capture.png via ssh
Jenkins Configuration
Init.d Script for xvfb
Save content as file under /etc/inid.d/xvfb
XVFB=/usr/bin/Xvfb XVFBARGS="$DISPLAY -ac -screen 0 1280x1024x16" PIDFILE=/var/hudson/xvfb_${DISPLAY:1}.pid case "$1" in start) echo -n "Starting virtual X frame buffer: Xvfb" /sbin/start-stop-daemon --start --quiet --pidfile $PIDFILE --make-pidfile --background --exec $XVFB -- $XVFBARGS echo "." ;; stop) echo -n "Stopping virtual X frame buffer: Xvfb" /sbin/start-stop-daemon --stop --quiet --pidfile $PIDFILE echo "." ;; restart) $0 stop $0 start ;; *) echo "Usage: /etc/init.d/xvfb {start|stop|restart}" exit 1 esac exit 0
Set rights for jenkins running user on the script
chown jenkins:root /etc/init.d/xvfb
chmod ug+rwx /etc/init.d/xvfb
Add display environment variable to jenkins init.d script
export DISPLAY=:99
Create a new jenkins job
Create a new jenkins job for your web project stored in subversion
Add to pre and post build step a shell script to start and stop xvfb
Configure maven pom of the web project
Define special tests in surefire to run as integration tests and jetty as integration application server
org.apache.maven.plugins maven-surefire-plugin 2.4.3 true surefire-test test test false **/itest/** surefire-itest integration-test test false **/itest/** org.mortbay.jetty maven-jetty-plugin 6.1.26 10 foo 9998 /${project.artifactId} true ${basedir}/src/test/webapp/WEB-INF/web.xml 9999 60000 start-jetty pre-integration-test run 0 true stop-jetty post-integration-test stop
Add dependency to selenium maven artifacts
org.seleniumhq.selenium.client-drivers selenium-java-client-driver 1.0.2 test org.seleniumhq.selenium selenium-java 2.21.0 test
Record ui steps and write a selenium junit test
Install the selenium ide as firefox plugin
Start firefox and install the xpi file as new plugin. Restart firefox afterwards.
Record ui steps
- Open the menu, choose web developer and their selenium ide.
- Start inside eclipse the tomcat with your web application
- Open in firefox the web application
- Click inside selenium ide on the red record button for start recording
- Click through your web application
- Click again on the red record button for stop recording
- Choose from menu “Export as testcase” and their “Junit4 (Webdriver backed)”
- Save file as test.java
Create an new selenium junit test file
- Copy the test.java into your eclipse project into the src/test/java folder
- Adopt the class definition and setup method like this
public class SeleniumTest { private Log log = LogFactory.getLog(getClass()); protected Selenium selenium; @Before public void setUp() throws Exception { FirefoxProfile profile = new FirefoxProfile(); // enable german language locale profile.setPreference("intl.accept_languages", "de-de,de"); profile.setEnableNativeEvents(true); profile.layoutOnDisk(); WebDriver driver = new FirefoxDriver(profile); String baseUrl = "http://localhost:9999/"; // port jetty surefire integration test selenium = new WebDriverBackedSelenium(driver, baseUrl); }
– insert java code –
- Check into subversion and control jenkins job console.