Repository: maven-surefire Updated Branches: refs/heads/master 6d50bf678 -> 080aa5f61
[SUREFIRE-1088] fix reported execution time if a test breaks in @BeforeClass, or if a complete test class is marked as @Ignored Project: http://git-wip-us.apache.org/repos/asf/maven-surefire/repo Commit: http://git-wip-us.apache.org/repos/asf/maven-surefire/commit/080aa5f6 Tree: http://git-wip-us.apache.org/repos/asf/maven-surefire/tree/080aa5f6 Diff: http://git-wip-us.apache.org/repos/asf/maven-surefire/diff/080aa5f6 Branch: refs/heads/master Commit: 080aa5f612382cd1bf6e47c4322bd855ad3b4fed Parents: 6d50bf6 Author: Andreas Gudian <agud...@apache.org> Authored: Sat Oct 11 23:05:03 2014 +0200 Committer: Andreas Gudian <agud...@apache.org> Committed: Sat Oct 11 23:05:03 2014 +0200 ---------------------------------------------------------------------- .../surefire/report/TestSetRunListener.java | 31 ++++++++++++++-- .../plugin/surefire/report/TestSetStats.java | 18 ++++++++- .../its/jiras/Surefire943ReportContentIT.java | 37 +++++++++++++++---- .../test/java/org/sample/module/My1Test.java | 3 -- .../test/java/org/sample/module/My2Test.java | 3 -- .../test/java/org/sample/module/My3Test.java | 3 -- .../test/java/org/sample/module/My4Test.java | 5 --- .../test/java/org/sample/module/My5Test.java | 39 ++++++++++++++++++++ 8 files changed, 111 insertions(+), 28 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/080aa5f6/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/TestSetRunListener.java ---------------------------------------------------------------------- diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/TestSetRunListener.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/TestSetRunListener.java index ca2403d..d4c0263 100644 --- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/TestSetRunListener.java +++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/TestSetRunListener.java @@ -19,16 +19,17 @@ package org.apache.maven.plugin.surefire.report; * under the License. */ +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + import org.apache.maven.plugin.surefire.runorder.StatisticsReporter; +import org.apache.maven.shared.utils.StringUtils; import org.apache.maven.surefire.report.ConsoleLogger; import org.apache.maven.surefire.report.ConsoleOutputReceiver; import org.apache.maven.surefire.report.ReportEntry; import org.apache.maven.surefire.report.RunListener; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - /** * Reports data for a single test set. * <p/> @@ -40,6 +41,8 @@ public class TestSetRunListener { private final TestSetStats detailsForThis; + private ReportEntry lastSkipped; + private List<TestMethodStats> testMethodStats; private Utf8RecodingDeferredFileOutputStream testStdOut = initDeferred( "stdout" ); @@ -109,6 +112,8 @@ public class TestSetRunListener public void testSetStarting( ReportEntry report ) { + checkForUnfinishedTestSetDueToSkip( report ); + detailsForThis.testSetStart(); if ( consoleReporter != null ) { @@ -180,6 +185,8 @@ public class TestSetRunListener public void testError( ReportEntry reportEntry ) { + checkForUnfinishedTestSetDueToSkip( reportEntry ); + WrappedReportEntry wrapped = wrap( reportEntry, ReportEntryType.error ); detailsForThis.testError( wrapped ); if ( statisticsReporter != null ) @@ -191,6 +198,8 @@ public class TestSetRunListener public void testFailed( ReportEntry reportEntry ) { + checkForUnfinishedTestSetDueToSkip( reportEntry ); + WrappedReportEntry wrapped = wrap( reportEntry, ReportEntryType.failure ); detailsForThis.testFailure( wrapped ); if ( statisticsReporter != null ) @@ -206,7 +215,12 @@ public class TestSetRunListener public void testSkipped( ReportEntry reportEntry ) { + checkForUnfinishedTestSetDueToSkip( reportEntry ); + + lastSkipped = reportEntry; + WrappedReportEntry wrapped = wrap( reportEntry, ReportEntryType.skipped ); + detailsForThis.testSkipped( wrapped ); if ( statisticsReporter != null ) { @@ -215,6 +229,15 @@ public class TestSetRunListener clearCapture(); } + private void checkForUnfinishedTestSetDueToSkip( ReportEntry reportEntry ) + { + if ( lastSkipped != null && !StringUtils.equals( lastSkipped.getSourceName(), reportEntry.getSourceName() ) ) { + // a new test class was started to be processed, but a skipped test class was not yet marked as completed + testSetCompleted( lastSkipped ); + lastSkipped = null; + } + } + public void testAssumptionFailure( ReportEntry report ) { testSkipped( report ); http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/080aa5f6/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/TestSetStats.java ---------------------------------------------------------------------- diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/TestSetStats.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/TestSetStats.java index a175b0a..8391ff9 100644 --- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/TestSetStats.java +++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/TestSetStats.java @@ -58,12 +58,26 @@ public class TestSetStats public int getElapsedSinceTestSetStart() { - return (int) ( System.currentTimeMillis() - testSetStartAt ); + if ( testSetStartAt > 0 ) + { + return (int) ( System.currentTimeMillis() - testSetStartAt ); + } + else + { + return 0; + } } public int getElapsedSinceLastStart() { - return (int) ( System.currentTimeMillis() - lastStartAt ); + if ( lastStartAt > 0 ) + { + return (int) ( System.currentTimeMillis() - lastStartAt ); + } + else + { + return 0; + } } public void testSetStart() http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/080aa5f6/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire943ReportContentIT.java ---------------------------------------------------------------------- diff --git a/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire943ReportContentIT.java b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire943ReportContentIT.java index 32aedbf..f702999 100644 --- a/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire943ReportContentIT.java +++ b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire943ReportContentIT.java @@ -20,11 +20,11 @@ package org.apache.maven.surefire.its.jiras; */ import java.io.FileNotFoundException; + import org.apache.maven.shared.utils.xml.Xpp3Dom; import org.apache.maven.shared.utils.xml.Xpp3DomBuilder; import org.apache.maven.surefire.its.fixture.OutputValidator; import org.apache.maven.surefire.its.fixture.SurefireJUnit4IntegrationTestCase; - import org.junit.Assert; import org.junit.Test; @@ -49,19 +49,40 @@ public class Surefire943ReportContentIT private void doTest( String parallelMode ) throws Exception { - OutputValidator validator = unpack( "surefire-943-report-content" ) - .maven() - .sysProp( "parallel", parallelMode ) - .sysProp( "threadCount", 4 ) - .withFailure() - .executeTest(); + OutputValidator validator = + unpack( "surefire-943-report-content" ).maven().sysProp( "parallel", parallelMode ).sysProp( "threadCount", + 4 ).withFailure().executeTest(); - validator.assertTestSuiteResults( 9, 0, 3, 3 ); + validator.assertTestSuiteResults( 10, 1, 3, 3 ); validate( validator, "org.sample.module.My1Test", 1 ); validate( validator, "org.sample.module.My2Test", 1 ); validate( validator, "org.sample.module.My3Test", 0 ); validateSkipped( validator, "org.sample.module.My4Test" ); + validateFailInBeforeClass( validator, "org.sample.module.My5Test" ); + } + + private void validateFailInBeforeClass( OutputValidator validator, String className ) + throws FileNotFoundException + { + Xpp3Dom[] children = readTests( validator, className ); + + Assert.assertEquals( 1, children.length ); + + Xpp3Dom child = children[0]; + + Assert.assertEquals( className, child.getAttribute( "classname" ) ); + Assert.assertEquals( className, child.getAttribute( "name" ) ); + + Assert.assertEquals( "Expected error tag for failed BeforeClass method for " + className, 1, + child.getChildren( "error" ).length ); + + Assert.assertTrue( "time for test failure in BeforeClass is expected to be positive", + Double.compare( Double.parseDouble( child.getAttribute( "time" ) ), 0.0d ) >= 0 ); + + Assert.assertTrue( "time for test failure in BeforeClass is expected to be resonably low", + Double.compare( Double.parseDouble( child.getAttribute( "time" ) ), 2.0d ) <= 0 ); + } private void validateSkipped( OutputValidator validator, String className ) http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/080aa5f6/surefire-integration-tests/src/test/resources/surefire-943-report-content/src/test/java/org/sample/module/My1Test.java ---------------------------------------------------------------------- diff --git a/surefire-integration-tests/src/test/resources/surefire-943-report-content/src/test/java/org/sample/module/My1Test.java b/surefire-integration-tests/src/test/resources/surefire-943-report-content/src/test/java/org/sample/module/My1Test.java index 02be450..0d996f4 100644 --- a/surefire-integration-tests/src/test/resources/surefire-943-report-content/src/test/java/org/sample/module/My1Test.java +++ b/surefire-integration-tests/src/test/resources/surefire-943-report-content/src/test/java/org/sample/module/My1Test.java @@ -21,9 +21,6 @@ package org.sample.module; import static org.junit.Assert.fail; -import java.lang.management.ManagementFactory; - -import org.junit.Before; import org.junit.Test; import org.junit.Ignore; http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/080aa5f6/surefire-integration-tests/src/test/resources/surefire-943-report-content/src/test/java/org/sample/module/My2Test.java ---------------------------------------------------------------------- diff --git a/surefire-integration-tests/src/test/resources/surefire-943-report-content/src/test/java/org/sample/module/My2Test.java b/surefire-integration-tests/src/test/resources/surefire-943-report-content/src/test/java/org/sample/module/My2Test.java index cd0d83c..ac4e338 100644 --- a/surefire-integration-tests/src/test/resources/surefire-943-report-content/src/test/java/org/sample/module/My2Test.java +++ b/surefire-integration-tests/src/test/resources/surefire-943-report-content/src/test/java/org/sample/module/My2Test.java @@ -21,9 +21,6 @@ package org.sample.module; import static org.junit.Assert.fail; -import java.lang.management.ManagementFactory; - -import org.junit.Before; import org.junit.Test; import org.junit.Ignore; http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/080aa5f6/surefire-integration-tests/src/test/resources/surefire-943-report-content/src/test/java/org/sample/module/My3Test.java ---------------------------------------------------------------------- diff --git a/surefire-integration-tests/src/test/resources/surefire-943-report-content/src/test/java/org/sample/module/My3Test.java b/surefire-integration-tests/src/test/resources/surefire-943-report-content/src/test/java/org/sample/module/My3Test.java index 6fd712b..0a432e9 100644 --- a/surefire-integration-tests/src/test/resources/surefire-943-report-content/src/test/java/org/sample/module/My3Test.java +++ b/surefire-integration-tests/src/test/resources/surefire-943-report-content/src/test/java/org/sample/module/My3Test.java @@ -21,9 +21,6 @@ package org.sample.module; import static org.junit.Assert.fail; -import java.lang.management.ManagementFactory; - -import org.junit.Before; import org.junit.Test; public class My3Test { http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/080aa5f6/surefire-integration-tests/src/test/resources/surefire-943-report-content/src/test/java/org/sample/module/My4Test.java ---------------------------------------------------------------------- diff --git a/surefire-integration-tests/src/test/resources/surefire-943-report-content/src/test/java/org/sample/module/My4Test.java b/surefire-integration-tests/src/test/resources/surefire-943-report-content/src/test/java/org/sample/module/My4Test.java index b19de37..c500c1e 100644 --- a/surefire-integration-tests/src/test/resources/surefire-943-report-content/src/test/java/org/sample/module/My4Test.java +++ b/surefire-integration-tests/src/test/resources/surefire-943-report-content/src/test/java/org/sample/module/My4Test.java @@ -19,11 +19,6 @@ package org.sample.module; * under the License. */ -import static org.junit.Assert.fail; - -import java.lang.management.ManagementFactory; - -import org.junit.Before; import org.junit.Test; import org.junit.Ignore; http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/080aa5f6/surefire-integration-tests/src/test/resources/surefire-943-report-content/src/test/java/org/sample/module/My5Test.java ---------------------------------------------------------------------- diff --git a/surefire-integration-tests/src/test/resources/surefire-943-report-content/src/test/java/org/sample/module/My5Test.java b/surefire-integration-tests/src/test/resources/surefire-943-report-content/src/test/java/org/sample/module/My5Test.java new file mode 100644 index 0000000..1e30741 --- /dev/null +++ b/surefire-integration-tests/src/test/resources/surefire-943-report-content/src/test/java/org/sample/module/My5Test.java @@ -0,0 +1,39 @@ +package org.sample.module; + +/* + * 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 org.junit.BeforeClass; +import org.junit.Test; + +public class My5Test { + + @BeforeClass + public static void failsOnBeforeClass() + { + throw new RuntimeException("always fails before class"); + } + + @Test + public void neverExecuted() + throws Exception + { + + } +}