5个版本

0.2.2 2022年5月8日
0.2.1 2022年5月7日
0.2.0 2022年5月7日
0.1.1 2022年5月6日
0.1.0 2022年5月5日

#405测试类别中

Download history 3/week @ 2024-03-15 5/week @ 2024-03-29 1/week @ 2024-04-05

54次每月下载

MIT许可证

60KB
1.5K SLoC

tux

Rust中单元和集成测试的杂项测试工具。

[dev-dependencies]
tux = { version = "0.2" }

此项目的目标是支持各种可能难以测试的测试场景,例如HTTP请求、执行二进制文件、测试复杂的输出等。

提供的代码工具没有特定的范围,除了在单元或集成测试场景中通常有用之外。

Cargo特性

此crate为其大部分功能提供特性。默认情况下,所有特性都已启用,除了构建较重的过于具体的特性。

目前,这仅适用于server特性,这是唯一默认未启用的特性。

请参阅crate文档以了解所有可用crate特性的说明。

如果您想使用一些特定的特性并希望选择启用而不是全部启用,您可以在您的Cargo.toml中使用以下内容

[dev-dependencies]
tux = { version = "0.2", default-features = false, features = ["..."] }

示例

以下是一些库提供的示例。这只是所有功能的样本,因此请查看文档以查看所有可用的内容。

测试恐慌

should_panic属性很好,但它太冗长了,并且在测试通过时也会生成堆栈跟踪。assert_panic是一个简单的替代方案,可以为单个表达式做同样的事情

fn panicky() {
    panic!("some message: and more details");
}

assert_panic!("some message" in panicky());
assert_panic!("a panic" in panic!("this is a panic"));

运行项目中的可执行文件

允许查找并运行项目中的可执行文件。对于测试命令行工具或难以测试的场景,例如控制台输出,非常有用。

// runs the executable, validates the exit code, and
// returns stdout (combines both functions below)
let output = run_bin("some-executable-in-your-project", &["--args"]);
println!("{}", output);

// this returns a `Command`
let mut cmd = get_bin("exe-name");
cmd.args(&["--help"]);
let output = cmd.output().unwrap();

// validates the exit code and error output, returns stdout
let output = get_process_output(output);
println!("{}", output);

创建临时目录和文件

此特性使需要复杂文件输入的测试场景成为可能。

// create a new temporary directory in the system tempdir
let dir = temp_dir();
println!("created at {} ({:?})", dir.path_str(), dir.path());

// create some files and directories
dir.create_file("some.txt", "file contents");
dir.create_file("sub/directory/file.txt", "created with directories");

// we can run executables from the project in the directory
dir.run_bin("my-cat", &["some.txt"]);

// delete the temporary directory with its contents on drop
drop(dir);

基于文件的测试(testdata)

启用基于文件的测试。测试用例以.input文件提供,相应的预期输出在.valid文件中。

这可以用于任何可以表示为文本的场景。

// Scans the `reverse` directory for `.input` files and executes
// the callback with the lines for each file found.
//
// The callback output is compared to the contents of a `.valid`
// file with the same name as the input. The test passes if both
// match.
//
// If any test case fails, this will display a diff with the
// failures and panic.
testdata("tests/testdata/reverse", |mut lines| {
    // In this example the `.valid` files would contain the
    // same lines as the `.input` files, but reversed.
    lines.reverse();
    lines
});

此特性可以用于测试使用纯断言过于冗长的复杂场景。

  • 通过将输入和预期输出表示为文本来简化冗长的测试;
  • 失败会输出差异,这使得它们容易检查和推理。

HTTP 请求

要使用此功能,您必须启用 server 功能。

tux = { version = "0.2", features = ["server"] }

提供由 warp 驱动的简单 HTTP 服务器,用于测试例如网络客户端库的场景。

// create a server that always responds with "some data"
let server = TestServer::new_with_root_response("some data");

// the listen port is random to avoid conflicts
let addr = format!("http://127.0.0.1:{}/", server.port());

// this is the "library" we are testing
let output = make_get_request_here(addr);
assert_eq!(output, "some data");


// another constructor, this one will respond in the `ping`
// path with information about the request
let server = TestServer::new_with_ping_route("ping");

// the server shuts down cleanly on drop
drop(server);

支持使用 new_with_routes 构造函数自定义路由。

依赖项

~0–11MB
~122K SLoC