Kyle Sykes created NIFI-5911:
--------------------------------
Summary: Create Integration Test Framework for Flow Developers
Key: NIFI-5911
URL: https://issues.apache.org/jira/browse/NIFI-5911
Project: Apache NiFi
Issue Type: Wish
Components: Tools and Build
Reporter: Kyle Sykes
Attachments: nifi_integrated_testing_sample.png
(Encouraged to post this from the Nifi Slack)
As a flow developer, i would like to be able to test my flows using a
integrated testing approach, rather than unit testing each individual
processor. I currently can guarantee a single processor will work as intended,
but making a change early on in a flow can lead to unanticipated consequences
later on as the flow file gets passed off to other flows for processing.
The basic functionality I'm looking for is generating a series of test flow
files to insert into my pipeline at some step and be able to insert test checks
(akin to assert statements) throughout my flow that are only executed with the
test flow files. Currently, I can implement this using the following workflow
(see attached file for something similar I made a while back to proof of
concept the idea):
# Generate a flow file with a boolean attribute `testFlowFile`.
# Connect the `GenerateFlowFile` processor into a flow where I want to run
some test cases on
# Insert `RouteOnAttribute` FlowFiles that route all test cases to a group of
processors that holds a set of processors that asserts things about the
attributes or content, adding an `testFailed` attribute if any of the test
cases fail
# If `testFailed` is true, then route the FlowFile to a "Failed" location for
further examination by me
# If `testFailed` is false, then route the FlowFile to an Output Port which
inserts it back into the flow to continue down the line.
# Insert `RouteOnAttribute` processors to prevent the test FlowFiles from
inserting the test cases into databases or stop the testing for that particular
flow.
The above causes a large number of extra processors to be created and generally
makes the flows more difficult to understand. My work has me handing of flows
to a client and I like to keep things as understandable as possible and it can
get a little messy.
I envision several ways this could work as an integrated part of Nifi, so I'll
give some thoughts and leave it to the contributors to determine what's
actually feasible/useful.
# A `GenerateTestFile` processor that generates a flow file that internally is
marked as a test FlowFile (probably by an attribute), allowing someone to set
both the attributes and content. The content could be either text (in the case
of JSON) or an external file to be loaded (in cases of binary formats, image,
video, etc).
## This could also extend to a processor that loads many test cases at once to
test specific scenarios. Giving a useful name to the test case would also be
nice for debugging.
## Allow for the possibility that you anticipate that a flowfile is expected
to fail the test case (xfail type situations)? I don't have an immediate use
case, but it's worth considering if it's something that needs to be implemented.
# Processors specifically designed to create a wide variety of test cases and
store information as to why it failed somewhere on the flow file (a stack trace
of errors if applicable, or just pointing at which test case failed). Could be
something like `TestAttribute` or `TestContent` or `TestExecuteScript`. Some
thought could be given to how to best setup test cases in general. Perhaps the
work around I use above isn't the best approach but I'm sure people more
familiar with testing in general might have better approaches.
# The ability to mark processors as "Non Testable", specifically things like
database connections, adding to queues, some output ports to other flows you
don't necessarily want to pass a test FlowFile onto (maybe set some/all as Non
Testable by default?). Similar to how you can right click a processor and
begin tracking it with the registry, I was envisioning something along the
lines of "Allow Processing of Test FlowFiles"
# Perhaps have some way to automate runs of a test suite and monitor the
results visually, with an overview of what test cases failed (by name)
## Allow for the situation where a developer might desire a CI workflow to
develop and promote their flows, and have the ability to support the workflow
where someone can create an isolated testing environment (using Docker to load
nifi), load the flow to be tested, then run the test suite and report back the
results.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)