use a rule to execute test and being able to capture screenshots

git-svn-id: https://svn.apache.org/repos/asf/archiva/trunk@1296372 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Olivier Lamy 2012-03-02 18:38:16 +00:00
parent c0296ed739
commit 6d7eb19f39
5 changed files with 86 additions and 16 deletions

View File

@ -40,7 +40,7 @@ public class LoginTest
goToLoginPage(); goToLoginPage();
setFieldValue( "user-login-form-username", "badUsername" ); setFieldValue( "user-login-form-username", "badUsername" );
clickLinkWithLocator( "modal-login-ok", true ); clickLinkWithLocator( "modal-login-ok", true );
assertTextPresent( "This field is required." ); assertTextPresent( "This field is required.f" );
} }

View File

@ -1,8 +1,9 @@
package org.apache.archiva.web.test.parent; package org.apache.archiva.web.test.parent;
import org.apache.archiva.web.test.tools.ArchivaSeleniumRunner; import org.apache.archiva.web.test.tools.ScreenshotCaptureRule;
import org.junit.Before; import org.junit.Rule;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.junit.runners.BlockJUnit4ClassRunner;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
@ -26,10 +27,11 @@ import java.io.IOException;
* under the License. * under the License.
*/ */
@RunWith( ArchivaSeleniumRunner.class ) @RunWith( BlockJUnit4ClassRunner.class )
public abstract class AbstractArchivaTest public abstract class AbstractArchivaTest
extends AbstractSeleniumTest extends AbstractSeleniumTest
{ {
protected String username; protected String username;
protected String fullname; protected String fullname;

View File

@ -22,9 +22,9 @@ package org.apache.archiva.web.test.parent;
import com.thoughtworks.selenium.DefaultSelenium; import com.thoughtworks.selenium.DefaultSelenium;
import com.thoughtworks.selenium.Selenium; import com.thoughtworks.selenium.Selenium;
import org.apache.archiva.web.test.tools.AfterSeleniumFailure; import org.apache.archiva.web.test.tools.AfterSeleniumFailure;
import org.junit.After; import org.apache.archiva.web.test.tools.ScreenshotCaptureRule;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before; import org.junit.Rule;
import java.io.File; import java.io.File;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
@ -43,6 +43,10 @@ import java.util.Properties;
public abstract class AbstractSeleniumTest public abstract class AbstractSeleniumTest
{ {
@Rule
public ScreenshotCaptureRule screenshotCaptureRule = new ScreenshotCaptureRule();
public String browser = System.getProperty( "browser" ); public String browser = System.getProperty( "browser" );
public String baseUrl = System.getProperty( "baseUrl" ); public String baseUrl = System.getProperty( "baseUrl" );
@ -57,22 +61,20 @@ public abstract class AbstractSeleniumTest
public Properties p; public Properties p;
@Before
public void open() public void open()
throws Exception throws Exception
{ {
p = new Properties(); p = new Properties();
p.load( this.getClass().getClassLoader().getResourceAsStream( "test.properties" ) ); p.load( this.getClass().getClassLoader().getResourceAsStream( "test.properties" ) );
open( baseUrl, browser, seleniumHost, seleniumPort, maxWaitTimeInMs ); open( baseUrl, browser, seleniumHost, seleniumPort, maxWaitTimeInMs );
screenshotCaptureRule.selenium = selenium;
assertAdminCreated(); assertAdminCreated();
} }
/** /**
* Close selenium session. * Close selenium session.
*/ */
@After
public void close() public void close()
throws Exception
{ {
if ( getSelenium() != null ) if ( getSelenium() != null )
{ {
@ -645,27 +647,23 @@ public abstract class AbstractSeleniumTest
} }
@AfterSeleniumFailure @AfterSeleniumFailure
public void captureScreenShotOnFailure( Throwable failure ) public void captureScreenShotOnFailure( Throwable failure, String methodName, String className )
{ {
SimpleDateFormat sdf = new SimpleDateFormat( "yyyy.MM.dd-HH_mm_ss" ); SimpleDateFormat sdf = new SimpleDateFormat( "yyyy.MM.dd-HH_mm_ss" );
String time = sdf.format( new Date() ); String time = sdf.format( new Date() );
File targetPath = new File( "target", "screenshots" ); File targetPath = new File( "target", "screenshots" );
String cName = this.getClass().getName();
String methodName = "";
int lineNumber = 0; int lineNumber = 0;
for ( StackTraceElement stackTrace : failure.getStackTrace() ) for ( StackTraceElement stackTrace : failure.getStackTrace() )
{ {
if ( stackTrace.getClassName().equals( this.getClass().getName() ) ) if ( stackTrace.getClassName().equals( this.getClass().getName() ) )
{ {
methodName = stackTrace.getMethodName();
lineNumber = stackTrace.getLineNumber(); lineNumber = stackTrace.getLineNumber();
break; break;
} }
} }
String className = cName.substring( cName.lastIndexOf( '.' ) + 1 );
targetPath.mkdirs(); targetPath.mkdirs();
Selenium selenium = getSelenium(); Selenium selenium = getSelenium();
String fileBaseName = methodName + "_" + className + ".java_" + lineNumber + "-" + time; String fileBaseName = methodName + "_" + className + ".java_" + lineNumber + "-" + time;

View File

@ -42,9 +42,11 @@ public class ArchivaSeleniumRunner
super( clazz ); super( clazz );
} }
/* /*
* FIXME move that to a Rule. * FIXME move that to a Rule.
*/ */
@Override @Override
protected Statement withAfters( FrameworkMethod method, Object target, Statement statement ) protected Statement withAfters( FrameworkMethod method, Object target, Statement statement )
{ {

View File

@ -0,0 +1,68 @@
package org.apache.archiva.web.test.tools;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import com.thoughtworks.selenium.Selenium;
import org.apache.archiva.web.test.parent.AbstractSeleniumTest;
import org.junit.rules.MethodRule;
import org.junit.runner.Description;
import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.Statement;
/**
* @author Olivier Lamy
*/
public class ScreenshotCaptureRule
implements MethodRule //TestRule
{
public Selenium selenium;
public Statement apply( Statement base, FrameworkMethod method, Object target )
{
try
{
( (AbstractSeleniumTest) target ).open();
method.getMethod().invoke( target );
}
catch ( Throwable e )
{
( (AbstractSeleniumTest) target ).captureScreenShotOnFailure( e, method.getMethod().getName(),
target.getClass().getName() );
}
finally
{
( (AbstractSeleniumTest) target ).close();
}
return new Statement()
{
@Override
public void evaluate()
throws Throwable
{
// no op
}
};
}
public Statement apply( Statement base, Description description )
{
return base; //To change body of implemented methods use File | Settings | File Templates.
}
}