+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
>>> 
>> 
> 

Reply via email to