.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.43) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" ======================================================================== .\" .IX Title "Test::BDD::Cucumber::Manual::Architecture 3pm" .TH Test::BDD::Cucumber::Manual::Architecture 3pm "2023-08-29" "perl v5.36.0" "User Contributed Perl Documentation" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NAME" Test::BDD::Cucumber::Manual::Architecture \- Structural Overview .SH "VERSION" .IX Header "VERSION" version 0.86 .SH "INTRODUCTION" .IX Header "INTRODUCTION" This short document exists to give you an idea how the different components of this distribution fit together. Components fall into three categories: one for dealing with definition of the step functions (Perl code), the other for dealing with feature files. And then there's the third group, with \&\f(CW\*(C`Test::BDD::Cucumber::Executor\*(C'\fR which links the two groups together; building on the steps to execute the features. .PP In the first group are \f(CW\*(C`Test::BDD::Cucumber::StepFile\*(C'\fR and \&\f(CW\*(C`Test::BDD::Cucumber::Loader\*(C'\fR. The second group is bigger and is comprised of .IP "\(bu" 4 \&\f(CW\*(C`Test::BDD::Cucumber::Parser\*(C'\fR .IP "\(bu" 4 \&\f(CW\*(C`Test::BDD::Cucumber::Model::*\*(C'\fR .PP The third group holds \- next to \f(CW\*(C`Test::BDD::Cucumber::Executor\*(C'\fR: .IP "\(bu" 4 \&\f(CW\*(C`Test::BDD::Cucumber::Harness::*\*(C'\fR .IP "\(bu" 4 \&\f(CW\*(C`Test::BDD::Cucumber::StepContext\*(C'\fR .IP "\(bu" 4 \&\f(CW\*(C`Test::BDD::Cucumber::Errors\*(C'\fR .IP "\(bu" 4 \&\f(CW\*(C`Test::BDD::Cucumber::Extension\*(C'\fR .PP Please note that the \f(CW\*(C`Test::BDD::Cucumber::Harness\*(C'\fR should not be confused with \f(CW\*(C`TAP::Harness\*(C'\fR or \f(CW\*(C`Test2::Harness\*(C'\fR; this harness is \s-1TBC\s0's own and optionally forwards events to the \f(CW\*(C`Test::Builder::Test\*(C'\fR harness. .SH "MODELS" .IX Header "MODELS" The core of a Cucumber-based test suite are the feature files and the step definitions files. By convention, these are saved under \f(CW\*(C`/features/\*(C'\fR and \&\f(CW\*(C`/features/step_definitions/\*(C'\fR respectively. .PP The feature files are encapsulated by the classes in \&\f(CW\*(C`Test::BDD::Cucumber::Model\*(C'\fR. .PP .Vb 12 \& one to one \& TBCM::Feature<\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\->TBCM::Document \& | | \& +\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+ | \& | has many | has a | has many \& V | V \& TBCM::Scenario +\-\-\-\-\->TBCM::Line \& | ^ ^ \& +\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+ | \& | has many | \& V | \& TBCM::Step\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+ .Ve .SH "EXECUTOR" .IX Header "EXECUTOR" We build up a Test::BDD::Cucumber::Executor object, in to which we load the step definitions. We then pass this in a Test::BDD::Cucumber::Model::Feature object, along with a Test::BDD::Cucumber::Harness object, which controls interaction with the outside world. .SS "Test::Builder" .IX Subsection "Test::Builder" While running step functions, \f(CW\*(C`Test::BDD::Cucumber::Executor\*(C'\fR reroutes the flow of test events (calls to \f(CW\*(C`ok\*(C'\fR, \f(CW\*(C`fail\*(C'\fR, etc) to itself. Based on the collected data, the step itself is reported as a success or failure to the test driver. .PP Confusing about this situation is that both the channel to report through to the actual test driver is an instance of Test::Builder as well as the method used to route the stream of test events to itself uses a Test::Builder instance. .SH "EXTENSION" .IX Header "EXTENSION" Extensions allow hooking into the execution of the steps, with pre\- and post hooks for steps, scenarios, features and the entire execution. Extensions can provide additional step directories from which steps will be made available. The feature and scenario stashes are passed to the extension hooks allowing for a means of communication between the hooks and the steps. .PP Additionally, as of \fI0.60\fR, it's possible to define meta data for a step upon step definition like this example: .PP .Vb 1 \& Given qr/a step with meta data/ => { meta => \*(Aqdata\*(Aq }, sub { }; .Ve .PP This allows step function authors to communicate with extensions, because extensions receive this meta data in their \f(CW\*(C`pre_step\*(C'\fR callback: .PP .Vb 3 \& sub pre_step { \& my ($stepdef, $step_context) = @_; \& my ($verb, $metadata, $stepfn) = @$stepdef; \& \& die \*(AqAll steps should have meta \-> data\*(Aq \& unless $metadata\->{meta} eq \*(Aqdata\*(Aq; \& } .Ve .PP Extensions \- when loaded by the pherkin test executor \- receive their configuration from the pherkin.yaml configuration file, which works similar to the configuration of extensions in Behat . .PP Note: when using extensions in combination with the \&\f(CW\*(C`TAP::Parser::SourceHandler::Feature\*(C'\fR plugin for \f(CW\*(C`prove\*(C'\fR, there is no guarantee that the \f(CW\*(C`pre_execute\*(C'\fR and \f(CW\*(C`post_execute\*(C'\fR hooks execute exactly once or even execute at all. This is a current limitation to be lifted in a future release. .SH "AUTHOR" .IX Header "AUTHOR" Peter Sergeant \f(CW\*(C`pete@clueball.com\*(C'\fR .SH "LICENSE" .IX Header "LICENSE" .Vb 2 \& Copyright 2019\-2023, Erik Huelsmann \& Copyright 2011\-2019, Peter Sergeant; Licensed under the same terms as Perl .Ve