0.9.0
Changelog:
The API freeze ahead of 1.0. The supported surface is now sealed by the compiler rather than by convention. See COMPATIBILITY.md for the policy and support matrix.
Added:
@Epic. Class or method level, rendered beside issues, filterable withepic:in the report. (#194)- Report overview page. A landing view per source with result, tag, package, epic/issue, duration, failure, interaction and density panels, every segment a filter. Shows wall clock vs total elapsed so you can see what parallel execution saves. (#195)
indices.jsongains per-testepics,timing,interactions,participants,assertionsandexpandablesfields, additive.- Replay links on issue badges. When a report is served with a
replayUrlin its manifest, issue badges gain a replay glyph and a right-click menu offering the issue tracker and Replay filtered to that issue. Reports without the key render exactly as before. @KensaInternalApiand@KensaExperimental. The first marks plumbing that is public only because Kensa spans Gradle modules: do not call it. The second marks features still being designed and open to feedback, currently the org-flow surfaces only.COMPATIBILITY.md. What semver covers, what the two markers exclude, and the support matrix of Kensa version against required Kotlin and minimum JDK.
Breaking:
- Implementation packages are now
internal:dev.kensa.parse,dev.kensa.state,dev.kensa.output,dev.kensa.service,dev.kensa.utiland the implementation parts ofdev.kensa.context. The documented API is unaffected.internalhas no bytecode equivalent, so Java consumers are not blocked from these types, but they are equally unsupported. - Upgrade core and the framework adapters together. Kotlin mangles the JVM names of
internalfunctions, so a 0.9.0 core with an olderkensa-junit5/kensa-testng/kensa-kotestcan fail at runtime rather than at compile time. findAnnotationNamesmoved to a top-leveldev.kensa.parse.kotlin.findAnnotationNames;KotlinParserDelegate.Companionis nowinternal. Affects custom framework adapters only.@KensaInternalApiis an error, not a warning. The integration SPI (FrameworkDescriptor,KensaLifecycleManager, the invocation-context hooks) now requires@file:OptIn(dev.kensa.KensaInternalApi::class).Configuration.issueTrackerUrlis nowURL?defaulting tonull, replacing ahttp://emptysentinel. Reading the property in Kotlin needs a null check;withIssueTrackerUrlis unchanged.
Fixes:
- Parallel invocations of the same test method no longer lose data. The shared
TestMethodContainerheld non-concurrent collections, so parallel parameterised invocations could fail with aNoSuchElementExceptionorNullPointerException. Both collections are now concurrent. - Registered value renderers are no longer bypassed for parameterised test arguments. The display-name label substitution ran before renderers; a registered
ValueRenderernow wins (#189). - Empty string parameters render as
""instead ofnullin the invocation parameter matrix (#185, thanks to Michael Orr). - An unconfigured issue tracker no longer renders dead links. The sentinel default made
@Issuebadges link tohttp://empty/PROJ-123. The property is now omitted from the report config when unset, and reports written by earlier versions stop linking too (#191). kensa.disable.outputhonours every value. Only a bare flag or=truedisabled output;=1,=yesand the rest silently did nothing. Any value now disables, with=falseas the escape hatch (#192).- Fixtures and outputs resolve inside polling blocks. Multi-assertion
thenEventually { }andthenContinually { }run each check on another thread, which lost the test context, soby fixtures(...)delegates andThenSpecoutputs resolved to nothing inside a block. Hamkrest's single-assertionthenEventuallylost it too, via Awaitility (#190).
Changed:
keyWordsis nowkeywordsin the DSL, matching the builder'swithKeywords.keyWordsremains as a deprecation (#193).- The Java builder reaches everything the Kotlin DSL does.
KensaConfiguratorgainswithTitleText,withAntlrPredicationModeandwithAntlrErrorListenerDisabled(#193). sectionOrdervalidates against theSectionenum. EachSectionexactly once, and the error reports the rejected order (#193).- Tab services are supported API.
Configuration.registerTabServiceandKensaTabServicesno longer need an experimental opt-in. TestContextandTestContextHolderare stable, documented as frozen rather than disclaimed in prose.