cucumber 0.10.1

Cucumber testing framework for Rust, with async support. Fully native, no external test runners or dependencies.
Documentation

Cucumber testing framework for Rust

Documentation CI Rust 1.56+ Unsafe Forbidden

An implementation of the Cucumber testing framework for Rust. Fully native, no external test runners or dependencies.

Usage

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(regex = r"^(\S+) 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(regex = r"^(?: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

asciicast

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.

Supporting crates

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.

Known issues

  • Scenario Outline is treated the same as Outline or Example in the parser (gherkin/#19).

License

This project is licensed under either of

at your option.