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在测试类别中
54次每月下载
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