10 个版本

0.4.8 2024年2月17日
0.4.7 2023年6月10日
0.4.6 2023年5月6日
0.4.5 2022年11月19日
0.3.0 2020年6月1日

#17配置

Download history 2732/week @ 2024-03-14 3551/week @ 2024-03-21 3243/week @ 2024-03-28 3383/week @ 2024-04-04 3488/week @ 2024-04-11 4285/week @ 2024-04-18 6677/week @ 2024-04-25 3542/week @ 2024-05-02 3420/week @ 2024-05-09 4687/week @ 2024-05-16 2603/week @ 2024-05-23 3776/week @ 2024-05-30 2980/week @ 2024-06-06 4590/week @ 2024-06-13 2891/week @ 2024-06-20 1677/week @ 2024-06-27

12,972 每月下载量
用于 libc-test

MIT/Apache

91KB
2K SLoC

ctest2

文档

注意:这是一个 ctest 的分支,旨在作为 ctest 维护恢复前的临时替代品。

Rust 中 FFI 绑定的自动化测试。此仓库旨在验证可在 crates.io 上找到的 *-sys crates,以确保 Rust 中的 API 与在 C 中定义的 API 相匹配。

MSRV (最低支持 Rust 版本)

由于传递依赖项,MSRV 为 1.56.0。请注意,MSRV 可能随时因依赖项而更改。

示例

遗憾的是,目前的用法有点奇怪,但为了使用此库,首先,在你的仓库中创建一个新的 Cargo 项目

$ cargo new --bin systest

然后,编辑 systest/Cargo.toml 以添加以下依赖项

[package]
# ...
build = "build.rs"

[dependencies]
mylib-sys = { path = "../mylib-sys" }
libc = "0.2"

[build-dependencies]
ctest2 = "0.4"

接下来,向 systest/build.rs 添加构建脚本

fn main() {
    let mut cfg = ctest2::TestGenerator::new();

    // Include the header files where the C APIs are defined
    cfg.header("foo.h")
       .header("bar.h");

    // Include the directory where the header files are defined
    cfg.include("path/to/include");

    // Generate the tests, passing the path to the `*-sys` library as well as
    // the module to generate.
    cfg.generate("../mylib-sys/lib.rs", "all.rs");
}

接下来,将此添加到 src/main.rs

#![allow(bad_style)]

use libc::*;
use mylib_sys::*;

include!(concat!(env!("OUT_DIR"), "/all.rs"));

然后就可以使用了!要运行测试,请在 systest 目录中执行 cargo run,一切应该都会启动!

工作原理

此库将解析 *-sys crate,以了解所有 extern fn 定义。然后,它将生成一个测试套件,以确保所有函数签名、常量值、结构体布局/对齐、类型大小/对齐等都与它们的 C 等价物匹配。

生成的测试有两种形式。一种是一个包含 main 函数的 Rust 文件(因此上面的 include!),另一种是作为构建脚本一部分编译的 C 文件。C 文件包含所有头文件,并返回有关 C 方面的信息(在 Rust 中进行验证)。

可以对如何生成 C 文件应用大量的配置,您可以浏览 文档

使用 ctest2 的项目

许可证

此项目受以下任一许可证的许可:

由您自行选择。

贡献

除非您明确声明,否则根据Apache-2.0许可证定义的您有意提交以包含在ctest2中的任何贡献,应以上述双许可方式授权,不附加任何额外条款或条件。

依赖项

~2.5–3.5MB
~81K SLoC