#集成 #集成测试 #JSON配置 #JSON文件 #测试器 #配置文件 #命令参数

app tiny-integration-tester

此Rust程序用于通过RUST动态库或JSON配置文件对程序进行简单的集成测试。

18个不稳定版本 (3个破坏性更新)

0.4.6 2023年6月13日
0.4.5-draft2023年6月13日
0.3.2 2023年6月3日
0.2.3 2023年6月1日
0.1.4 2023年6月1日

304开发工具

Download history 1/week @ 2024-03-10 3/week @ 2024-03-17 1/week @ 2024-03-24 3/week @ 2024-03-31 277/week @ 2024-04-07 1/week @ 2024-04-14

每月138次下载

MIT/Apache

58KB
946 代码行

此Rust程序通过RUST动态库或JSON配置文件对程序进行简单的集成测试。

用法: tiny-integration-tester [选项]

参数 长名称 描述 平台
-h --help 打印此帮助菜单 ALL
-v --version 打印程序版本 ALL
-f --file 设置库目录或JSON测试文件名 ALL
-j --json 使用JSON文件而不是Rust库 ALL
-a --args 向测试动态库发送参数 ALL
-c --toolchain 设置编译工具链 ALL
-t --timeout 设置所有测试的默认超时时间(毫秒) 仅限*NIX
-o, --output 默认显示命令输出 仅限*NIX

此程序已在Linux上测试。虽然它可以编译到Windows,但超时和显示输出的功能不支持

使用RUST动态库


当在crate上使用tiny_integration_tester命令时,无论它是可执行文件还是库,都会生成一个名为integration_tester_{package_name}的文件夹,并运行两个基本测试:cargo test和cargo build。

新lib.rs文件的内容应如下所示

//! This crate contains integration tests for {package_name}.

mod boilerplate_structure;
mod testable;

pub use boilerplate_structure::{Attribute, IntTest};
pub use testable::Testable;

use std::ffi::OsStr;

/// Test for `cargo build` command.
#[derive(Debug)]
pub struct CargoBuilder;

// YOU CAN IMPLEMENT THE `Testable` TRAIT TO CREATE A NEW TEST ...
#[cfg_attr(rustfmt, rustfmt_skip)]
impl Testable for CargoBuilder {
    fn command(&self) -> &OsStr { "cargo".as_ref() }
    fn name(&self) -> &str { "Build program" }
    fn args(&self) -> Vec<&OsStr> { vec!["build".as_ref()] }
    fn terminate(&self) -> bool { true }
    fn show_output(&self) -> Option<bool> { Some(true) }
    fn output(&mut self, status: i32, _out: &[u8], _err: &[u8]) -> bool { status == 0 }
}

/// This main function will be exported.
#[no_mangle]
#[allow(non_snake_case)]
pub fn TESTS(_args: &[&str]) -> Result<Vec<Box<dyn Testable>>, Box<dyn std::error::Error>> {
    // ... OR YOU CAN USE THE `IntTest` STRUCTURE, WHICH IS A VERY HANDY BOILERPLATE.
    let cargo_test = Box::new(
        IntTest::builder("cargo")
            .args(["test"])
            .output(|status: i32, _out: &[u8], _err: &[u8]| status == 0)
            .set_attribute(Attribute {
                name: "Basic cargo test".to_string(),
                terminate: true,
                show_output: Some(true),
                ..Default::default()
            }),
    );

    Ok(vec![Box::new(CargoBuilder {}), cargo_test])
}

每个测试都必须实现Testable特质,并且必须通过类型为Vec>的集合返回为Box

为了实现这一点,您可以选择创建一个新的结构体,并为它实现Testable特性,或者使用已经定义了Testable特性实现的模板结构体IntTest。这些实现已经包含在文件boilerplate_structure.rs中。

您还可以使用带有-a参数的命令行从tiny_integration_tester传递参数。您可以在主测试函数的参数列表中找到这些参数,其形式为&[&str]。当然,您可以使用getopt来处理这些参数。

最好的做法是使用cargo doc生成crate的文档,并查看所有现有的实现,这些实现已经完成了几乎所有的工作!

不要更改函数的名称或原型: pub fn TESTS(_args: &[&str]) -> Result<Vec<Box<dyn Testable>>, Box<dyn std::error::Error>>

