Add repeated module: @RepeatedTest from JUnit 5 to JUnit 6 (6.1.3, JDK 25)
This commit is contained in:
Executable
+121
@@ -0,0 +1,121 @@
|
||||
#!/usr/bin/env bash
|
||||
# Regenerates every file in docs/output/.
|
||||
#
|
||||
# docs/output/00, 01, 02, 04, 05 come straight from `mvn test` -- the four committed test
|
||||
# classes write them via Capture.write() as a side effect of their own assertions.
|
||||
#
|
||||
# docs/output/03, 06, 07 come from three scratch classes that are deliberately NOT part of the
|
||||
# committed suite (a bogus display-name placeholder, and two deterministic "flaky test" demos).
|
||||
# This script recreates them in a throwaway directory, compiles and runs them against the
|
||||
# JUnit Platform Console Standalone launcher, captures the real output, and cleans up -- so the
|
||||
# committed suite stays green at 14/14 while every number in docs/output/ still traces back to a
|
||||
# real run.
|
||||
#
|
||||
# Requires: JDK 17+ on PATH (JUnit 6 requires Java 17; this module was built on JDK 25), network
|
||||
# access to download the console-standalone jar on first run.
|
||||
|
||||
set -euo pipefail
|
||||
cd "$(dirname "$0")/.."
|
||||
|
||||
JUNIT_VERSION="6.1.3"
|
||||
JAR_DIR="$(mktemp -d)"
|
||||
STANDALONE_JAR="${JAR_DIR}/junit-platform-console-standalone-${JUNIT_VERSION}.jar"
|
||||
trap 'rm -rf "${JAR_DIR}"' EXIT
|
||||
|
||||
echo "== 1/3: committed suite (mvn test) =="
|
||||
mvn -q test
|
||||
mvn test > "${JAR_DIR}/full-run.txt" 2>&1 || true
|
||||
grep -v '^Picked up JAVA_TOOL_OPTIONS' "${JAR_DIR}/full-run.txt" | tail -20 > docs/output/00-full-test-run.txt
|
||||
sed -i '1i# mvn test -- full committed suite (ReliabilityTest, CustomNameTest, LifecycleTest, MetadataTest)\n' docs/output/00-full-test-run.txt
|
||||
|
||||
echo "== 2/3: downloading junit-platform-console-standalone ${JUNIT_VERSION} =="
|
||||
curl -fsSL -o "${STANDALONE_JAR}" \
|
||||
"https://repo1.maven.org/maven2/org/junit/platform/junit-platform-console-standalone/${JUNIT_VERSION}/junit-platform-console-standalone-${JUNIT_VERSION}.jar"
|
||||
|
||||
echo "== 3/3: scratch classes (written, run, captured, discarded) =="
|
||||
SCRATCH_SRC="${JAR_DIR}/scratch-src"
|
||||
SCRATCH_CLASSES="${JAR_DIR}/scratch-classes"
|
||||
PKG_DIR="${SCRATCH_SRC}/com/ankurm/tutorials/junit/repeated"
|
||||
mkdir -p "${PKG_DIR}" "${SCRATCH_CLASSES}"
|
||||
|
||||
cat > "${PKG_DIR}/ScratchPlaceholderTest.java" <<'EOF'
|
||||
package com.ankurm.tutorials.junit.repeated;
|
||||
|
||||
import org.junit.jupiter.api.RepeatedTest;
|
||||
|
||||
class ScratchPlaceholderTest {
|
||||
|
||||
@RepeatedTest(value = 2, name = "{shortDisplayname} test")
|
||||
void bogusPlaceholderTest() {
|
||||
}
|
||||
}
|
||||
EOF
|
||||
|
||||
cat > "${PKG_DIR}/FlakyDetectionDemoTest.java" <<'EOF'
|
||||
package com.ankurm.tutorials.junit.repeated;
|
||||
|
||||
import org.junit.jupiter.api.RepeatedTest;
|
||||
import org.junit.jupiter.api.RepetitionInfo;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.fail;
|
||||
|
||||
class FlakyDetectionDemoTest {
|
||||
|
||||
@RepeatedTest(10)
|
||||
void intermittentRaceCondition(RepetitionInfo info) {
|
||||
int current = info.getCurrentRepetition();
|
||||
if (current == 4 || current == 8) {
|
||||
fail("simulated race condition reproduced on repetition " + current);
|
||||
}
|
||||
}
|
||||
}
|
||||
EOF
|
||||
|
||||
cat > "${PKG_DIR}/FailureThresholdStopsRemainingDemoTest.java" <<'EOF'
|
||||
package com.ankurm.tutorials.junit.repeated;
|
||||
|
||||
import org.junit.jupiter.api.RepeatedTest;
|
||||
import org.junit.jupiter.api.RepetitionInfo;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.fail;
|
||||
|
||||
class FailureThresholdStopsRemainingDemoTest {
|
||||
|
||||
@RepeatedTest(value = 10, failureThreshold = 2)
|
||||
void intermittentRaceCondition(RepetitionInfo info) {
|
||||
int current = info.getCurrentRepetition();
|
||||
if (current == 4 || current == 8) {
|
||||
fail("simulated race condition reproduced on repetition " + current);
|
||||
}
|
||||
}
|
||||
}
|
||||
EOF
|
||||
|
||||
javac -cp "${STANDALONE_JAR}" -d "${SCRATCH_CLASSES}" "${PKG_DIR}"/*.java
|
||||
|
||||
run_scratch() {
|
||||
# These scratch runs are EXPECTED to report test failures (that's the point of 06 and 07),
|
||||
# so capture output via command substitution with `|| true` rather than a raw pipe -- under
|
||||
# `set -o pipefail` a piped non-zero exit from `java` would otherwise abort this script.
|
||||
local class_name="$1" out_file="$2" header="$3" raw_out
|
||||
raw_out="$(java -jar "${STANDALONE_JAR}" execute \
|
||||
-cp "${SCRATCH_CLASSES}" \
|
||||
--select-class="com.ankurm.tutorials.junit.repeated.${class_name}" \
|
||||
--details=tree --disable-ansi-colors 2>&1 || true)"
|
||||
{
|
||||
echo "${header}"
|
||||
echo
|
||||
printf '%s\n' "${raw_out}" | grep -v '^Picked up JAVA_TOOL_OPTIONS'
|
||||
} > "docs/output/${out_file}"
|
||||
}
|
||||
|
||||
run_scratch "ScratchPlaceholderTest" "03-bogus-placeholder-scratch.txt" \
|
||||
"# Scratch run: {shortDisplayname} is not a real placeholder (ScratchPlaceholderTest, removed before commit)"
|
||||
|
||||
run_scratch "FlakyDetectionDemoTest" "06-flaky-detected.txt" \
|
||||
"# Scratch run: @RepeatedTest with no failureThreshold -- all 10 repetitions still run even though 2 fail (FlakyDetectionDemoTest, removed before commit)"
|
||||
|
||||
run_scratch "FailureThresholdStopsRemainingDemoTest" "07-failure-threshold-skips-remaining.txt" \
|
||||
"# Scratch run: @RepeatedTest(failureThreshold = 2) -- after the 2nd failure (repetition 8), repetitions 9 and 10 are SKIPPED, not invoked (FailureThresholdStopsRemainingDemoTest, removed before commit)"
|
||||
|
||||
echo "Done -- docs/output/ regenerated."
|
||||
Reference in New Issue
Block a user