apache / apache/grails-core

Jupiter engine is not on the test runtime classpath by convention, so a module can silently run zero tests

Open Beginner friendly
#16,289 5 comments 0 reactions 0 assignees View on GitHub
Dominant language
Groovy
Stars
2.9k
Forks
975
Avg merge
1d 22h
Merged PRs (30d)
92

Description

Split out from review discussion on https://github.com/apache/grails-core/pull/16281.

## Problem

`gradle/test-config.gradle` adds `testRuntimeOnly 'org.junit.platform:junit-platform-launcher'` and calls `useJUnitPlatform()`, but never adds `org.junit.jupiter:junit-jupiter-engine`.

Without the engine on the test runtime classpath, JUnit 5 tests are not discovered — and the build does not fail. The test task reports `BUILD SUCCESSFUL` while executing zero tests.

This was found in `grails-gsp/grails-taglib`, whose only JUnit 5 test (`GroovyPageAttributesTests`) had never executed. Reverting just the one-line engine addition in that module reproduces it: `:grails-taglib:test` succeeds and discovers nothing.

## Why it usually works

Every other module with JUnit 5 tests receives the engine only *transitively*, via `runtimeOnly 'org.junit.jupiter:junit-jupiter-engine'` in `grails-testing-support-core`. The six modules that declare `junit-jupiter-api` without an explicit engine all resolve it that way today. If that transitive edge is ever narrowed, the same silent-skip returns in those modules with a green build.

## Suggested fix

Add the Jupiter engine to the `gradle/test-config.gradle` convention alongside the platform launcher, so no module can silently skip its JUnit 5 tests, and drop the now-redundant module-local declaration in `grails-gsp/grails-taglib/build.gradle`.

Worth considering alongside this: a guard that fails the build when a test task discovers zero tests in a module that has test sources, so this class of problem cannot be green again.

The module-local fix landed in #16281 to unblock that PR; this issue tracks the convention-level fix.

Contributor guide

Open the contributing guide

Research direction

Start with gradle/test-config.gradle and compare it with grails-gsp/grails-taglib/build.gradle, then run :grails-taglib:test to reproduce the silent zero-test result. The convention should provide the Jupiter engine while the redundant module-local declaration is removed, and the JUnit 5 test should be discovered and executed.

Written by the indexing model from the issue text.

Assessment

Domain
build-system, testing
Issue type
Bug
Difficulty
2/5
Estimated time
1-3 hours
Activity status
Active
Clarity
Clearly specified
Newbie friendliness
78/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.