/*
* $Id: AbstractTest.java 102464 2013-08-21 15:35:16Z nahlikm1 $
*
* Copyright (c) 2009 AspectWorks, spol. s r.o.
*/
package com.pageobject.component;
import org.junit.Rule;
import org.junit.rules.ExternalResource;
import org.junit.rules.RuleChain;
import org.junit.rules.TestRule;
import org.junit.rules.TestWatcher;
import org.junit.runner.Description;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.test.context.TestExecutionListeners;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
import org.springframework.test.context.support.DirtiesContextTestExecutionListener;
/**
* Base class for automated web page tests.
* (You should reimplement the testRule if you want to use @After to tear down something.)
*
* @author Zdenek Jonas
* @author Pavel Muller
* @author Lubos Racansky
* @version $Revision: 102464 $
*/
@TestExecutionListeners( { DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class })
@RunWith(SpringJUnit4ClassRunner.class)
public abstract class AbstractTest extends AbstractComponent {
protected static final String DEFAULT_SCREENSHOT_DIR = "/tmp/";
protected String screenshotDir = DEFAULT_SCREENSHOT_DIR;
/**
* Screenshot directory to put images after test failures.
* Default is <code>/tmp/</code>
* <p>Mapped to configuration property: selenium.screenshot.dir
* @param screenshotDir absolute path WITH trailing slash
*/
@Value("${selenium.screenshot.dir}")
public void setScreenshotDir(String screenshotDir) {
this.screenshotDir = screenshotDir;
}
/**
* Capture a screen shot if test fails.
* !Be careful, failed is done after the @After method, so if you want
* to use something to clean the driver using the After (e.g. logout, delete cookies ...)
* you should create a TestRule around this rule and setup @After in it.
*/
public TestRule screenshotRule = new TestWatcher() {
@Override
public void failed(Throwable t, Description description) {
// Get test method name
String className = description.getClassName();
String methodName = description.getMethodName();
String screenShotPath = screenshotDir + className + "." + methodName + ".png";
captureScreenshot(screenShotPath);
logger.info("Test " + className + "." + methodName + " failed.");
logger.info("Created a screenshot [{}]", screenShotPath);
}
};
/**
* Method to capture and save screen shot to desired path.
* @param screenshotPath full path where the screen shot should be saved (with the exact file name).
*/
protected void captureScreenshot(String screenshotPath) {
try {
browser.captureScreenshot(screenshotPath);
} catch (Exception e) {
logger.error("Unable to capture screenshot", e) ;
}
}
/**
* Reimplement this rule if you want to use After method to tear down
* something. <b>If you use @After it's done before the screenshot rule!</b>
*/
@Rule
public TestRule testRule = RuleChain.outerRule(new ExternalResource() {
@Override
protected void before() throws Throwable {
logger.info("Starting a test.");
}
@Override
protected void after() {
logger.info("Current test is done.");
}
}).around(screenshotRule);
}