Hi again everyone, Just for the sake of closure, I think everyone is generally in agreement with this approach. If concerns arise later on, please let me know!
Thanks, -John On Fri, Mar 23, 2018 at 12:41 AM, zhenya Sun <toke...@126.com> wrote: > +1 > > 在 2018年3月23日,下午12:20,Ted Yu <yuzhih...@gmail.com> 写道: > > > > +1 > > -------- Original message --------From: "Matthias J. Sax" < > matth...@confluent.io> Date: 3/22/18 9:07 PM (GMT-08:00) To: > dev@kafka.apache.org Subject: Re: Gradle strategy for exposing and using > public test-utils modules > > +1 from my side. > > > > -Matthias > > > > On 3/22/18 5:12 PM, John Roesler wrote: > >> Yep, I'm super happy with this approach vs. a third module just for the > >> tests. > >> > >> For clairty, here's a PR demonstrating the model we're proposing: > >> https://github.com/apache/kafka/pull/4760 > >> > >> Thanks, > >> -John > >> > >> On Thu, Mar 22, 2018 at 6:21 PM, Guozhang Wang <wangg...@gmail.com> > wrote: > >> > >>> I'm +1 to the approach as well across modules that are going to have > test > >>> utils artifacts in the future. To me this seems to be a much smaller > change > >>> we can make to break the circular dependencies than creating a new > package > >>> for our own testing code. > >>> > >>> Guozhang > >>> > >>> On Thu, Mar 22, 2018 at 1:26 PM, Bill Bejeck <bbej...@gmail.com> > wrote: > >>> > >>>> John, > >>>> > >>>> Thanks for the clear, detailed explanation. > >>>> > >>>> I'm +1 on what you have proposed. > >>>> While I agree with you manually pulling in transitive test > dependencies > >>> is > >>>> not ideal, in this case, I think it's worth it to get over the > circular > >>>> dependency hurdle and use streams:test-utils ourselves. > >>>> > >>>> -Bill > >>>> > >>>> On Thu, Mar 22, 2018 at 4:09 PM, John Roesler <j...@confluent.io> > wrote: > >>>> > >>>>> Hey everyone, > >>>>> > >>>>> In 1.1, kafka-streams adds an artifact called > >>> 'kafka-streams-test-utils' > >>>>> (see > >>>>> https://kafka.apache.org/11/documentation/streams/ > >>>>> developer-guide/testing.html > >>>>> ). > >>>>> > >>>>> The basic idea is to provide first-class support for testing Kafka > >>>> Streams > >>>>> applications. Without that, users were forced to either depend on our > >>>>> internal test artifacts or develop their own test utilities, neither > of > >>>>> which is ideal. > >>>>> > >>>>> I think it would be great if all our APIs offered a similar module, > and > >>>> it > >>>>> would all be good if we followed a similar pattern, so I'll describe > >>> the > >>>>> streams approach along with one challenge we had to overcome: > >>>>> > >>>>> ===================== > >>>>> = Project Structure = > >>>>> ===================== > >>>>> > >>>>> The directory structure goes: > >>>>> > >>>>> kafka/streams/ <- main module code here > >>>>> /test-utils/ <- test utilities module here > >>>>> /examples/ <- example usages here > >>>>> > >>>>> Likewise, the artifacts are: > >>>>> > >>>>> kafka-streams > >>>>> kafka-streams-test-utils > >>>>> kafka-streams-examples > >>>>> > >>>>> And finally, the Gradle build structure is: > >>>>> > >>>>> :streams > >>>>> :streams:test-utils > >>>>> :streams:examples > >>>>> > >>>>> > >>>>> ============================= > >>>>> = Problem 1: circular build = > >>>>> ============================= > >>>>> > >>>>> In eat-your-own-dogfood tradition, we wanted to depend on our own > >>>>> test-utils in our streams tests, but :streams:test-utils (obviously) > >>>>> depends on :streams already. > >>>>> > >>>>> (:streams) <-- (:streams:test-utils) > >>>>> \---> > >>>>> > >>>>> Luckily, Filipe Agapito found a way out of the conundrum ( > >>>>> https://issues.apache.org/jira/browse/KAFKA-6474? > >>>>> focusedCommentId=16402326&page=com.atlassian.jira. > >>>>> plugin.system.issuetabpanels:comment-tabpanel#comment-16402326). > >>>>> Many thanks to him for this contribution. > >>>>> > >>>>> * Add this to the ':streams' definition: > >>>>> testCompile project(':streams:test-utils') > .sourceSets.main.output > >>>>> > >>>>> * And this to the ':streams:test-utils' definition: > >>>>> compile project(':streams').sourceSets.main.output > >>>>> > >>>>> * And finally (because we also have tests for the examples), add this > >>> to > >>>>> the ':streams:examples' definition: > >>>>> testCompile project(':streams:test-utils') > >>>>> > >>>>> > >>>>> > >>>>> By scoping the dependencies to 'sourceSets.main', we break the cyclic > >>>>> dependency: > >>>>> > >>>>> (:streams main) <-- (:streams:test-utils main) > >>>>> ^ ^ ^ > >>>>> | / | > >>>>> | / | > >>>>> (:streams test) (:streams:test-utils test) > >>>>> > >>>>> > >>>>> ============================================== > >>>>> = Problem 2: missing transitive dependencies = > >>>>> ============================================== > >>>>> > >>>>> Scoping the dependency to source-only skips copying transitive > library > >>>>> dependencies into the build & test environment, so we ran into the > >>>>> following error in our tests for ':streams:test-utils' : > >>>>> > >>>>> java.lang.ClassNotFoundException: org.rocksdb.RocksDBException > >>>>> > >>>>> This kind of thing is easy to resolve, once you understand why it > >>>> happens. > >>>>> We just added this to the :test-utils build definition: > >>>>> testCompile libs.rocksDBJni > >>>>> > >>>>> It's a little unfortunate to have to manually pull in transitive > >>>>> dependencies for testing, but it's really the only downside of this > >>>>> approach (so far). > >>>>> > >>>>> > >>>>> > >>>>> That's about it! This is partly to propose a similar model across > other > >>>>> parts of Kafka's API and partly to collect feedback on this approach. > >>>>> > >>>>> Thoughts? > >>>>> -John > >>>>> > >>>> > >>> > >>> > >>> > >>> -- > >>> -- Guozhang > >>> > >> > > > >