1 个不稳定版本
0.1.0 | 2021年7月14日 |
---|
#1176 在 WebAssembly
每月2,034次下载
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