gbaldeck
09/02/2026, 8:45 PMjoffrey
09/02/2026, 8:49 PMjoffrey
09/02/2026, 8:50 PMOliver.O
09/02/2026, 8:53 PMgbaldeck
09/02/2026, 9:03 PMkotlin test -p jvm is not discovering my TestBalloon tests. I am getting the below error
ERROR: JVM tests failed for module 'shared-frontend' with exit code 2 (no tests were discovered) (see errors above)gbaldeck
09/02/2026, 9:04 PMgbaldeck
09/02/2026, 9:06 PMgbaldeck
09/02/2026, 9:18 PMOliver.O
09/02/2026, 9:20 PMjoffrey
09/02/2026, 9:20 PMjoffrey
09/02/2026, 9:21 PMtestBalloon-framework-core or is it a separate dependency?Oliver.O
09/02/2026, 9:22 PMtestBalloon-framework-core.joffrey
09/02/2026, 9:51 PMOliver.O
09/02/2026, 9:58 PMtest-settings:
jvm:
test:
extraEnvironment:
- TESTBALLOON_INCLUDE_PATTERNS: '*'
Without that setting, TestBalloon presumably receives an unexpected "test discovery request" via JUnit Platform, leading it to believe that tests were requested for a different "test engine", and not try to run them on its own.
My entire module was looking like this:
product:
type: lib
platforms:
- jvm
# - linuxX64
# - android
settings@android:
junit: junit-4
test-dependencies:
- de.infix.testBalloon:testBalloon-framework-core:1.1.0-RC
test-settings:
jvm:
test:
extraEnvironment:
- TESTBALLOON_INCLUDE_PATTERNS: '*'
kotlin:
version: 2.4.10
compilerPlugins:
- id: de.infix.testBalloon
dependency: de.infix.testBalloon:testBalloon-compiler-plugin:1.1.0-RCjoffrey
09/02/2026, 10:02 PMtest command. We have --include-test, --include-classes, --include-tag there, but they are all passed to JUnitjoffrey
09/02/2026, 10:02 PMOliver.O
09/02/2026, 10:16 PMTESTBALLOON_INCLUDE_PATTERNS and TESTBALLOON_EXCLUDE_PATTERNS. if TESTBALLOON_INCLUDE_PATTERNS is present, TestBalloon will know that it is in charge, so setting it to a wildcard * makes tests work. For Gradle, the TestBalloon Gradle plugin takes the argument of --tests and passes its value unchanged to TESTBALLOON_INCLUDE_PATTERNS. The format is documented here: infix-de.github.io/testBalloon/dev/getting-started/integration#…
Of course, we could also agree on a different protocol, like the `UriSelector`.Oliver.O
09/02/2026, 10:48 PMgbaldeck
09/03/2026, 12:55 AMgbaldeck
09/03/2026, 1:19 AMkotlin test -p jvm . If you run the same you should see ERROR: JVM tests failed for module 'shared-frontend' with exit code 2 (no tests were discovered) (see errors above) .
The shared-frontend module is where the TestBalloon tests are. Its module.yaml file inherits cmp.module-template.yaml . Each module file inherits from a template.
My base.module-template.yaml is where TestBalloon is setup. Then ai.module-template.yaml inherits from the base template. Then cmp.module-template.yaml inherits from the ai template.gbaldeck
09/03/2026, 1:23 AMshared-frontend module. That also didn't work when running the test command, including the TESTBALLOON_INCLUDE_PATTERNS environment variable, and setting the platform to JVM.Oliver.O
09/03/2026, 7:44 PMshared-frontend without templates, then add a single template, ..., and then see where it breaks.
One thing that might help is turning on the TestBalloon compiler plugin's debug logging option by setting debugLevel: BASIC. The full set of settings would look like this:
test-settings:
jvm:
test:
extraEnvironment:
- TESTBALLOON_INCLUDE_PATTERNS: '*'
kotlin:
version: 2.4.10
compilerPlugins:
- id: de.infix.testBalloon
dependency: de.infix.testBalloon:testBalloon-compiler-plugin:1.1.0-RC
options:
debugLevel: BASIC
You should then expect to see messages like this on the console (the ERROR tag can be ignored):
ERROR warning: plugin de.infix.testBalloon: [DEBUG] using compiler adapter 2.4.0 for Kotlin compiler 2.4.10
ERROR warning: plugin de.infix.testBalloon: [DEBUG] version 1.1.0-RC is processing module <usingTestBalloon_test>.
ERROR .../kotlin-toolchain-arena/usingTestBalloon/test/CommonTestBalloon.kt:1:1: warning: plugin de.infix.testBalloon: [DEBUG] Analyzing source file.
ERROR de/infix/testBalloon/framework/shared/internal/entryPoint/__GENERATED__CALLABLES__.kt: warning: plugin de.infix.testBalloon: [DEBUG] Analyzing source file.
✓ Compilation successful for 'usingTestBalloon' [linuxX64 tests]
WARNING: Plugin de.infix.testBalloon: [DEBUG] version 1.1.0-RC is processing module <usingTestBalloon_test>.
WARNING: Plugin de.infix.testBalloon: [DEBUG] using compiler adapter 2.4.0 for Kotlin compiler 2.4.10
WARNING: Plugin de.infix.testBalloon: [DEBUG] Integrating with JUnitgbaldeck
09/03/2026, 8:06 PMOliver.O
09/04/2026, 2:16 PMlibs.versions.toml declared a Gradle plugin
test-balloon-plugin = { module = "de.infix.testBalloon:de.infix.testBalloon.gradle.plugin", version.ref = "testBalloon"}
when it should have declared a compiler plugin
test-balloon-plugin = { module = "de.infix.testBalloon:testBalloon-compiler-plugin", version.ref = "testBalloon"}Oliver.O
09/04/2026, 2:40 PMjoffrey
09/04/2026, 8:29 PMjoffrey
09/04/2026, 8:31 PM-Xplugin for each JAR, so potentially several -Xplugin for a single compiler plugin). Maybe in the future we'll get a new compiler argument that takes the whole little classpath for each compiler plugin independently, and then it could warn or fail if there are 0 plugins in one of these little classpaths.Oliver.O
09/04/2026, 8:37 PMMETA-INF.services resource of org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar at some point.joffrey
09/04/2026, 8:51 PMjoffrey
09/04/2026, 8:52 PMOliver.O
09/04/2026, 8:55 PMjoffrey
09/04/2026, 10:05 PMOliver.O
09/05/2026, 10:03 PMThis is exactly the kind of friction we want to eliminate if we can help it.I love that stance!