#runner #test-runner #testing #ignore #sample #webassembly-test

app webassembly-test-runner

webassembly-test crate的示例运行器

1 个不稳定版本

0.1.0 2021年7月14日

#1210WebAssembly

MIT/Apache

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