18个不稳定版本 (3个破坏性更新)
0.4.6 | 2023年6月13日 |
---|---|
0.4.5-draft | 2023年6月13日 |
0.3.2 | 2023年6月3日 |
0.2.3 | 2023年6月1日 |
0.1.4 | 2023年6月1日 |
304 在 开发工具
每月138次下载
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
为了实现这一点,您可以选择创建一个新的结构体,并为它实现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
}
]
此外,我们检查 stdout 或 stderr 是否匹配给定的模式
[
{
"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_clear 和 envs 管理环境变量
[
{
"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