Architecture
On high level, the whole Cucumber is composed of three components:
Parser, representing a source of features (default one parses.featurefiles).Runner, executing scenarios of features received from aParser, and emittingevents (default one executes concurrently).Writer, outputtingevents (default one outputs to STDOUT).
Any of these components is replaceable. This makes Cucumber fully extensible, without a need to rewrite the whole library if it doesn't meet some exotic requirements. One could always write its own component, satisfying the needs, and use it. Imagine the situation, where features are sourced from distributed queue (like Kafka), then executed by a cluster of external workers (like Kubernetes Jobs), and, finally, results are emitted to different reporting systems by network. All this possible by introducing custom components, capable of doing that, without a need to change the framework.
To feel a little bit of its taste, we will write some trivial implementations of each component in subchapters below.