Hello everyone,

... as you know our integration tests are quite essential to ensure that we
are not breaking anything when we try to add new features or fix bugs.
Everyone who contributed to Fineract probably saw the integration tests or
even wrote one as part of their contribution. I guess you agree that
writing those integration tests - at least the way that it's currently done
- is a bit challenging. I'd even say that a bigger problem is to read them.
Even if you are the author then it's really difficult to understand (again)
the purpose and intention of those tests after some time has passed (read:
a year).

The reasons for those difficulties (in my opinion) are:

   - we are writing handcrafted HTTP client code with help of the  REST
   Assured library to issue API requests against a running Fineract instance
   - we do - again - manual JSON parsing... we do already a ton of manual
   JSON parsing in Fineract itself, and now we do pretty much the same thing
   again in the integration tests
   - there is an "air gap" between the test code on the one side and the
   actual business logic that gets executed which makes reading and reasoning
   about those tests a lot more difficult than they should be (you need to run
   a Fineract instance in debug mode, connect an IDE to the remote debug port,
   set breakpoints, execute the integration tests...)

I don't know what your preferences are, but personally I find tests a
valuable source of information when I try to understand a code base or
certain use case... next to any available documentation. Now, we know that
we are a bit thin on useful documentation at the moment (I hope this
changes...) which would mean that the only other source of dense
information are those hard to read/understand integration tests.

This is why I'd like to propose a major improvement in that space:

   - use exclusively the Fineract Java API client to replace handcrafted
   REST Assured code
   - to a small extent we do this (use Fineract client) already, but it's
   still not enough to improve the situation
   - the use of Fineract client brings us type safety again and we don't
   need to manually parse the JSON data (read: reduction of a ton of
   boilerplate code)
   - on top of this we should write the test specifications in Cucumber
   /Gherkin (as we do already with our basic unit tests); these test specs are
   easy to read (even for non-developers) and would allow a bigger audience to
   contribute test cases

Note: the "air gap" issue is not addressed by this proposal, but I think
these improvements are already significant enough. I have an idea for that
too, but this requires more changes that are backwards incompatible with
the current code base.

I've created a pull request that shows how this could look like. Please
have a look at https://github.com/apache/fineract/pull/3821 and let me know
what you think.

Cheers,

Aleks

Reply via email to