使用 wasm-bindgen-test

wasm-bindgen-test 新增至您的 Cargo.toml[dev-dependencies]

[dev-dependencies]
wasm-bindgen-test = "0.3.0"

請注意,wasm-bindgen-test0.3.0 版本支援 Rust 1.39.0+,目前為 nightly 頻道 (截至 2019-09-05)。如果您想要支援較舊的編譯器,請使用 wasm-bindgen-test0.2.* 版本。

編寫一些測試

建立一個 $MY_CRATE/tests/wasm.rs 檔案


# #![allow(unused_variables)]
#fn main() {
use wasm_bindgen_test::*;

#[wasm_bindgen_test]
fn pass() {
    assert_eq!(1, 1);
}

#[wasm_bindgen_test]
fn fail() {
    assert_eq!(1, 2);
}

// On a target other then `wasm32-unknown-unknown`, the `#[test]` attribute
// will be used instead, allowing this test to run on any target.
#[wasm_bindgen_test(unsupported = test)]
fn all_targets() {
    assert_eq!(1, 2);
}
#}

編寫測試與正常的 Rust #[test] 相同,只是我們使用 #[wasm_bindgen_test] 屬性。

另一個不同之處是,測試**必須**位於 crate 的根目錄中,或位於 pub mod 內。將它們放在私有模組內將不起作用。

執行您的測試

使用 wasm-pack test 執行測試。預設情況下,測試會產生以 Node.js 為目標的結果,但您也可以將測試設定為在無頭瀏覽器中執行

$ wasm-pack test --node
    Finished dev [unoptimized + debuginfo] target(s) in 0.11s
     Running /home/.../target/wasm32-unknown-unknown/debug/deps/wasm-4a309ffe6ad80503.wasm
running 2 tests

test wasm::pass ... ok
test wasm::fail ... FAILED

failures:

---- wasm::fail output ----
    error output:
        panicked at 'assertion failed: `(left == right)`
          left: `1`,
         right: `2`', crates/test/tests/wasm.rs:14:5

    JS exception that was thrown:
        RuntimeError: unreachable
            at __rust_start_panic (wasm-function[1362]:33)
            at rust_panic (wasm-function[1357]:30)
            at std::panicking::rust_panic_with_hook::h56e5e464b0e7fc22 (wasm-function[1352]:444)
            at std::panicking::continue_panic_fmt::had70ba48785b9a8f (wasm-function[1350]:122)
            at std::panicking::begin_panic_fmt::h991e7d1ca9bf9c0c (wasm-function[1351]:95)
            at wasm::fail::ha4c23c69dfa0eea9 (wasm-function[88]:477)
            at core::ops::function::FnOnce::call_once::h633718dad359559a (wasm-function[21]:22)
            at wasm_bindgen_test::__rt::Context::execute::h2f669104986475eb (wasm-function[13]:291)
            at __wbg_test_fail_1 (wasm-function[87]:57)
            at module.exports.__wbg_apply_2ba774592c5223a7 (/home/alex/code/wasm-bindgen/target/wasm32-unknown-unknown/wbg-tmp/wasm-4a309ffe6ad80503.js:61:66)


failures:

    wasm::fail

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

error: test failed, to rerun pass '--test wasm'

就是這樣!


附錄:在不使用 wasm-pack 的情況下使用 wasm-bindgen-test

⚠️ 建議使用 wasm-pack 來使用 wasm-bindgen-test,因為它會處理安裝測試執行器、安裝瀏覽器的 WebDriver 用戶端,並告知 cargo 如何使用自訂測試執行器。 但是,如果您願意,您也可以自己管理這些任務。

除了上述步驟之外,您還必須執行以下操作。

安裝測試執行器

測試執行器與主要的 wasm-bindgen CLI 工具一起提供。請務必將 "X.Y.Z" 替換為您在 Cargo.toml 中已有的 wasm-bindgen 版本!

cargo install wasm-bindgen-cli --vers "X.Y.Z"

設定 .cargo/config 以使用測試執行器

將此內容新增至 $MY_CRATE/.cargo/config

[target.wasm32-unknown-unknown]
runner = 'wasm-bindgen-test-runner'

執行測試

透過將 --target wasm32-unknown-unknown 傳遞給 cargo test 來執行測試

cargo test --target wasm32-unknown-unknown

如果您還需要執行 doctest,請新增不穩定的 -Zdoctest-xcompile 標誌。這需要像這樣使用 Rust nightly 頻道

cargo +nightly test --target wasm32-unknown-unknown -Zdoctest-xcompile