Thursday, October 5, 2023

Show HN: Decorate Java stack traces with source code snippets

Maven Central

The goal of this project is to decorate stack traces of test failures to make them more useful.

So instead of getting this when a test fails:

org.opentest4j.AssertionFailedError: expected: <hello> but was: <hi>
        at org.junit...
        at com.example.MyTest.hello(MyTest.java:24)
        ...

You'll get this:

org.opentest4j.AssertionFailedError: expected: <hello> but was: <hi>
        at org.junit...
        at com.example.MyTest.hello(MyTest.java:24)

           22    @Test
           23    void compareStrings() {
        -> 24      assertEquals("hello", "hi");
           25    }

        ...

In both your IDE and build server test reports. Also works for other JVM languages.

Requires Java 11.

dependencies {
  // For JUnit 5
  testImplementation("nz.lae.stacksrc:stacksrc-junit5:${stacksrc.version}")
  // For JUnit 4
  testImplementation("nz.lae.stacksrc:stacksrc-junit5:${stacksrc.version}")
}
<dependency>
  <groupId>nz.lae.stacksrc</groupId>
  <artifactId>stacksrc-junit5</artifactId> <!-- For JUnit 5 -->
  <artifactId>stacksrc-junit4</artifactId> <!-- For JUnit 4 -->
  <version>${stacksrc.version}</version>
  <scope>test</scope>
</dependency>

For JUnit 5, you can enable automatic extension detection by setting the system property junit.jupiter.extensions.autodetection.enabled=true on your build, then no other change will be needed for this to work.

If you don't want to enable automatic extension detection, you can wire things up manually using either JUnit's @ExtendWith or @RegisterExtension like the following, then all tests inheriting BaseTest will have their stack traces decorated on failure:

@ExtendWith(ErrorDecorator.class)
class BaseTest {
}

class MyTest extends BaseTest {
  @Test
  void myTest() {
    // ...
  }
}

For JUnit 4, create a base test with a test rule, then all tests inheriting BaseTest will have their stack traces decorated on failure:

public class BaseTest {
  @Rule
  public final ErrorDecorator errorDecorator = new ErrorDecorator();
}

public final class MyTest extends BaseTest {
  @Test
  public void myTest() {
    // ...
  }
}


from Hacker News https://ift.tt/6HA1Uve

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.