apache / beam

Apache Beam is a unified programming model for Batch and Streaming data processing.
https://beam.apache.org/
Apache License 2.0
7.7k stars 4.2k forks source link

[Feature Request]: Better assertion error message for PAssert.thatSingleton #28612

Closed mkuthan closed 1 week ago

mkuthan commented 10 months ago

What would you like to happen?

If element doesn't exist in empty PCollection - PAssert.thatSingleton emits the following error message:

java.util.NoSuchElementException
org.apache.beam.sdk.Pipeline$PipelineExecutionException: java.util.NoSuchElementException
(stack trace)
Caused by: java.util.NoSuchElementException
    at java.base/java.util.ArrayList$Itr.next(ArrayList.java:970)
    at org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.collect.Iterators.getOnlyElement(Iterators.java:309)
    at org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.collect.Iterables.getOnlyElement(Iterables.java:263)
    at org.apache.beam.sdk.testing.PAssert$SingletonCheckerDoFn.processElement(PAssert.java:1613)

If element is not the only element in PCollection - PAssert.thatSingleton emits the following error message:

java.lang.IllegalArgumentException: expected one element but was: (...)
org.apache.beam.sdk.Pipeline$PipelineExecutionException: java.lang.IllegalArgumentException: expected one element but was: (...)
(stack trace)
Caused by: java.lang.IllegalArgumentException: expected one element but was: (...)  at org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.collect.Iterators.getOnlyElement(Iterators.java:323)
    at org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.collect.Iterables.getOnlyElement(Iterables.java:263)
    at org.apache.beam.sdk.testing.PAssert$SingletonCheckerDoFn.processElement(PAssert.java:1613)

For presented scenarios assertion errors doesn't really help - there is no assertion call site info.

private static class SingletonCheckerDoFn ... {
@ProcessElement
    public void processElement(ProcessContext c) {
      ActualT actualContents = Iterables.getOnlyElement(c.element()); // <- runtime exception here
      c.output(doChecks(site, actualContents, checkerFn)); // <- no doCheck call with proper assertion site info
    }
}

Issue Priority

Priority: 3 (nice-to-have improvement)

Issue Components

Amar3tto commented 3 weeks ago

.take-issue