radarsh / gradle-test-logger-plugin

A Gradle plugin for printing beautiful logs on the console while running tests
Apache License 2.0
835 stars 36 forks source link

add an option to show test failures in summary #305

Open christophsturm opened 1 year ago

christophsturm commented 1 year ago

It would be really cool if there was an option to show a list of the test failures again in the summary.

for example in my tests suite a test failure looks like this:

> Task :failgood:test FAILED

  SuiteResult > when there are failing contexts ✔ allOk is false
  Until ✔ is NotIgnored before now
  Until ✔ returns a reason after now
  a test context returned by a function ✔ describes behavior
  a test context ✔ can tell its name with path
  test context defined in a kotlin object ✔ describes behavior
  Suite ✔ Empty Suite fails
  test context declared on top level ✔ is also a nice way to define your test context
  test context defined in a kotlin class ✔ describes behavior
  Suite ✔ Suite {} creates a root context
  a test context ✔ can be created from a path
  a test context ✔ parents is ordered
  The describe top level method ✔ creates a context named '<className>' when called with a class
  RootContext ✔ knows its file and line number
  ObjectContextProvider ✔ provides a context from an class in a kotlin class (MyTest::class.java)
  ContextTreeReporter ✔ outputs test results in tree form
  ObjectContextProvider ✔ provides a context from an object in a java class (MyTest::class.java)
  ContextTreeReporter ✔ outputs empty root context
  ObjectContextProvider ✔ provides a context from an object in a kotlin class (MyTest::class)
  ContextTreeReporter ✔ outputs empty context
  ContextTreeReporter ✔ outputs time
  ObjectContextProvider ✔ provides a list of contexts from an object in a kotlin class (MyTest::class)
  Error Handling > Non deterministic test names ✔ make their test count as failed
  ObjectContextProvider ✔ provides a top level context from a kotlin class
  test isolation for root contexts > in the default isolation mode (full isolation) ✔ test dependencies are recreated for each test
  SingleTestExecutor > test execution ✔ executes a single test
  ObjectContextProvider > correcting source info ✔ corrects the root context source info if its not coming from the loaded class
  SingleTestExecutor > test execution ✔ executes a nested single test
  SingleTestExecutor ✔ also supports describe / it
  test isolation for root contexts > in the default isolation mode (full isolation) ✔ passes testInfo and success to afterEach
  SingleTestExecutor > error handling ✔ reports exceptions in the context as test failures
  test finder ✔ can find Test classes
  ObjectContextProvider > correcting source info ✔ does not touch the source info if it comes from the loaded class
  SingleTestExecutor > error handling ✔ reports exceptions in the autoclose lambda as test failures
  test isolation for root contexts > a root context with isolation set to false ✔ runs tests without recreating the dependencies
  ObjectContextProvider > Error handling ✔ throws when a class contains no contexts
  ContextVisitor<*> ✔ can be easily created
  test isolation for root contexts > a root context with isolation set to false ✔ passes testInfo and success to afterEach
  FailGoodJunitTestEngine ✔ parses a filter string
  ObjectContextProvider > Error handling ✔ wraps exceptions that happen at class instantiation: ClassThatThrowsAtCreationTime
  ContextDSL::describe ✔ works for class
  junit platform observations > UniqueId ✔ replaces + with space when parsing
  Error Handling ✔ tests with wrong receiver
  ObjectContextProvider > Error handling ✔ wraps exceptions that happen at class instantiation: ClassThatThrowsAtContextGetter
  ObjectContextProvider > Error handling ✔ gives a helpful error when a class could not be instantiated
  ObjectContextProvider > Error handling ✔ ignores private classes
  the ContextFinder ✔ finds a single test with a uniqueId selector
  the ContextFinder ✔ does not run a class that has no failgood test annotation
  The Junit Platform Engine - works with Blockhound installed
  Suite > coroutine scope ✔ does not wait for tests before returning context info
  Suite > error handling ✔ treats errors in getContexts as failed context
  The Junit Platform Engine ✘ can execute a simple test defined in an object

    java.lang.AssertionError: Assertion failed
        at failgood.junit.it.JunitPlatformFunctionalTest$context$1$1.invokeSuspend(JunitPlatformFunctionalTest.kt:43)
        at failgood.junit.it.JunitPlatformFunctionalTest$context$1$1.invoke(JunitPlatformFunctionalTest.kt)
        at failgood.junit.it.JunitPlatformFunctionalTest$context$1$1.invoke(JunitPlatformFunctionalTest.kt)
        at failgood.internal.execution.context.ContextStateCollector$executeTest$1$testResult$1.invokeSuspend(ContextStateCollector.kt:59)
        at failgood.internal.execution.context.ContextStateCollector$executeTest$1$testResult$1.invoke(ContextStateCollector.kt)
        at failgood.internal.execution.context.ContextStateCollector$executeTest$1$testResult$1.invoke(ContextStateCollector.kt)
        at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturnIgnoreTimeout(Undispatched.kt:100)
        at kotlinx.coroutines.TimeoutKt.setupTimeout(Timeout.kt:146)
        at kotlinx.coroutines.TimeoutKt.withTimeout(Timeout.kt:44)
        at failgood.internal.execution.context.ContextStateCollector$executeTest$1.invokeSuspend(ContextStateCollector.kt:56)
        at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
        at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
        at java.base/java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1395)
        at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373)
        at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182)
        at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655)
        at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622)
        at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165)

  FailGoodTestPluginFactory ✔ provides description and name
  createResponse > contexts ✔ creates friendly uniqueid for a root context
  FailGoodTestPluginFactory > test framework configuration ✔ returns a suite object that returns no suites
  FailGoodTestPluginFactory > test framework configuration ✔ returns the TestUnitFinder
  createResponse > contexts ✔ creates friendly uniqueid for a sub context
  new mock syntax ✔ looks like this
  soft assert syntax ✔ could look like this
  Error Handling ✔ handles errors in resource correctly
  closing test resources > autoclosable ✔ is closed in reverse order of creation
  closing test resources > autoclosable ✔ closes autocloseables without callback
  createResponse ✔ creates friendly uuids for tests
  createResponse > failed contexts ✔ creates a test node with friendly uniqueid for a failed root context
  AssertHelpers > containsExactlyInAnyOrder > simple ✔ returns true when the elements are the same
  AssertHelpers > containsExactlyInAnyOrder > simple ✔ returns true false the elements are not the same
  AssertHelpers > containsExactlyInAnyOrder > with a class that does not implement comparable ✔ works with list
  AssertHelpers > containsExactlyInAnyOrder > with a class that does not implement comparable ✔ works with vararg
  AssertHelpers > endsWith ✔ works with list
  AssertHelpers > endsWith ✔ works with vararg
  another test context defined in a kotlin class ✔ describes behavior
  first of multiple contexts defined in one object ✔ describes behavior
  examples for the test context dsl ✔ published println calls in the junit runner
  retryFor ✔ can call suspend functions
  FailGoodJunitTestEngine > can discover tests ✔ returns a root descriptor
  FailGoodTestUnitFinder ✔ creates a test unit for each test
  closing test resources > autoclosable ✔ works inside a test
  closing test resources > autoclosable > error handling > when the test fails and autoclose and aftereach work ✔ calls autoclose callbacks
  Root Context Order ✔ is determined by the order field low to high
  the ContextFinder > test filtering ✔ supports a classpathRootSelector with a package filter
  the ContextFinder > parsing unique id selectors ✔ works when the root contexts contains brackets
  a coroutine scope inside failgood tests ✔ works as expected
  nice toString functions ✔ ktype has a niceString function
  Injecting Test Dependencies ✔ the context can create test dependencies
  sub context isolation > on a root context with default isolation (true) > turning off isolation for a subcotext ✔ executes all the tests in that context in one go
  Given support > error handling ✔ treats errors in the given block as test failures
  ExceptionPrettyPrinter ✔ pretty prints the exception with stack trace
  Given support ✔ passes the value of the contests given block to the test
  ExceptionPrettyPrinter ✔ shortens the stack trace
  ExceptionPrettyPrinter ✔ shows only stack trace lines for assertion errors that are in the test file
  Junit4Reporter ✔ reports test results
  ResourcesCloser > closeAutoCloseables ✔ closes autoclosables
  ResourcesCloser > callAfterEach ✔ calls afterEach
  ResourcesCloser > callAfterEach > error handling ✔ calls all after each methods even if one fails
  ResourcesCloser > callAfterEach > error handling ✔ throws the first exception  when multiple afterEach callbacks fail
  StringListTestFilter ✔ executes a path that leads to a context
  StringListTestFilter ✔ executes a parent of the context
  StringListTestFilter ✔ does not execute a different path
  StringListTestFilter ✔ executes a root context when the path fits
  StringListTestFilter ✔ does not execute a root context when the path is different
  TestDSL ✔ publishes a test event for stdout printing
  TestDSL ✔ replaces an empty test event to make junit happy
  TestDSL ✔ tells the name of the test
  ResourcesCloser ✔ handles errors in dependency block
  the mocking framework > records function calls ✔ verifies function calls
  the mocking framework > records function calls ✔ throws when a verified function was not called
  the mocking framework ✔ can return function calls for normal asserting
  the mocking framework ✔ has call helpers for up to 5 parameters
  the mocking framework ✔ has suspend call helpers for up to 5 parameters
  the mocking framework ✔ returns something useful as response to toString
  the mocking framework > records function parameters ✔ verifies function parameters
  the mocking framework > supports suspend functions ✔ verifies suspend functions
  sub context isolation > on a root context with default isolation (true) > turning off isolation for a subcotext ✔ does not affect other contexts
  the mocking framework > supports suspend functions ✔ throws when parameters don't match
  the mocking framework > defining results > with the ✔ defines results via calling the mock
  the mocking framework > defining results > with the ✔ defines results via calling the mock even works for nullable functions
  the mocking framework > defining results > with the ✔ mocks can throw
  the mocking framework > handles equals correctly ✔ returns true for equals with the same mock
  the mocking framework > handles equals correctly ✔ returns false for equals with a different object
  closing test resources > autoclosable > error handling > when the test fails and autoclose and aftereach work ✔ calls afterEach callbacks
  The Junit Platform Engine ✔ can execute a simple test defined in a class
  the mocking framework > defining results ✔ can be done when the mock is created
  the mocking framework > error handling ✔ detects when the parameter to the is not a mock
  second of multiple contexts defined in one object ✔ describes behavior
  ContextExecutor > with a valid root context > executing all the tests ✔ returns deferred test results
  ContextExecutor > with a valid root context > executing all the tests ✔ returns tests in the same order as they are declared in the file
  the mocking framework > parameter placeholders ✔ exist for all basic kotlin types
  ContextExecutor > with a valid root context > executing all the tests ✔ returns contexts in the same order as they appear in the file
  ContextExecutor ✔ handles failing root contexts
  sub context isolation > on a root context with default isolation (true) > turning off isolation for a subcotext ✔ calls the given for each test
  retryFor ✔ rethrows exception when time is up
  sub context isolation > on a root context with default isolation (true) > error handling ✔ does not allow to turn isolation on when it was already off
  FailGoodJunitTestEngine > can discover tests ✔ returns all root contexts
  retryFor ✔ retries at least once
  ContextExecutor > with a valid root context > executing all the tests ✔ reports time of successful tests
  ContextExecutor > with a valid root context > executing a subset of tests ✔ does not execute the context at all if the root name does not match
  ContextExecutor > with a valid root context > executing all the tests > reports failed tests ✔ reports exception for failed tests
  ContextExecutor > with a valid root context > reports line numbers ✔ returns file info for all subcontexts
  closing test resources > autoclosable > error handling ✔ reports the test failure even when the close callback fails too
  closing test resources > autoclosable > error handling > when the test fails and aftereach fails ✔ calls autoclose callbacks
  ContextExecutor > with a valid root context > reports line numbers ✔ returns line number for contexts
  closing test resources > autoclosable > error handling > when the test fails and autoclose and aftereach work ✔ reports the test failure
  ContextExecutor > with a valid root context > executing a subset of tests ✔ can execute a subset of tests
  ContextExecutor > with a valid root context > reports line numbers ✔ reports file name for all tests
  ContextExecutor > with a valid root context > reports line numbers ✔ reports line number for all tests
  ContextExecutor > supports lazy execution ✔ postpones test execution until the deferred is awaited when lazy is set to true
  closing test resources > autoclosable > error handling > when the test succeeds, autoclose fails and aftereach works ✔ calls autoclose callbacks
  sub context isolation > on a root context with default isolation (true) > turning off isolation for a subcotext ✔ calls callbacks at the correct time
  ContextExecutor > timing ✔ reports context structure before tests finish
  The Junit Platform Engine ✔ executes contexts that contain tests with the same names
  closing test resources > autoclosable > error handling > when the test fails and aftereach fails ✔ calls afterEach callbacks
  FailGoodJunitTestEngine > test execution ✔ starts and stops contexts in the correct order
  closing test resources > autoclosable > error handling > when the test succeeds, autoclose fails and aftereach works ✔ calls afterEach callbacks
  closing test resources > autoclosable > error handling > when the test and autoclose succeeds and aftereach fails ✔ calls autoclose callbacks
  a test suite with 1000 tests in one context ✔ runs pretty fast
  closing test resources > autoclosable > error handling > when the test and autoclose succeeds and aftereach fails ✔ calls afterEach callbacks
  closing test resources > autoclosable > error handling > when the test succeeds, autoclose fails and aftereach works ✔ reports the test failure
  The Junit Platform Engine > duplicate test names ✔ are correctly handled in root contexts
  closing test resources > after suite callback ✔ is called exactly once at the end of the suite, after all tests are finished
  FailGoodJunitTestEngine > test execution ✔ sends one skip event and no start event for skipped tests
  retryFor ✔ retries for given time and returns result when it eventually succeeds
  closing test resources > autoclosable > error handling > when the test fails and aftereach fails ✔ reports the test failure
  The Junit Platform Engine ✔ returns tests in the order that they are declared in the file
  closing test resources > autoclosable > error handling > when the test and autoclose succeeds and aftereach fails ✔ reports the test failure
  closing test resources > after suite callback ✔ can throw exceptions that are ignored
  The Junit Platform Engine > duplicate test names ✔ are correctly handled in sub contexts
  The Junit Platform Engine > error handling ✔ correctly reports exceptions in afterEach as test failures
  The Junit Platform Engine > error handling ✔ correctly handles test that fail in their second pass
  The Junit Platform Engine ✔ returns uniqueIds that it understands (uniqueid round-trip test)
  The Junit Platform Engine > duplicate test names ✔ works even in deeply nested contexts
  The Junit Platform Engine ✔ works for a failing context or root context
  ContextExecutor > when an exception happens inside a subcontext ✔ it is reported as a failing test inside that context
  ContextExecutor > when an exception happens inside a subcontext ✔ reports the context as a context
  ContextExecutor > an ignored sub-context ✔ it is reported as a skipped test inside that context
  ContextExecutor > an ignored sub-context ✔ reports the context as a context
  ContextExecutor > detects duplicated tests ✔ fails with duplicate tests in one context
  ContextExecutor > detects duplicated tests ✔ does not fail when the tests with the same name are in different contexts
  ContextExecutor > detects duplicate contexts ✔ fails with duplicate contexts in one context
  ContextExecutor > detects duplicate contexts ✔ does not fail when the contexts with the same name are in different contexts
  ContextExecutor > filtering by tag - can filter tests in a subcontext
  ContextExecutor > detects duplicate contexts ✔ fails when a context has the same name as a test in the same contexts
  ContextExecutor > handles strange contexts correctly ✔ tests can not contain nested contexts
  ContextExecutor > filtering by tag ✔ can filter tests in the root context by tag
  ContextExecutor > handles strange contexts correctly ✔ a context with only one ignored test
  ContextExecutor > filtering by tag ✔ can filter contexts in the root context by tag

  182 passing (1.5s)
  2 pending
  1 failing

