You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@maven.apache.org by "Bing Xu (Jira)" <ji...@apache.org> on 2024/11/01 03:05:00 UTC
[jira] [Created] (SUREFIRE-2284) Failures or errors in JUnit @BeforeAll will cause Surefire to throw an exception even if the test succeeds in a rerun.
Bing Xu created SUREFIRE-2284:
---------------------------------
Summary: 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
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)