#parameterized #cli-command #integration-tests #scripting-language #test #test-suite

extel

一个扩展测试库,旨在以尽可能快和简单的方式搭建测试

7个版本

0.2.2 2023年10月16日
0.2.1 2023年10月2日
0.1.3 2023年9月24日

288测试 中排名

每月下载量 46

MIT 许可证

39KB
633

Extel - 扩展测试库

Extel是一个测试库,旨在帮助创建具有无状态测试的可伸缩测试套件。Extel的主要目的是使编写测试变得快速、简单和高效。Extel的一个常见用例是编写外部二进制/可执行文件的综合测试。Extel提供了一些宏来创建和解析命令结果,以简化创建和运行CLI命令的过程。

将Extel想象成测试的脚本语言。无需导入一系列古怪的模块,也不需要在shell语言中编写奇特的重新定向来捕获stdout。相反,您可以使用Extel保存您要运行的命令的输出或状态结果,并选择测试输出去向!

用法

Extel旨在在零参数或单个参数函数上运行(前者称为测试,后者称为参数化测试)。创建您的测试函数后,您可以使用init_test_suite宏进行注册。这将生成一个包含传入函数指针的结构的蓝图。在生成的结构上调用run函数将立即执行所有测试并将结果收集到向量中,以便用户解析。

请注意,所有Extel测试函数都期望返回ExtelResult。使用其他类型会导致生成测试套件的宏失败,或在使用parameters进程宏时返回一些奇怪的错误。

use extel::prelude::*;
use extel_parameterized::parameters;

fn single_test() -> ExtelResult {
    let mut my_cmd = cmd!("echo -n \"hello world\"");
    let output = my_cmd.output()?;
    let string_output = String::from_utf8(output.stdout)?;

    extel_assert!(
        string_output == *"hello world",
        "expected 'hello world', got '{}'",
        string_output
    )
}

#[parameters(1, 2, -2, 4)]
fn param_test(x: i32) -> ExtelResult {
    extel_assert!(x >= 0, "{} < 0", x)
}

fn main() {
    init_test_suite!(ExtelDemo, single_test, param_test);
    ExtelDemo::run(TestConfig::default());
}

Extel支持通过?传播错误。如果您的自定义错误不支持From特质,您可以使用err!宏来帮助将错误映射到通用的TestFailed变体。

fn cool_err_handling() -> ExtelResult {
    let invalid_utf8 = *b"\xE0\x80\x80";
    let utf8_check = String::from_utf8(invalid_utf8.into())?;
    let io_check = std::fs::File::open("./file_not_found.txt")?;
    let your_custom_err = get_custom_result().map_err(|e| err!("{}", e))?;
    pass!()
}

依赖项

~0.3–0.8MB
~19K SLoC