1 个不稳定版本
0.1.0 | 2021年7月14日 |
---|
#1210 在 WebAssembly
10KB
61 行
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部分来存储忽略的属性,但似乎无法正确地将自定义部分条目与完整的函数名关联(过程宏无法访问函数的模块路径)。示例运行器在一个实例中按顺序运行所有测试,但应该可以在多个实例中并行运行测试。
依赖关系
~22MB
~432K SLoC