> Can we write the tests to be agnostic as to whether the service is mocked, faked, or real? Then we can run them in various modes.
Even better. > I'm a strong believer in "fake don't mock" to the extent that I think mocking these might be counterproductive. Fakes are great too. As long as there's an alternative to the real service. On Mon, Dec 7, 2020 at 3:37 PM Kenneth Knowles <k...@apache.org> wrote: > > > On Fri, Dec 4, 2020 at 3:29 PM Brian Hulette <bhule...@google.com> wrote: > >> >> >> On Wed, Dec 2, 2020 at 5:50 PM Brian Hulette <bhule...@google.com> wrote: >> >>> I guess another question I should ask - is :test supposed to only run >>> unit tests? I've been assuming so since many modules have separate >>> :integrationTest tasks for *IT tests. >>> >>> On Wed, Dec 2, 2020 at 4:15 PM Kyle Weaver <kcwea...@google.com> wrote: >>> >>>> > DicomIOTest, FhirIOTest, >>>> HL7v2IOTest, org.apache.beam.sdk.extensions.ml.*IT >>>> >>>> Looking only at the former three tests, I don't see any reason they >>>> can't mock their API clients, especially since all they expect the server >>>> to do is send back an error. >>>> >>> >>> Fair point, that wouldn't be *too* much trouble. More than just >>> re-classifying them as integration tests though :) >>> >> > Can we write the tests to be agnostic as to whether the service is mocked, > faked, or real? Then we can run them in various modes. > > I'm a strong believer in "fake don't mock" to the extent that I think > mocking these might be counterproductive. On a case-by-case basis, perhaps > one can write a tiny in-memory version that has the functionality needed > rather than exact scripted responses. This will interact well with the idea > of making the test unaware of whether it is running against the real > service or not. > > This way we can run a fast (or at least hermetic) version as a unit test > and once in a while sanity check it against the real service. > > (In a perfect world, owners of services would always ship a local testing > fake and own keeping it up to date... testcontainers is one approach but > also in-memory fakes are great) > > Kenn > > >> > This seems like something that is easy to get wrong without some >>>> automation to help. Could we run the :test targets on Jenkins using the >>>> sandbox command or docker to block network access? >>>> >>>> That's a great idea. Are we planning on integrating the "standardized >>>> developer build environment" mentioned in the original post into our CI >>>> somehow? >>>> >>> >>> I was thinking it could be good to use it in CI somehow to make sure it >>> doesn't get out of date, but all I had in mind was running some minimal set >>> of tasks. Using it in this way would obviously be even better. >>> >> >> I filed https://issues.apache.org/jira/browse/BEAM-11404 to track this >> idea. >> >> >>> >>> >>>> >>>> On Wed, Dec 2, 2020 at 4:03 PM Andrew Pilloud <apill...@google.com> >>>> wrote: >>>> >>>>> We have a large number of tests that run pipelines on the Direct >>>>> Runner or various local runners, but don't require network access, so I >>>>> don't think the distinction is clear. I do agree that requiring a remote >>>>> service falls on the integration test side. >>>>> >>>>> This seems like something that is easy to get wrong without some >>>>> automation to help. Could we run the :test targets on Jenkins using the >>>>> sandbox command or docker to block network access? >>>>> >>>>> On Wed, Dec 2, 2020 at 3:38 PM Brian Hulette <bhule...@google.com> >>>>> wrote: >>>>> >>>>>> Sorry I should've included the list of tests here. So far we've run >>>>>> into: >>>>>> DicomIOTest, FhirIOTest, >>>>>> HL7v2IOTest, org.apache.beam.sdk.extensions.ml.*IT >>>>>> >>>>>> Note the latter are called IT, but that package's build.gradle has a >>>>>> line to scoop ITs into the :test task (addressing in [1]). >>>>>> >>>>>> All of these tests are actually running pipelines so I think they'd >>>>>> be difficult to mock. >>>>>> >>>>>> [1] https://github.com/apache/beam/pull/13444 >>>>>> >>>>>> On Wed, Dec 2, 2020 at 3:28 PM Kyle Weaver <kcwea...@google.com> >>>>>> wrote: >>>>>> >>>>>>> > Should we (do we) require unit tests to be hermetic? >>>>>>> >>>>>>> We should. Unit tests are hermetic by definition. That begs the >>>>>>> definition of hermetic, but clearly the internet is not. >>>>>>> >>>>>>> > Personally I think these tests should be classified as integration >>>>>>> tests (renamed to *IT, and run with the :integrationTest task) >>>>>>> >>>>>>> I'm not sure which tests you're talking about, but it may be better >>>>>>> to make them hermetic through mocking, depending on the intent of the >>>>>>> test. >>>>>>> >>>>>>> On Wed, Dec 2, 2020 at 1:22 PM Brian Hulette <bhule...@google.com> >>>>>>> wrote: >>>>>>> >>>>>>>> I've been working with Niels Basjes on a standardized developer >>>>>>>> build environment that can run `./gradlew check` [1]. We've run into >>>>>>>> issues >>>>>>>> because several Java unit tests (class *Test, run with :test) are not >>>>>>>> hermetic. They fail unless the environment they're running in has >>>>>>>> access to >>>>>>>> the internet, and is authenticated to GCP with access to certain >>>>>>>> resources. >>>>>>>> Of course the former isn't typically a blocker, but the latter >>>>>>>> certainly >>>>>>>> can be. >>>>>>>> >>>>>>>> Personally I think these tests should be classified as integration >>>>>>>> tests (renamed to *IT, and run with the :integrationTest task), but I >>>>>>>> realized I don't know if we have a formal definition for what should >>>>>>>> be a >>>>>>>> unit test vs an integration test. Should we (do we) require unit tests >>>>>>>> to >>>>>>>> be hermetic? >>>>>>>> >>>>>>>> Brian >>>>>>>> >>>>>>>> [1] https://github.com/apache/beam/pull/13308 >>>>>>>> >>>>>>>