Cucumber testing framework for Rust
An implementation of the Cucumber testing framework for Rust. Fully native, no external test runners or dependencies.
Usage
Describe testing scenarios in .feature
files:
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:
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")] // Cucumber Expression
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("she is 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).
Cargo features
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.
Supporting crates
The full gamut of Cucumber's Gherkin language is implemented by the gherkin
crate. Most features of the Gherkin language are parsed already and accessible via the relevant structs.
Known issues
Scenario Outline
is treated the same asOutline
orExample
in the parser (gherkin/#19).
License
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.