[ 
https://issues.apache.org/jira/browse/SUREFIRE-2284?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17895162#comment-17895162
 ] 

Bing Xu commented on SUREFIRE-2284:
-----------------------------------

Hey Michael, 
I am preparing a PR, but I'm looking for some suggestions about how to best 
approach this. I think this issue may extend to all JUnit annotations 
(`@AfterAll`, etc.) but have not tested with them. Do you have any ideas for a 
fix?

> Failures or errors in JUnit @BeforeAll will cause Surefire to throw an 
> exception even if the test succeeds in a rerun.
> ----------------------------------------------------------------------------------------------------------------------
>
>                 Key: SUREFIRE-2284
>                 URL: https://issues.apache.org/jira/browse/SUREFIRE-2284
>             Project: Maven Surefire
>          Issue Type: Bug
>          Components: Maven Surefire Plugin
>            Reporter: Bing Xu
>            Priority: Major
>
> Hi again from Atlassian
> *Bug description*
> If a Test fails (either *fails* (via an assertion or directly calling fail) 
> or throws an {*}error{*}) in the {{@BeforeAll}} method, the interaction with 
> the {{rerunFailingTestsCount}} property doesn't work properly. Even if the 
> test succeeds in a re-run, the Surefire Mojo will throw an exception and fail 
> the build.
> *Scenario/Steps to reproduce*
> A test fails or throws an exception (error) in the @BeforeAll method on an 
> initial run (Run #1).
> And then succeeds in a subsequent execution (Run #2).
> *Current behaviour*
> The surefire plugin will throw an exception because of the failure/error in 
> the initial run of the test class.
> *Expected behaviour:*
> The build should pass if a subsequent rerun of the test and no exception 
> should be thrown.
> *Root cause*
> The root cause seems to be because surefire has logic to merge the result of 
> multiple runs of the same test inside the following class:
> {code:java}
> maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/DefaultReporterFactory.java{code}
> This class does so by matching test method stats with the same 
> testClassMethodName. This does not work when the test fails in @BeforeAll 
> because the test method name is `null`, so it appears to surefire as if this 
> is a separate method altogether that has never succeeded. 
> This is the problematic part of the code:
> {code:java}
> Map<String, List<TestMethodStats>> mergedTestHistoryResult = new HashMap<>();
> // Merge all the stats for tests from listeners
> for (TestSetRunListener listener : listeners) {
>     for (TestMethodStats methodStats : listener.getTestMethodStats()) {
>         List<TestMethodStats> currentMethodStats =
>                 
> mergedTestHistoryResult.get(methodStats.getTestClassMethodName());
>         if (currentMethodStats == null) {
>             currentMethodStats = new ArrayList<>();
>             currentMethodStats.add(methodStats);
>             mergedTestHistoryResult.put(methodStats.getTestClassMethodName(), 
> currentMethodStats);
>         } else {
>             currentMethodStats.add(methodStats);
>         }
>     }
> } {code}
>  



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to