Crate tanu

Crate tanu 

Source
Expand description

§Tanu - High-performance WebAPI Testing Framework

Tanu is a high-performance, async-friendly, and ergonomic WebAPI testing framework for Rust. It’s designed to be fast, type-safe, and easily extensible with full support for concurrency and async operations.

§Quick Start

You can install tanu and tokio by running the following commands in your terminal:

cargo add tanu
cargo add tokio --features full

Write your first test:

use tanu::{check, eyre, http::Client};

#[tanu::test]
async fn get_users() -> eyre::Result<()> {
    let client = Client::new();
    let response = client
        .get("https://api.example.com/users")
        .send()
        .await?;

    check!(response.status().is_success());
    Ok(())
}

#[tanu::main]
#[tokio::main]
async fn main() -> eyre::Result<()> {
    let runner = run();
    let app = tanu::App::new();
    app.run(runner).await?;
    Ok(())
}

§Key Features

  • Async/Await Native: Full support for async operations without boilerplate
  • Type-Safe: Leverage Rust’s type system for robust API testing
  • Ergonomic Assertions: Use check!, check_eq!, and other assertion macros
  • Parameterized Testing: Test multiple scenarios with different inputs
  • Built-in HTTP Client: No need to set up reqwest or other HTTP clients manually
  • Flexible Error Handling: Supports eyre::Result, anyhow::Result, and custom error types
  • TUI Support: Interactive terminal interface for test execution
  • Concurrent Execution: Run tests in parallel for better performance

§Error Types

Tanu supports various Result types for flexible error handling:

  • eyre::Result<()> (recommended) - Provides colored backtraces and seamless integration
  • anyhow::Result<()> - Compatible with existing anyhow-based code
  • std::result::Result<(), E> - Standard Rust Result type with custom error types

§Examples

§Basic HTTP Test

use tanu::{check_eq, eyre, http::Client};

#[tanu::test]
async fn test_api_endpoint() -> eyre::Result<()> {
    let client = Client::new();
    let response = client
        .get("https://httpbin.org/json")
        .header("accept", "application/json")
        .send()
        .await?;

    check_eq!(200, response.status().as_u16());

    let data: serde_json::Value = response.json().await?;
    check!(data.is_object());

    Ok(())
}

§Parameterized Tests

use tanu::{check_eq, eyre, http::Client};

#[tanu::test(200)]
#[tanu::test(404)]
#[tanu::test(500)]
async fn test_status_codes(expected_status: u16) -> eyre::Result<()> {
    let client = Client::new();
    let response = client
        .get(&format!("https://httpbin.org/status/{expected_status}"))
        .send()
        .await?;

    check_eq!(expected_status, response.status().as_u16());
    Ok(())
}

Re-exports§

pub use anyhow;
pub use eyre;
pub use inventory;
pub use pretty_assertions;

Modules§

http
HTTP Client Module

Macros§

check
Asserts that a boolean expression is true.
check_eq
Asserts that two expressions are equal using ==.
check_ne
Asserts that two expressions are not equal using !=.
check_str_eq
Asserts that two string expressions are equal with enhanced string diff output.

Structs§

App
The main tanu CLI application.
Config
tanu’s configuration.
ListReporter
A real-time streaming reporter that outputs test results as they happen.
NullReporter
A reporter that produces no output.
ProjectConfig
tanu’s project configuration.
Runner
The main test execution engine for tanu.
TableReporter
A reporter that displays test results in a summary table after all tests complete.
TestInfo
Test metadata and identification.
TestRegistration

Enums§

ReporterType
Available built-in reporter types.

Traits§

Reporter
Trait for implementing custom test result reporting.

Functions§

get_config
Get configuration for the current project. This function has to be called in the tokio task created by tanu runner. Otherwise, calling this function will panic.
scope_current
Runs a future in the current tanu test context (project + test info), if any.

Type Aliases§

AsyncTestFn

Attribute Macros§

main
Generates the test discovery and registration code for tanu.
test
Marks an async function as a tanu test case.