From 32aba8a8a1676a701b2d48a4f007c1ea322a4d59 Mon Sep 17 00:00:00 2001 From: John Smart Date: Sun, 10 Jan 2016 21:48:50 +0000 Subject: [PATCH] Improved exception reporting --- ...eption.java => SerenityManagedException.java} | 16 ++++++++-------- .../net/thucydides/core/model/TestOutcome.java | 4 ++-- .../core/model/stacktrace/FailureCause.java | 6 +++--- .../core/model/stacktrace/RootCauseAnalyzer.java | 4 ++-- .../thucydides/core/steps/ErrorConvertor.java | 5 +++-- .../net/thucydides/core/steps/StepFailure.java | 14 +++++++++++--- .../thucydides/core/steps/StepInterceptor.java | 8 ++++---- .../core/webdriver/WebDriverFactory.java | 4 ++-- .../core/webdriver/WebdriverInstanceFactory.java | 4 ++-- .../WhenConfiguringTheWebdriverInstance.groovy | 4 ++-- .../WhenRunningStepsThroughAScenarioProxy.java | 6 +++--- .../java/net/serenitybdd/rest/SerenityRest.java | 4 ++-- 12 files changed, 44 insertions(+), 35 deletions(-) rename serenity-core/src/main/java/net/serenitybdd/core/exceptions/{SerenityWebDriverException.java => SerenityManagedException.java} (69%) diff --git a/serenity-core/src/main/java/net/serenitybdd/core/exceptions/SerenityWebDriverException.java b/serenity-core/src/main/java/net/serenitybdd/core/exceptions/SerenityManagedException.java similarity index 69% rename from serenity-core/src/main/java/net/serenitybdd/core/exceptions/SerenityWebDriverException.java rename to serenity-core/src/main/java/net/serenitybdd/core/exceptions/SerenityManagedException.java index 72c02467e0..48de4b3961 100644 --- a/serenity-core/src/main/java/net/serenitybdd/core/exceptions/SerenityWebDriverException.java +++ b/serenity-core/src/main/java/net/serenitybdd/core/exceptions/SerenityManagedException.java @@ -3,7 +3,7 @@ import org.openqa.selenium.WebDriverException; -public class SerenityWebDriverException extends WebDriverException { +public class SerenityManagedException extends RuntimeException { private final String detailedMessage; private final StackTraceElement[] stackTrace; @@ -14,27 +14,27 @@ public class SerenityWebDriverException extends WebDriverException { public static Throwable detachedCopyOf(Throwable testErrorException) { if (!(testErrorException instanceof WebDriverException)) { return testErrorException; - } else if (testErrorException instanceof SerenityWebDriverException) { + } else if (testErrorException instanceof SerenityManagedException) { return testErrorException; } else { - return new SerenityWebDriverException((WebDriverException) testErrorException); + return new SerenityManagedException(testErrorException); } } - public SerenityWebDriverException(WebDriverException testErrorException) { - super(testErrorException.getCause()); + public SerenityManagedException(Throwable testErrorException) { + super(testErrorException); this.detailedMessage = testErrorException.getMessage(); this.stackTrace = testErrorException.getStackTrace(); this.cause = testErrorException.getCause(); this.exceptionClass = testErrorException.getClass(); } - public SerenityWebDriverException(String message, WebDriverException testErrorException) { - super(testErrorException.getCause()); + public SerenityManagedException(String message, Throwable testErrorException) { + super(testErrorException); this.detailedMessage = message; this.stackTrace = testErrorException.getStackTrace(); - this.cause = testErrorException.getCause(); + this.cause = testErrorException.getCause(); this.exceptionClass = testErrorException.getClass(); } diff --git a/serenity-core/src/main/java/net/thucydides/core/model/TestOutcome.java b/serenity-core/src/main/java/net/thucydides/core/model/TestOutcome.java index 789aa7209c..c888cff97c 100644 --- a/serenity-core/src/main/java/net/thucydides/core/model/TestOutcome.java +++ b/serenity-core/src/main/java/net/thucydides/core/model/TestOutcome.java @@ -8,7 +8,7 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; import com.google.common.collect.Sets; -import net.serenitybdd.core.exceptions.SerenityWebDriverException; +import net.serenitybdd.core.exceptions.SerenityManagedException; import net.serenitybdd.core.model.FailureDetails; import net.serenitybdd.core.time.SystemClock; import net.thucydides.core.ThucydidesSystemProperty; @@ -1112,7 +1112,7 @@ public void setUserStory(Story story) { public void determineTestFailureCause(Throwable cause) { if (cause != null) { - RootCauseAnalyzer rootCauseAnalyser = new RootCauseAnalyzer(SerenityWebDriverException.detachedCopyOf(cause)); + RootCauseAnalyzer rootCauseAnalyser = new RootCauseAnalyzer(SerenityManagedException.detachedCopyOf(cause)); FailureCause rootCause = rootCauseAnalyser.getRootCause(); this.testFailureClassname = rootCauseAnalyser.getRootCause().getErrorType(); this.testFailureMessage = rootCauseAnalyser.getMessage(); diff --git a/serenity-core/src/main/java/net/thucydides/core/model/stacktrace/FailureCause.java b/serenity-core/src/main/java/net/thucydides/core/model/stacktrace/FailureCause.java index 84c12f0b27..3a1cd046ff 100644 --- a/serenity-core/src/main/java/net/thucydides/core/model/stacktrace/FailureCause.java +++ b/serenity-core/src/main/java/net/thucydides/core/model/stacktrace/FailureCause.java @@ -2,7 +2,7 @@ import com.google.common.base.Optional; import com.google.common.base.Splitter; -import net.serenitybdd.core.exceptions.SerenityWebDriverException; +import net.serenitybdd.core.exceptions.SerenityManagedException; import net.serenitybdd.core.exceptions.UnrecognisedException; import net.thucydides.core.model.TestFailureException; import net.thucydides.core.util.NameConverter; @@ -36,8 +36,8 @@ public FailureCause(Throwable cause, StackTraceElement[] stackTrace) { } private static String exceptionClassName(Throwable cause) { - if (cause instanceof SerenityWebDriverException) { - return ((SerenityWebDriverException) cause).getExceptionClass().getName(); + if (cause instanceof SerenityManagedException) { + return ((SerenityManagedException) cause).getExceptionClass().getName(); } else { return cause.getClass().getName(); } diff --git a/serenity-core/src/main/java/net/thucydides/core/model/stacktrace/RootCauseAnalyzer.java b/serenity-core/src/main/java/net/thucydides/core/model/stacktrace/RootCauseAnalyzer.java index 8d0b7a19e5..f6fbdaf7a9 100644 --- a/serenity-core/src/main/java/net/thucydides/core/model/stacktrace/RootCauseAnalyzer.java +++ b/serenity-core/src/main/java/net/thucydides/core/model/stacktrace/RootCauseAnalyzer.java @@ -1,6 +1,6 @@ package net.thucydides.core.model.stacktrace; -import net.serenitybdd.core.exceptions.SerenityWebDriverException; +import net.serenitybdd.core.exceptions.SerenityManagedException; import net.thucydides.core.guice.Injectors; import net.thucydides.core.model.failures.FailureAnalysis; import net.thucydides.core.util.EnvironmentVariables; @@ -30,7 +30,7 @@ public FailureCause getRootCause() { private Throwable originalExceptionFrom(Throwable thrownException) { - if (!(thrownException instanceof WebdriverAssertionError) && ((thrownException instanceof SerenityWebDriverException) || (thrownException instanceof AssertionError))){ + if (!(thrownException instanceof WebdriverAssertionError) && ((thrownException instanceof SerenityManagedException) || (thrownException instanceof AssertionError))){ return thrownException; } if (failureAnalysis.reportAsCompromised(thrownException.getClass())) { diff --git a/serenity-core/src/main/java/net/thucydides/core/steps/ErrorConvertor.java b/serenity-core/src/main/java/net/thucydides/core/steps/ErrorConvertor.java index e7cd456121..77081fbff2 100644 --- a/serenity-core/src/main/java/net/thucydides/core/steps/ErrorConvertor.java +++ b/serenity-core/src/main/java/net/thucydides/core/steps/ErrorConvertor.java @@ -1,6 +1,6 @@ package net.thucydides.core.steps; -import net.thucydides.core.webdriver.WebdriverAssertionError; +import net.serenitybdd.core.exceptions.SerenityManagedException; import java.io.Serializable; @@ -19,7 +19,8 @@ public Throwable convertToAssertion() { if (RuntimeException.class.isAssignableFrom(throwable.getClass())) { return throwable; } else { - return new WebdriverAssertionError(throwable); +// return new WebdriverAssertionError(throwable); + return new SerenityManagedException(throwable); } } } \ No newline at end of file diff --git a/serenity-core/src/main/java/net/thucydides/core/steps/StepFailure.java b/serenity-core/src/main/java/net/thucydides/core/steps/StepFailure.java index 4fcfd405c9..99fe08ad6d 100644 --- a/serenity-core/src/main/java/net/thucydides/core/steps/StepFailure.java +++ b/serenity-core/src/main/java/net/thucydides/core/steps/StepFailure.java @@ -1,6 +1,8 @@ package net.thucydides.core.steps; +import net.serenitybdd.core.exceptions.SerenityManagedException; + /** * Description and underlying cause behind a step failure. * A StepFailure holds a description of the failed test step and the @@ -21,9 +23,15 @@ public StepFailure(final ExecutedStepDescription description, final Throwable ca this.description = description; this.cause = cause; if (cause != null) { - this.exceptionClass = cause.getClass(); - this.message = cause.getMessage(); - this.stackTraceElements = cause.getStackTrace(); + if (cause instanceof SerenityManagedException) { + this.exceptionClass = ((SerenityManagedException)cause).getExceptionClass(); + this.message = cause.getMessage(); + this.stackTraceElements = ((SerenityManagedException)cause).getStackTrace(); + } else { + this.exceptionClass = cause.getClass(); + this.message = cause.getMessage(); + this.stackTraceElements = cause.getStackTrace(); + } } else { this.exceptionClass = null; this.message = null; diff --git a/serenity-core/src/main/java/net/thucydides/core/steps/StepInterceptor.java b/serenity-core/src/main/java/net/thucydides/core/steps/StepInterceptor.java index ed77e839a0..45e2de154a 100644 --- a/serenity-core/src/main/java/net/thucydides/core/steps/StepInterceptor.java +++ b/serenity-core/src/main/java/net/thucydides/core/steps/StepInterceptor.java @@ -7,7 +7,7 @@ import net.serenitybdd.core.PendingStepException; import net.serenitybdd.core.Serenity; import net.serenitybdd.core.SkipNested; -import net.serenitybdd.core.exceptions.SerenityWebDriverException; +import net.serenitybdd.core.exceptions.SerenityManagedException; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import net.thucydides.core.ThucydidesSystemProperty; @@ -257,7 +257,7 @@ private boolean shouldRunInDryRunMode(final Method methodOrStep, final Class cal } public void reportMethodError(Throwable generalException, Object obj, Method method, Object[] args) throws Throwable { - error = SerenityWebDriverException.detachedCopyOf(generalException); + error = SerenityManagedException.detachedCopyOf(generalException); Throwable assertionError = forError(error).convertToAssertion(); notifyStepStarted(obj, method, args); notifyOfStepFailure(obj, method, args, assertionError); @@ -268,7 +268,7 @@ private Object invokeMethodAndNotifyFailures(Object obj, Method method, Object[] try { result = invokeMethod(obj, args, proxy); } catch (Throwable generalException) { - error = SerenityWebDriverException.detachedCopyOf(generalException); + error = SerenityManagedException.detachedCopyOf(generalException); Throwable assertionError = forError(error).convertToAssertion(); notifyStepStarted(obj, method, args); notifyOfStepFailure(obj, method, args, assertionError); @@ -314,7 +314,7 @@ private Object runTestStep(final Object obj, final Method method, } catch (AssumptionViolatedException assumptionFailed) { result = appropriateReturnObject(obj, method); } catch (Throwable testErrorException) { - error = SerenityWebDriverException.detachedCopyOf(testErrorException); + error = SerenityManagedException.detachedCopyOf(testErrorException); logStepFailure(obj, method, args, forError(error).convertToAssertion()); result = appropriateReturnObject(obj, method); } diff --git a/serenity-core/src/main/java/net/thucydides/core/webdriver/WebDriverFactory.java b/serenity-core/src/main/java/net/thucydides/core/webdriver/WebDriverFactory.java index a06f3f1fe2..258779fb3f 100644 --- a/serenity-core/src/main/java/net/thucydides/core/webdriver/WebDriverFactory.java +++ b/serenity-core/src/main/java/net/thucydides/core/webdriver/WebDriverFactory.java @@ -4,7 +4,7 @@ import com.google.common.base.Preconditions; import io.appium.java_client.AppiumDriver; import net.serenitybdd.core.Serenity; -import net.serenitybdd.core.exceptions.SerenityWebDriverException; +import net.serenitybdd.core.exceptions.SerenityManagedException; import net.serenitybdd.core.pages.DefaultTimeouts; import net.serenitybdd.core.pages.PageObject; import net.thucydides.core.ThucydidesSystemProperty; @@ -195,7 +195,7 @@ protected synchronized WebDriver newWebdriverInstance(final Class argument = ArgumentCaptor.forClass(StepFailure.class); verify(listener).stepFailed(argument.capture()); - assertThat(argument.getValue().getMessage(), is("java.lang.AssertionError: Oops!")); + assertThat(argument.getValue().getMessage(), is("Oops!")); } @Test diff --git a/serenity-rest-assured/src/main/java/net/serenitybdd/rest/SerenityRest.java b/serenity-rest-assured/src/main/java/net/serenitybdd/rest/SerenityRest.java index fd24d0cfd0..891112f69d 100644 --- a/serenity-rest-assured/src/main/java/net/serenitybdd/rest/SerenityRest.java +++ b/serenity-rest-assured/src/main/java/net/serenitybdd/rest/SerenityRest.java @@ -13,7 +13,7 @@ import com.jayway.restassured.specification.RequestSpecification; import com.jayway.restassured.specification.ResponseSpecification; import net.serenitybdd.core.Serenity; -import net.serenitybdd.core.exceptions.SerenityWebDriverException; +import net.serenitybdd.core.exceptions.SerenityManagedException; import net.serenitybdd.core.rest.RestMethod; import net.serenitybdd.core.rest.RestQuery; import net.serenitybdd.rest.decorators.RestDecorator; @@ -174,7 +174,7 @@ private static Object wrappedResult(Method method, Object target, Object[] args) return result; } } catch (Exception generalException) { - Throwable error = SerenityWebDriverException.detachedCopyOf(generalException.getCause()); + Throwable error = SerenityManagedException.detachedCopyOf(generalException.getCause()); Throwable assertionError = forError(error).convertToAssertion(); notifyOfStepFailure(method, args, assertionError); return stubbed(method);