185 tests completed, 1 failed, 2 skipped

so I have to scroll up a lot to find the failure that is mentioned in the summary.

it could instead look like this:

> Task :failgood:test FAILED

  SuiteResult > when there are failing contexts ✔ allOk is false
  Until ✔ is NotIgnored before now
  Until ✔ returns a reason after now
  a test context returned by a function ✔ describes behavior
  a test context ✔ can tell its name with path
  test context defined in a kotlin object ✔ describes behavior
  Suite ✔ Empty Suite fails
  test context declared on top level ✔ is also a nice way to define your test context
  test context defined in a kotlin class ✔ describes behavior
  Suite ✔ Suite {} creates a root context
  a test context ✔ can be created from a path
  a test context ✔ parents is ordered
  The describe top level method ✔ creates a context named '<className>' when called with a class
  RootContext ✔ knows its file and line number
  ObjectContextProvider ✔ provides a context from an class in a kotlin class (MyTest::class.java)
  ContextTreeReporter ✔ outputs test results in tree form
  ObjectContextProvider ✔ provides a context from an object in a java class (MyTest::class.java)
  ContextTreeReporter ✔ outputs empty root context
  ObjectContextProvider ✔ provides a context from an object in a kotlin class (MyTest::class)
  ContextTreeReporter ✔ outputs empty context
  ContextTreeReporter ✔ outputs time
  ObjectContextProvider ✔ provides a list of contexts from an object in a kotlin class (MyTest::class)
  Error Handling > Non deterministic test names ✔ make their test count as failed
  ObjectContextProvider ✔ provides a top level context from a kotlin class
  test isolation for root contexts > in the default isolation mode (full isolation) ✔ test dependencies are recreated for each test
  SingleTestExecutor > test execution ✔ executes a single test
  ObjectContextProvider > correcting source info ✔ corrects the root context source info if its not coming from the loaded class
  SingleTestExecutor > test execution ✔ executes a nested single test
  SingleTestExecutor ✔ also supports describe / it
  test isolation for root contexts > in the default isolation mode (full isolation) ✔ passes testInfo and success to afterEach
  SingleTestExecutor > error handling ✔ reports exceptions in the context as test failures
  test finder ✔ can find Test classes
  ObjectContextProvider > correcting source info ✔ does not touch the source info if it comes from the loaded class
  SingleTestExecutor > error handling ✔ reports exceptions in the autoclose lambda as test failures
  test isolation for root contexts > a root context with isolation set to false ✔ runs tests without recreating the dependencies
  ObjectContextProvider > Error handling ✔ throws when a class contains no contexts
  ContextVisitor<*> ✔ can be easily created
  test isolation for root contexts > a root context with isolation set to false ✔ passes testInfo and success to afterEach
  FailGoodJunitTestEngine ✔ parses a filter string
  ObjectContextProvider > Error handling ✔ wraps exceptions that happen at class instantiation: ClassThatThrowsAtCreationTime
  ContextDSL::describe ✔ works for class
  junit platform observations > UniqueId ✔ replaces + with space when parsing
  Error Handling ✔ tests with wrong receiver
  ObjectContextProvider > Error handling ✔ wraps exceptions that happen at class instantiation: ClassThatThrowsAtContextGetter
  ObjectContextProvider > Error handling ✔ gives a helpful error when a class could not be instantiated
  ObjectContextProvider > Error handling ✔ ignores private classes
  the ContextFinder ✔ finds a single test with a uniqueId selector
  the ContextFinder ✔ does not run a class that has no failgood test annotation
  The Junit Platform Engine - works with Blockhound installed
  Suite > coroutine scope ✔ does not wait for tests before returning context info
  Suite > error handling ✔ treats errors in getContexts as failed context
  The Junit Platform Engine ✘ can execute a simple test defined in an object

    java.lang.AssertionError: Assertion failed
        at failgood.junit.it.JunitPlatformFunctionalTest$context$1$1.invokeSuspend(JunitPlatformFunctionalTest.kt:43)
        at failgood.junit.it.JunitPlatformFunctionalTest$context$1$1.invoke(JunitPlatformFunctionalTest.kt)
        at failgood.junit.it.JunitPlatformFunctionalTest$context$1$1.invoke(JunitPlatformFunctionalTest.kt)
        at failgood.internal.execution.context.ContextStateCollector$executeTest$1$testResult$1.invokeSuspend(ContextStateCollector.kt:59)
        at failgood.internal.execution.context.ContextStateCollector$executeTest$1$testResult$1.invoke(ContextStateCollector.kt)
        at failgood.internal.execution.context.ContextStateCollector$executeTest$1$testResult$1.invoke(ContextStateCollector.kt)
        at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturnIgnoreTimeout(Undispatched.kt:100)
        at kotlinx.coroutines.TimeoutKt.setupTimeout(Timeout.kt:146)
        at kotlinx.coroutines.TimeoutKt.withTimeout(Timeout.kt:44)
        at failgood.internal.execution.context.ContextStateCollector$executeTest$1.invokeSuspend(ContextStateCollector.kt:56)
        at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
        at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
        at java.base/java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1395)
        at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373)
        at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182)
        at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655)
        at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622)
        at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165)

  FailGoodTestPluginFactory ✔ provides description and name
  createResponse > contexts ✔ creates friendly uniqueid for a root context
  FailGoodTestPluginFactory > test framework configuration ✔ returns a suite object that returns no suites
  FailGoodTestPluginFactory > test framework configuration ✔ returns the TestUnitFinder
  createResponse > contexts ✔ creates friendly uniqueid for a sub context
  new mock syntax ✔ looks like this
  soft assert syntax ✔ could look like this
  Error Handling ✔ handles errors in resource correctly
  closing test resources > autoclosable ✔ is closed in reverse order of creation
  closing test resources > autoclosable ✔ closes autocloseables without callback
  createResponse ✔ creates friendly uuids for tests
  createResponse > failed contexts ✔ creates a test node with friendly uniqueid for a failed root context
  AssertHelpers > containsExactlyInAnyOrder > simple ✔ returns true when the elements are the same
  AssertHelpers > containsExactlyInAnyOrder > simple ✔ returns true false the elements are not the same
  AssertHelpers > containsExactlyInAnyOrder > with a class that does not implement comparable ✔ works with list
  AssertHelpers > containsExactlyInAnyOrder > with a class that does not implement comparable ✔ works with vararg
  AssertHelpers > endsWith ✔ works with list
  AssertHelpers > endsWith ✔ works with vararg
  another test context defined in a kotlin class ✔ describes behavior
  first of multiple contexts defined in one object ✔ describes behavior
  examples for the test context dsl ✔ published println calls in the junit runner
  retryFor ✔ can call suspend functions
  FailGoodJunitTestEngine > can discover tests ✔ returns a root descriptor
  FailGoodTestUnitFinder ✔ creates a test unit for each test
  closing test resources > autoclosable ✔ works inside a test
  closing test resources > autoclosable > error handling > when the test fails and autoclose and aftereach work ✔ calls autoclose callbacks
  Root Context Order ✔ is determined by the order field low to high
  the ContextFinder > test filtering ✔ supports a classpathRootSelector with a package filter
  the ContextFinder > parsing unique id selectors ✔ works when the root contexts contains brackets
  a coroutine scope inside failgood tests ✔ works as expected
  nice toString functions ✔ ktype has a niceString function
  Injecting Test Dependencies ✔ the context can create test dependencies
  sub context isolation > on a root context with default isolation (true) > turning off isolation for a subcotext ✔ executes all the tests in that context in one go
  Given support > error handling ✔ treats errors in the given block as test failures
  ExceptionPrettyPrinter ✔ pretty prints the exception with stack trace
  Given support ✔ passes the value of the contests given block to the test
  ExceptionPrettyPrinter ✔ shortens the stack trace
  ExceptionPrettyPrinter ✔ shows only stack trace lines for assertion errors that are in the test file
  Junit4Reporter ✔ reports test results
  ResourcesCloser > closeAutoCloseables ✔ closes autoclosables
  ResourcesCloser > callAfterEach ✔ calls afterEach
  ResourcesCloser > callAfterEach > error handling ✔ calls all after each methods even if one fails
  ResourcesCloser > callAfterEach > error handling ✔ throws the first exception  when multiple afterEach callbacks fail
  StringListTestFilter ✔ executes a path that leads to a context
  StringListTestFilter ✔ executes a parent of the context
  StringListTestFilter ✔ does not execute a different path
  StringListTestFilter ✔ executes a root context when the path fits
  StringListTestFilter ✔ does not execute a root context when the path is different
  TestDSL ✔ publishes a test event for stdout printing
  TestDSL ✔ replaces an empty test event to make junit happy
  TestDSL ✔ tells the name of the test
  ResourcesCloser ✔ handles errors in dependency block
  the mocking framework > records function calls ✔ verifies function calls
  the mocking framework > records function calls ✔ throws when a verified function was not called
  the mocking framework ✔ can return function calls for normal asserting
  the mocking framework ✔ has call helpers for up to 5 parameters
  the mocking framework ✔ has suspend call helpers for up to 5 parameters
  the mocking framework ✔ returns something useful as response to toString
  the mocking framework > records function parameters ✔ verifies function parameters
  the mocking framework > supports suspend functions ✔ verifies suspend functions
  sub context isolation > on a root context with default isolation (true) > turning off isolation for a subcotext ✔ does not affect other contexts
  the mocking framework > supports suspend functions ✔ throws when parameters don't match
  the mocking framework > defining results > with the ✔ defines results via calling the mock
  the mocking framework > defining results > with the ✔ defines results via calling the mock even works for nullable functions
  the mocking framework > defining results > with the ✔ mocks can throw
  the mocking framework > handles equals correctly ✔ returns true for equals with the same mock
  the mocking framework > handles equals correctly ✔ returns false for equals with a different object
  closing test resources > autoclosable > error handling > when the test fails and autoclose and aftereach work ✔ calls afterEach callbacks
  The Junit Platform Engine ✔ can execute a simple test defined in a class
  the mocking framework > defining results ✔ can be done when the mock is created
  the mocking framework > error handling ✔ detects when the parameter to the is not a mock
  second of multiple contexts defined in one object ✔ describes behavior
  ContextExecutor > with a valid root context > executing all the tests ✔ returns deferred test results
  ContextExecutor > with a valid root context > executing all the tests ✔ returns tests in the same order as they are declared in the file
  the mocking framework > parameter placeholders ✔ exist for all basic kotlin types
  ContextExecutor > with a valid root context > executing all the tests ✔ returns contexts in the same order as they appear in the file
  ContextExecutor ✔ handles failing root contexts
  sub context isolation > on a root context with default isolation (true) > turning off isolation for a subcotext ✔ calls the given for each test
  retryFor ✔ rethrows exception when time is up
  sub context isolation > on a root context with default isolation (true) > error handling ✔ does not allow to turn isolation on when it was already off
  FailGoodJunitTestEngine > can discover tests ✔ returns all root contexts
  retryFor ✔ retries at least once
  ContextExecutor > with a valid root context > executing all the tests ✔ reports time of successful tests
  ContextExecutor > with a valid root context > executing a subset of tests ✔ does not execute the context at all if the root name does not match
  ContextExecutor > with a valid root context > executing all the tests > reports failed tests ✔ reports exception for failed tests
  ContextExecutor > with a valid root context > reports line numbers ✔ returns file info for all subcontexts
  closing test resources > autoclosable > error handling ✔ reports the test failure even when the close callback fails too
  closing test resources > autoclosable > error handling > when the test fails and aftereach fails ✔ calls autoclose callbacks
  ContextExecutor > with a valid root context > reports line numbers ✔ returns line number for contexts
  closing test resources > autoclosable > error handling > when the test fails and autoclose and aftereach work ✔ reports the test failure
  ContextExecutor > with a valid root context > executing a subset of tests ✔ can execute a subset of tests
  ContextExecutor > with a valid root context > reports line numbers ✔ reports file name for all tests
  ContextExecutor > with a valid root context > reports line numbers ✔ reports line number for all tests
  ContextExecutor > supports lazy execution ✔ postpones test execution until the deferred is awaited when lazy is set to true
  closing test resources > autoclosable > error handling > when the test succeeds, autoclose fails and aftereach works ✔ calls autoclose callbacks
  sub context isolation > on a root context with default isolation (true) > turning off isolation for a subcotext ✔ calls callbacks at the correct time
  ContextExecutor > timing ✔ reports context structure before tests finish
  The Junit Platform Engine ✔ executes contexts that contain tests with the same names
  closing test resources > autoclosable > error handling > when the test fails and aftereach fails ✔ calls afterEach callbacks
  FailGoodJunitTestEngine > test execution ✔ starts and stops contexts in the correct order
  closing test resources > autoclosable > error handling > when the test succeeds, autoclose fails and aftereach works ✔ calls afterEach callbacks
  closing test resources > autoclosable > error handling > when the test and autoclose succeeds and aftereach fails ✔ calls autoclose callbacks
  a test suite with 1000 tests in one context ✔ runs pretty fast
  closing test resources > autoclosable > error handling > when the test and autoclose succeeds and aftereach fails ✔ calls afterEach callbacks
  closing test resources > autoclosable > error handling > when the test succeeds, autoclose fails and aftereach works ✔ reports the test failure
  The Junit Platform Engine > duplicate test names ✔ are correctly handled in root contexts
  closing test resources > after suite callback ✔ is called exactly once at the end of the suite, after all tests are finished
  FailGoodJunitTestEngine > test execution ✔ sends one skip event and no start event for skipped tests
  retryFor ✔ retries for given time and returns result when it eventually succeeds
  closing test resources > autoclosable > error handling > when the test fails and aftereach fails ✔ reports the test failure
  The Junit Platform Engine ✔ returns tests in the order that they are declared in the file
  closing test resources > autoclosable > error handling > when the test and autoclose succeeds and aftereach fails ✔ reports the test failure
  closing test resources > after suite callback ✔ can throw exceptions that are ignored
  The Junit Platform Engine > duplicate test names ✔ are correctly handled in sub contexts
  The Junit Platform Engine > error handling ✔ correctly reports exceptions in afterEach as test failures
  The Junit Platform Engine > error handling ✔ correctly handles test that fail in their second pass
  The Junit Platform Engine ✔ returns uniqueIds that it understands (uniqueid round-trip test)
  The Junit Platform Engine > duplicate test names ✔ works even in deeply nested contexts
  The Junit Platform Engine ✔ works for a failing context or root context
  ContextExecutor > when an exception happens inside a subcontext ✔ it is reported as a failing test inside that context
  ContextExecutor > when an exception happens inside a subcontext ✔ reports the context as a context
  ContextExecutor > an ignored sub-context ✔ it is reported as a skipped test inside that context
  ContextExecutor > an ignored sub-context ✔ reports the context as a context
  ContextExecutor > detects duplicated tests ✔ fails with duplicate tests in one context
  ContextExecutor > detects duplicated tests ✔ does not fail when the tests with the same name are in different contexts
  ContextExecutor > detects duplicate contexts ✔ fails with duplicate contexts in one context
  ContextExecutor > detects duplicate contexts ✔ does not fail when the contexts with the same name are in different contexts
  ContextExecutor > filtering by tag - can filter tests in a subcontext
  ContextExecutor > detects duplicate contexts ✔ fails when a context has the same name as a test in the same contexts
  ContextExecutor > handles strange contexts correctly ✔ tests can not contain nested contexts
  ContextExecutor > filtering by tag ✔ can filter tests in the root context by tag
  ContextExecutor > handles strange contexts correctly ✔ a context with only one ignored test
  ContextExecutor > filtering by tag ✔ can filter contexts in the root context by tag

  182 passing (1.5s)
  2 pending
  1 failing
  failures:
  The Junit Platform Engine ✘ can execute a simple test defined in an object

    java.lang.AssertionError: Assertion failed
        at failgood.junit.it.JunitPlatformFunctionalTest$context$1$1.invokeSuspend(JunitPlatformFunctionalTest.kt:43)
        at failgood.junit.it.JunitPlatformFunctionalTest$context$1$1.invoke(JunitPlatformFunctionalTest.kt)
        at failgood.junit.it.JunitPlatformFunctionalTest$context$1$1.invoke(JunitPlatformFunctionalTest.kt)
        at failgood.internal.execution.context.ContextStateCollector$executeTest$1$testResult$1.invokeSuspend(ContextStateCollector.kt:59)
        at failgood.internal.execution.context.ContextStateCollector$executeTest$1$testResult$1.invoke(ContextStateCollector.kt)
        at failgood.internal.execution.context.ContextStateCollector$executeTest$1$testResult$1.invoke(ContextStateCollector.kt)
        at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturnIgnoreTimeout(Undispatched.kt:100)
        at kotlinx.coroutines.TimeoutKt.setupTimeout(Timeout.kt:146)
        at kotlinx.coroutines.TimeoutKt.withTimeout(Timeout.kt:44)
        at failgood.internal.execution.context.ContextStateCollector$executeTest$1.invokeSuspend(ContextStateCollector.kt:56)
        at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
        at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
        at java.base/java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1395)
        at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373)
        at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182)
        at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655)
        at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622)
        at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165)

185 tests completed, 1 failed, 2 skipped
albertvaka commented 10 months ago

Any plans on implementing this? It would be a really great addition as it would remove the need to scroll back to find the failures 😄 +1 from my side to this feature 👌

radarsh commented 10 months ago

Yeah, I know how painful it is. I have experienced the same in some big projects where the plugin is used. I am trying to find some time to actively maintain the plugin again.

koppor commented 8 months ago

@radarsh Maybe you could enable GitHub sponsors for you and some of us would donate some money for coffee and other supplies?

albertvaka commented 8 months ago

I would be really happy to have this, so +1 to sponsoring.

albertvaka commented 7 months ago

@radarsh Can you high level describe how this could be implemented (in case you already had some idea)? I might have time to implement this myself soon.