#wasm32-unknown-unknown #testing #ignore #framework #test-framework #runtime-independent

webassembly-test

独立于运行时的wasm32-unknown-unknown测试框架

1 个不稳定版本

0.1.0 2021年7月14日

#1176WebAssembly

Download history 65/week @ 2024-01-02 440/week @ 2024-01-09 244/week @ 2024-01-16 265/week @ 2024-01-23 169/week @ 2024-01-30 346/week @ 2024-02-06 221/week @ 2024-02-13 329/week @ 2024-02-20 226/week @ 2024-02-27 242/week @ 2024-03-05 282/week @ 2024-03-12 287/week @ 2024-03-19 191/week @ 2024-03-26 185/week @ 2024-04-02 862/week @ 2024-04-09 756/week @ 2024-04-16

每月2,034次下载

MIT/Apache

7KB

webassembly-test

此crate实现了对wasm32-unknown-unknown目标的支持,以支持cargo test测试

$ cat src/lib.rs
#[cfg(test)]
mod tests {
    use webassembly_test::webassembly_test;

    #[webassembly_test]
    fn it_works() {
        assert_eq!(2 + 2, 4);
    }

    #[webassembly_test]
    fn it_does_not_work() {
        assert_eq!(2 + 2, 5);
    }

    #[webassembly_test]
    #[ignore]
    fn it_is_ignored() {
        assert_eq!(2 + 2, 5);
    }
}

$ cargo test --target wasm32-unknown-unknown
     Running `webassembly-test-runner target/wasm32-unknown-unknown/debug/deps/hello_world.wasm`

running 3 tests
test hello_world::tests::it_works ... ok
test hello_world::tests::it_does_not_work ... FAILED
test hello_world::tests::it_is_ignored ... ignored

test result: FAILED. 1 passed; 1 failed; 1 ignored;

webassembly-test不依赖于任何特定的wasm运行时或环境。实际上,它更像是一种模式,而不是库,可以轻松地应用于特定用例。

MSRV: 1.54.0 (beta 在编写本文时)。

编写测试

编写测试时,使用#[webassembly_test]宏而不是常规的#[test]宏。添加.cargo/config,它为wasm32-unknown-unknown设置运行者

[target.wasm32-unknown-unknown]
runner = "webassembly-test-runner"

现在,只需运行cargo test --target wasm32-unknown-unknown即可运行测试。

webassembly-test-runner是运行者的一个示例。您可以使用cargo install webassembly-test-runner来安装它。它使用wasmtime在空环境中运行测试。如果测试库需要特定于环境的导入,您需要自己编写运行者。

示例。

实现自己的运行者

webassembly_test宏很简单。对于每个测试,它都会生成一个对应的具有特殊格式的wasm导出名称。对于示例,名称将是

$webassembly-test$hello_world::tests::it_works
$webassembly-test$hello_world::tests::it_does_not_work
$webassembly-test$ignore$hello_world::tests::it_is_ignored

即,具有$webassembly-test$前缀,然后是ignore$,然后是测试函数的限定名称。

测试运行者加载wasm模块,并调用所有与给定格式匹配的导出。

示例。

实现说明

webassembly_test 使用 concat!(module_path!(), #name) 来设置测试函数的 #[export_name]。将 #[ignore] 编码到函数名称中。理想情况下,我们会使用自定义的wasm部分来存储被忽略的属性,但似乎无法正确地将自定义部分条目与完整的函数名称关联(过程宏无法访问函数的模块路径)。示例运行器在一个实例中按顺序运行所有测试,但应该在多个实例中并行运行测试。

依赖项

~1.5MB
~34K SLoC