XComp commented on code in PR #21289:
URL: https://github.com/apache/flink/pull/21289#discussion_r1297093524


##########
flink-test-utils-parent/flink-test-utils-junit/src/test/java/org/apache/flink/testutils/junit/RetryOnFailureExtensionTest.java:
##########
@@ -21,56 +21,69 @@
 import org.apache.flink.testutils.junit.extensions.retry.RetryExtension;
 
 import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.TestInfo;
 import org.junit.jupiter.api.TestTemplate;
 import org.junit.jupiter.api.extension.ExtendWith;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
+import java.util.HashMap;
+
+import static org.assertj.core.api.Assertions.assertThat;
 
 /** Tests for the {@link RetryOnFailure} annotation on JUnit5 {@link 
RetryExtension}. */
 @ExtendWith(RetryExtension.class)
 class RetryOnFailureExtensionTest {
 
-    private static final int NUMBER_OF_RUNS = 5;
-
-    private static int numberOfFailedRuns;
+    private static final int NUMBER_OF_RETRIES = 5;
 
-    private static int numberOfSuccessfulRuns;
+    private static final HashMap<String, Integer> methodRunCount = new 
HashMap<>();
 
-    private static boolean firstRun = true;
+    @BeforeEach
+    void incrementMethodRunCount(TestInfo testInfo) {
+        // Set or increment the run count for the unit test method, by the 
method short name.
+        // This starts at 1 and is incremented before the test starts.
+        testInfo.getTestMethod()
+                .ifPresent(
+                        method ->
+                                methodRunCount.compute(
+                                        method.getName(), (k, v) -> (v == 
null) ? 1 : v + 1));
+    }
 
     @AfterAll
     static void verify() {
-        assertEquals(NUMBER_OF_RUNS + 1, numberOfFailedRuns);
-        assertEquals(3, numberOfSuccessfulRuns);
+        assertThat(methodRunCount.get("testRetryOnFailure"))

Review Comment:
   I think we can apply the same approach that I described above here. 



##########
flink-test-utils-parent/flink-test-utils-junit/src/test/java/org/apache/flink/testutils/junit/RetryOnExceptionExtensionTest.java:
##########
@@ -37,53 +40,66 @@
 @ExtendWith(RetryExtension.class)
 class RetryOnExceptionExtensionTest {
 
-    private static final int NUMBER_OF_RUNS = 3;
+    private static final int NUMBER_OF_RETRIES = 3;
 
-    private static int runsForSuccessfulTest = 0;
+    private static final HashMap<String, Integer> methodRunCount = new 
HashMap<>();
 
-    private static int runsForTestWithMatchingException = 0;
-
-    private static int runsForTestWithSubclassException = 0;
-
-    private static int runsForPassAfterOneFailure = 0;
+    @BeforeEach
+    void incrementMethodRunCount(TestInfo testInfo) {
+        // Set or increment the run count for the unit test method, by the 
method short name.
+        // This starts at 1 and is incremented before the test starts.
+        testInfo.getTestMethod()
+                .ifPresent(
+                        method ->
+                                methodRunCount.compute(
+                                        method.getName(), (k, v) -> (v == 
null) ? 1 : v + 1));
+    }
 
     @AfterAll
     static void verify() {
-        assertThat(runsForTestWithMatchingException).isEqualTo(NUMBER_OF_RUNS 
+ 1);
-        assertThat(runsForTestWithSubclassException).isEqualTo(NUMBER_OF_RUNS 
+ 1);
-        assertThat(runsForSuccessfulTest).isOne();
-        assertThat(runsForPassAfterOneFailure).isEqualTo(2);
+        assertThat(methodRunCount.get("testSuccessfulTest"))

Review Comment:
   I'm wondering whether we could also implement this test without having plain 
method names that we would have to add everywhere. We could do that by 
utilizing the `TestInfo` parameter in every test method and register the 
callbacks for the corresponding test method. That has the advantage that we 
have the test code in one location (the verification callback is defined within 
the test method instead of the `@AfterAll` annotated method). WDYT?
   
   We would have something like a `verificationCallbackRegistry` next to the 
`methodRunCount` and utilize methods like the following ones:
   ```
       private static int assertAndReturnRunCount(TestInfo testInfo) {
           return methodRunCount.get(assertAndReturnTestMethodName(testInfo));
       }
   
       private static void registerCallbackForTest(TestInfo testInfo, 
Consumer<Integer> verification) {
           verificationCallbackRegistry.putIfAbsent(
                   assertAndReturnTestMethodName(testInfo),
                   () -> 
verification.accept(assertAndReturnRunCount(testInfo)));
       }
   
       private static String assertAndReturnTestMethodName(TestInfo testInfo) {
           return testInfo.getTestMethod()
                   .orElseThrow(() -> new AssertionError("No test method is 
provided."))
                   .getName();
       }
   ```
   
   The testInfo comes from the test method's parameters. All test handling can 
happen within the test method. WDYT?



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to