--- title: "How it works" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{How it works} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) ``` When `cucumber::test` is called, it scans for the feature files in the `features_dir` directory. It parses the feature files and runs the step implementations one by one, according to their order in feature files. ## Step execution order Given such a feature file: ```gherkin # tests/testthat/sum.feature Feature: Sum Scenario: Sum should work for 2 numbers Given I have 1 And I have 2 When I add them Then I get 3 Scenario: Sum should work for 3 numbers Given I have 1 And I have 2 But I have 3 When I add them Then I get 6 ``` And such step definitions: ```r # tests/testthat/steps/steps_definitions.R given("I have {int}", function(int, context) { print("given") context$numbers <- c(context$numbers, int) }) when("I add them", function(context) { print("when") context$result <- sum(context$numbers) }) then("I get {int}", function(int, context) { print("then") expect_equal(context$result, int) }) ``` The order of calling the steps would be: ```r > [1] "given" > [1] "given" > [1] "when" > [1] "then" > [1] "given" > [1] "given" > [1] "given" > [1] "when" > [1] "then" ``` Notice how the feature file uses `And` and `But` keywords. They are used to continue the previous step. In the example above, `And` and `But` are used to continue the previous `Given` step, they're matched against the `given` step definition. You can use `And` and `But` to continue the previous `When` and `Then` steps as well. When a `Scenario` is run, the `context` environment is reset so that the state doesn't leak to other scenario. ## How step definitions are loaded You don't have to load step implementations manually. Cucumber loads them automatically when `cucumber::test` is called. If you don't want them to be loaded automatically, you can use `steps_loader` argument to provide your own step loader function. See [inst/examples/custom_step_loader](https://github.com/jakubsob/cucumber/blob/main/inst/examples/custom_steps_loader/tests/testthat/test-cucumber.R) Steps from feature files are matched against step definitions defined with `cucumber::given`, `cucumber::when`, and `cucumber::then` functions using regular expressions. When you define a step by calling any of the step functions, you register that step, making it available for the tests.