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.py 中的 named_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 生成的代码的更多指导。