Yes, I suggested that. Looking for volunteers to tackle these things.

On Mon, Sep 12, 2016 at 5:44 PM, Pramod Immaneni <pra...@datatorrent.com>
wrote:

> I agree but I think it will also help if we provide more tools in this
> space like providing an operator test driver that goes through the
> lifecycle methods of an operator and offers configurability and variations.
> This driver could be bootstrapped from the unit test. I see the setup,
> beginWindow, process, endWindow and teardown call pattern repeated in many
> unit tests and this can expand to more methods when operator implements
> more interfaces.
>
> Thanks
>
> On Mon, Sep 12, 2016 at 5:26 PM, Thomas Weise <t...@apache.org> wrote:
>
> > Hi,
> >
> > Recently there was a bit of discussion on how to write tests for
> operators
> > that will result in good coverage and high confidence in the results of
> the
> > CI. Experience from past releases show that those operators with good
> > coverage are less likely to break down (with a user) due to subsequent
> > changes, while those that don't have coverage in the CI (think contrib)
> are
> > likely to suffer breakdown even due to trivial changes that are otherwise
> > easily caught.
> >
> > IMO writing good tests is as important as the operator main code (and
> > documentation and examples..). It was also part of the maturity framework
> > that Ashwin proposed a while ago (Ashwin, maybe you can also share a few
> > points). I suggest we expand the contribution guidelines to reflect an
> > agreed set of expectations that contributors can follow when submitting
> PRs
> > or even come up with a checklist for submitting PRs:
> >
> > http://apex.apache.org/malhar-contributing.html
> >
> > Here are a few recurring problems and suggestions in nor particular
> order:
> >
> >    - Unit tests are for testing small pieces of code in isolation
> ("unit").
> >    Running a DAG in embedded mode is not a unit test, it is an
> integration
> >    test.
> >    - When writing an operator or making changes to fix bugs etc., it is
> >    recommended to write or modify the granular test that exercises this
> > change
> >    and as little as possible around it. This happens before writing or
> > running
> >    an application and can be done in fast iterations inside the IDE
> without
> >    extensive test data setup or application assembly.
> >    - When an operator consists of multiple other components, then testing
> >    for those should also be broken down into units. For example, managed
> > state
> >    is not tested by testing dedup or join operator (which are special use
> >    cases), but through separate tests, that exercise the full spectrum
> (or
> > at
> >    least close to) of managed state.
> >    - So what about serialization, don't I need to create a DAG to test
> it?
> >    You only need Kryo to test serialization of an operator. Use the
> > existing
> >    utilities or contribute to utilities that are shared between tests.
> >    - Don't I need to run a DAG to test the lifecycle of an operator? No,
> >    the sequence of calls to an operator's lifecycle methods are
> documented
> > (or
> >    how else would I implement an operator to start with). There are
> quite a
> >    few tests that "execute" the operator directly. They have access to
> the
> >    state and can assert that with a certain process invocation the
> expected
> >    changes occur. That is much more difficult when running a DAG.
> >    - I have to write a lot of code to do such testing and possibly I will
> >    forget some calls? Not when following test driven development. IMO
> that
> >    mostly happens when tests are written as afterthought and that's a
> > waste of
> >    time. I would suggest though to develop a single operator test driver
> > that
> >    will ensures all methods are called for basic sanity check.
> >    - Integration tests: with proper unit test coverage, the integration
> >    test is more like an example of how to use an operator. Nice for
> users,
> >    because they can use it as a starting point for writing their own app,
> >    including the configuration.
> >    - I wrote a nice integration test app with configuration. It runs  for
> >    exactly <n> seconds (localmode.run(n)) returns and all looks green. It
> > even
> >    prints some nice stuff in the console. What's wrong? You have not
> tested
> >    anything! An operator may fail in setup and the test still passes.
> > Travis
> >    CI is not reading the console (instead, it will complain that tests
> are
> >    filling up 4MB too fast and really important logs go under). Instead,
> >    assert on your test code that the DAG execution produces the expected
> >    results. Instead of waiting for <n> seconds wait until expected
> results
> > are
> >    in and cap it with a timeout. This is yet another area where a few
> >    utilities for recurring test code will come in handy.
> >    - Tests sometimes fail, but they work on my local machine? Every
> >    environment is different and good tests don't depend on environment
> >    specific factors (timing dependency, excessive resource utilization
> > etc.).
> >    It is important that tests pass in the CI consistently and that issues
> >    found there are investigated and fixed. Isn't it nice to see the green
> >    check mark in the PR instead of having to close/reopen several times
> so
> >    that the unrelated flaky test does not fail. If we collectively track
> > and
> >    fix such failures life will be better for everyone.
> >
> > Looking forward to feedback, additions and most importantly volunteers
> that
> > will help making the Apex CI better.
> >
> > Thanks,
> > Thomas
> >
>

Reply via email to