然而,还有一个最后的限制,务必使用与编译tiny_integration_tester相同的rustc版本编译动态库,如果需要,请使用-c选项。我希望未来能找到一个令人满意的解决方案。

用于JSON:


使用命令cargo new hello创建新项目后,创建一个名为test.json的文件,内容如下:

[
    {
        "command" : "./target/debug/hello",
        "stdout" : "Hello, world!\n"
    },
    {
        "command" : "./target/debug/hello",
        "stdout" : "Hello, dummy!\n"
    }
]

test.json是默认的JSON文件名。

然后简单地运行cargo build,然后执行tiny-integration-tester -j(带有-j参数)

Executing command: "./target/debug/hello" with args: []
OK!
Executing command: "./target/debug/hello" with args: []
FAIL!
result: 1 / 2

您可以将这些值设置为json测试文件中

字段 定义 类型 注释
command 运行命令 String 必填
stdout FD stdout String
stderr FD stderr String
stdin FD stdin String
args 命令参数 Array of String
envs 命令环境变量参数 Array of (String, String) json元组是[1, 2]
env_clear 清除环境 Boolean 如果为true,则清除所有环境变量
status 进程退出状态 Hexadecimal String 0xHHLL取决于操作系统
test 如果不是测试则为false Boolean 无超时效果
terminate 如果退出失败则为true Boolean 失败时退出测试器
timeout 在X毫秒后杀死进程 Unsigned Integer UNIX仅限。0=无限
show_output 显示输出为true Boolean UNIX仅限。

例如,在这里我们运行命令 cargo build --release,设置参数为 "args" : ["build", "--release"],等待命令成功 - "status" : "0x0"。没有时间限制 - "timeout" : 0,并且输出将显示在屏幕上 - "show_output" : true。最后,如果发生错误,我们将停止测试 - "terminate" : true

[
    {
        "command" : "cargo",
        "args" : ["build", "--release"],
        "status" : "0x0",
        "timeout" : 0,
        "terminate" : true,
        "show_output" : true
    }
]

与下面的示例相同

[
    {
        "command" : "echo",
        "args" : ["hello", "world"],
        "status" : "0x0",
        "show_output" : true
    },
    {
        "command" : "cargo",
        "args" : ["test", "--release"],
        "status" : "0x0",
        "timeout" : 0,
        "terminate" : true,
        "show_output" : true
    }
]

此外,我们检查 stdoutstderr 是否匹配给定的模式

[
    {
        "command" : "./target/release/fibonacci",
        "args" : ["3"],
        "stdout" : "fibo(3) = 2\n",
        "timeout" : 1000
    },
    {
        "command" : "./target/release/fibonacci",
        "args" : ["1", ""],
        "status" : "0xff00",
        "stderr" : "Usage: target/debug/fibonacci POSITIF_NUMBER\n"
    },
    {
        "command" : "./target/release/fibonacci",
        "args" : ["7"],
        "stdout" : "fibo(7) = 13\n"
    },
    {
        "timeout" : 500,
        "command" : "./target/release/fibonacci",
        "args" : ["15"],
        "status" : "0x0",
        "stdout" : "fibo(15) = 610\n"
    },
    {
        "command" : "./target/release/fibonacci",
        "args" : ["164neuf"],
        "status" : "0xff00",
        "stderr" : "Bad number format\n"
    },
    {
        "command" : "./target/release/fibonacci",
        "status" : "0xff00",
        "stderr" : "Bad number format\n"
    }
]

我们可以将 test 设置为 false,这样它就不算作测试

[
    {
        "command" : "rustc",
        "args" : ["readline-tester.rs"],
        "test" : false
    },
    {
        "command" : "rustc",
        "args" : ["env-tester.rs"],
        "test" : false
    }
]

我们还可以记录 stdin 的数据或使用 env_clearenvs 管理环境变量

[
    {
        "command" : "./readline-tester",
        "status" : "0x0",
        "stdin" : "carrots are cooked\nbananas\n",
        "stdout" : "1 carrots are cooked\n2 bananas\n"
    },
    {
        "command" : "./env-tester",
        "stdout" : "1 = foo\n2 = bar\n",
        "env_clear" : true,
        "envs" : [["1", "foo"], ["2", "bar"], ["CLUTTER_IM_MODULE", "dummy"]],
        "show_output" : true
    }
]

注意 JSON 文件末尾的逗号

依赖项

~6–18MB
~203K SLoC