An implementation of the Cucumber testing framework for Rust. Fully native, no external test runners or dependencies.
Describe testing scenarios in .feature
files:
## /tests/features/readme/eating.feature
Feature: Eating too much cucumbers may not be good for you
Scenario: Eating a few isn't a problem
Given Alice is hungry
When she eats 3 cucumbers
Then she is full
Implement World
trait and describe steps:
//! tests/readme.rs
use std::{convert::Infallible, time::Duration};
use async_trait::async_trait;
use cucumber::{given, then, when, WorldInit};
use tokio::time::sleep;
#[derive(Debug, WorldInit)]
struct World {
user: Option<String>,
capacity: usize,
}
#[async_trait(?Send)]
impl cucumber::World for World {
type Error = Infallible;
async fn new() -> Result<Self, Self::Error> {
Ok(Self { user: None, capacity: 0 })
}
}
#[given(expr = "{word} is hungry")]
async fn someone_is_hungry(w: &mut World, user: String) {
sleep(Duration::from_secs(2)).await;
w.user = Some(user);
}
#[when(regex = r"^(?:he|she|they) eats? (\d+) cucumbers?$")]
async fn eat_cucumbers(w: &mut World, count: usize) {
sleep(Duration::from_secs(2)).await;
w.capacity += count;
assert!(w.capacity < 4, "{} exploded!", w.user.as_ref().unwrap());
}
#[then(expr = "he/she/they is/are full")]
async fn is_full(w: &mut World) {
sleep(Duration::from_secs(2)).await;
assert_eq!(w.capacity, 3, "{} isn't full!", w.user.as_ref().unwrap());
}
#[tokio::main]
async fn main() {
World::run("tests/features/readme").await;
}
Add test to Cargo.toml
:
[[test]]
name = "readme"
harness = false # allows Cucumber to print output instead of libtest
For more examples check out the Book (current | edge).
macros
(default): Enables step attributes and auto-wiring.timestamps
: Enables timestamps collecting for all Cucumber events.output-json
(impliestimestamps
): Enables support for outputting in Cucumber JSON format.output-junit
(impliestimestamps
): Enables support for outputting JUnit XML report.
The full gamut of Cucumber's Gherkin language is implemented by the gherkin-rust
crate. Most features of the Gherkin language are parsed already and accessible via the relevant structs.
Scenario Outline
is treated the same asOutline
orExample
in the parser (gherkin/#19).
This project is licensed under either of
- Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.