Emscripten 測試套件

Emscripten 有一個全面的測試套件,涵蓋幾乎所有 Emscripten 功能。這些測試是開發人員的絕佳資源,因為它們提供了大多數功能的實用範例,並且已知可以在主分支上通過。除了正確性測試外,還有您可以執行的基準測試。

本文說明如何執行測試和基準測試套件,並概述可用的測試。

設定

若要執行測試,您需要一個 emscripten 設定,因為它將執行 emcc 和其他命令。請參閱開發人員指南,以了解如何最佳執行。

執行測試

使用 --help 執行測試套件執行器 (test/runner) 以查看說明訊息

test/runner --help

這些測試分為模式。您可以執行整個模式或個別測試,或使用萬用字元在某些模式中執行一些測試。例如

# run one test (in the default mode)
test/runner test_foo

# run a bunch of tests in one mode (here, all i64 tests in -O3)
test/runner core3.test_*i64*

# run all tests in a specific mode (here, wasm2gs -O1)
test/runner wasm2js1

核心測試模式(定義於 test/test_core.py 的底部)可讓您在各種不同的組態中使用不同的最佳化旗標執行測試。例如,wasm2js 或 wasm64。還有非核心測試套件,以更特殊的方式執行測試(特別是,在這些測試中,無法說「使用不同的最佳化旗標執行測試」 - 這是核心測試的目的)。非核心測試套件包括

  • other:在 shell 中執行的非核心測試。

  • browser:在瀏覽器中執行的測試。

  • sockets:在瀏覽器中執行的網路測試。

  • interactive:未完全自動化且需要使用者互動的瀏覽器測試(這些最終應自動化)。

  • sanity:用於 emscripten 自行設定的測試。這會暫時修改您的 .emscripten 檔案。

  • benchmark:執行基準測試,測量速度和程式碼大小。

我們上面提到的萬用字元也適用於非核心測試模式,例如

# run one browser test
test/runner browser.test_sdl_image

# run all SDL2 browser tests
test/runner browser.test_sdl2*

# run all browser tests
test/runner browser

略過測試

可以透過傳遞「skip:」前置詞來略過個別測試。例如

test/runner other skip:other.test_cmake

萬用字元也可以在 skip 中傳遞,所以

test/runner browser skip:browser.test_pthread_*

將執行整個瀏覽器套件,但其中的所有 pthread 測試除外。

在第一個失敗時退出

有時能夠一次反覆修正一個測試很有用。在這種情況下,可以使用 --failfast 選項,在第一個失敗後退出測試執行器。

注意

此選項僅適用於序列測試執行器。對於通常並行執行的測試套件,您可以使用 -j1 強制它們依序執行。

修正測試後,您可以使用 --start-at 選項從您停止的地方繼續。

test/runner browser --start-at test_foo --failfast

執行一堆隨機測試

您可以使用如下所示的方式執行測試套件的隨機子集

test/runner random100

根據您的偏好,將 100 取代為另一個數字。這將執行該數量的隨機測試,並告訴您假設這些測試通過,幾乎所有測試套件都通過的統計可能性。這就像選舉調查一樣運作 - 給定一個小樣本,我們可以相當準確地預測一定百分比的公眾將投票給候選人 A。在我們的例子中,「候選人」是通過或失敗,我們可以預測給定樣本將通過多少測試套件。假設樣本測試都通過,我們可以高度肯定地說,大多數測試套件實際上都會通過。(當然,這並不能保證,即使單一測試失敗也是嚴重的,但是,這可以快速評估您的修補程式是否會導致重大且明顯的破壞。)

重要測試

請參閱檔案 test/test_core.py 的底部以了解目前的測試模式,因為它們可能會隨著時間緩慢變更。當您想要在本地執行整個測試套件時,這些是目前重要的命令

# Run all core tests
test/runner core*

# Run "other" test suite
test/runner other

# Run "browser" test suite - this requires a web browser
test/runner browser

# Run "sockets" test suite - this requires a web browser too
test/runner sockets

# Run "sanity" test suite - this tests setting up emscripten during
# first run, etc., and so it modifies your .emscripten file temporarily.
test/runner sanity

# Optionally, also run benchmarks to check for regressions
test/runner benchmark

基準測試

Emscripten 有一個基準測試套件,可以測量速度和程式碼大小,其中包括幾個有趣的真實程式碼庫,從物理引擎到壓縮程式庫到虛擬機器。它還包括一些現有的基準測試,例如 CoreMark 和 LINPACK。例如,請參閱 這篇文章關於速度的部分,其中提供了概述。

若要執行基準測試套件,請執行

# Run all benchmarks
test/runner benchmark

與所有測試套件一樣,您也可以執行特定的基準測試

# Run one specific benchmark
test/runner benchmark.test_skinning

您也可以使用環境變數 EMTEST_BENCHMARKERS 指定要執行哪些基準測試工具。它接受以逗號分隔的具名基準測試工具清單(名稱可以在 test/test_benchmark.pynamed_benchmarkers 中找到)。

# Run one specific benchmark and with clang and v8.
EMTEST_BENCHMARKERS=clang,v8 test/runner benchmark.test_skinning

若要進一步自訂基準測試的執行方式,您會想要編輯檔案 test/test_benchmark.py。其中一些選項包括

  • DEFAULT_ARG 是基準測試應執行的時間長度(它們都嘗試執行相似的時間長度以保持一致性)。

  • TEST_REPS 是重複每次執行的次數(次數越多會花費更長的時間,但雜訊應較少)。

  • PROFILING 控制是否設定組建以進行分析(這可能會增加程式碼大小,因此預設不會執行)。

偵錯測試失敗

設定 偵錯模式 (EMCC_DEBUG) 對於偵錯測試很有用,因為它會發出偵錯輸出和中間檔案(檔案會進入 /tmp/emscripten_temp/

# On Windows, use "set" to set and un-set the EMCC_DEBUG environment variable:
set EMCC_DEBUG=1
test/runner test_hello_world
set EMCC_DEBUG=0

# On Linux, you can do this all in one line
EMCC_DEBUG=1 test/runner test_hello_world

# EMCC_DEBUG=2 generates additional debug information.
EMCC_DEBUG=2 test/runner test_hello_world

您也可以指定 --save-dir 將測試執行器使用的暫存目錄儲存到 /out/test/ 中。這是測試套件特定的功能,對於檢查測試輸出以及測試產生的暫存檔案很有用。預設情況下,暫存目錄會在每次測試執行之間清除,但您可以新增 --no-clean 以避免這種情況。

偵錯 主題提供了關於如何偵錯 Emscripten 產生的程式碼的更多指導。