在本地运行 SciPy 测试#
基本的测试编写和从 Python 解释器内执行,已在 NumPy/SciPy 测试指南 中有所说明。本页面包含关于使用 spin 命令行工具从命令行运行测试的信息。请注意:开始之前,请确保已安装 pytest。
注意
“spin” 界面是自解释的,这意味着本页面上的所有内容以及更多信息(包括每个命令的使用示例)都可以通过 spin --help 和像 spin <command-name> --help 这样的单个命令来访问。在这种情况下,您可以检查 spin test --help。
要运行所有测试,请在命令行中导航到 SciPy 的根目录并执行:
spin test
这将构建 SciPy(或更新现有构建)并运行测试。
要运行特定子模块的测试,例如 optimize,请使用 --submodule 选项:
spin test -s optimize
要运行特定的测试模块,请使用 Pytest 的 --test(或 -t)语法:
spin test -t scipy.<module>.tests.<test_file>
例如,要运行 scipy/optimize/tests/test_linprog.py 文件中的测试,请运行:
spin test -t scipy.optimize.tests.test_linprog
运行测试类
spin test -t scipy.<module>.tests.<test_file>::<TestClass>
例如,从 test_linprog.py 运行 TestLinprogRSCommon 类:
spin test -t scipy.optimize.tests.test_linprog::TestLinprogRSCommon
运行特定的测试
spin test -t scipy.<module>.tests.<test_file>::<test_name>
例如,从 test_linprog.py 运行 test_unknown_solvers_and_options:
spin test -t scipy.optimize.tests.test_linprog::test_unknown_solvers_and_options
对于类中的测试,您需要指定类名和测试名:
spin test -t scipy.<module>.tests.<test_file>::<TestClass>::<test_name>
示例
spin test -t scipy.optimize.tests.test_linprog::TestLinprogRSCommon::test_nontrivial_problem_with_guess
其他有用的选项包括:
-v或--verbose,它会激活 verbose 选项以获得更详细的输出。-b或--array-api-backendbackend,用于在与 array-api 兼容的测试中包含替代的 array backend。有关详细信息,请参阅 对 array API 标准的支持。--coverage,用于在scipy/build/coverage/index.html中生成测试覆盖率报告。请注意:pytest-cov必须已安装。-n或--no-build,用于阻止 SciPy 在测试前更新构建。-j或--paralleln,在构建 SciPy 时使用 n 个核心;例如spin test -j 4使用四个核心。从 #10172 开始,如果安装了pytest-xdist,这也将在四个核心上运行测试。-m full或--mode full,用于运行“完整的”测试套件,包括标记为slow的测试(例如,使用@pytest.mark.slow)。请注意,这不会运行标记为xslow的测试;请参阅下面的提示。--,用于将剩余的命令行参数发送给pytest,而不是发送给spin test。例如,虽然发送给pytest.py的-n会激活--no-build选项,但发送给pytest的-n会在多个核心上运行测试;例如spin test -- -n 4会使用四个核心运行测试。请注意: 在多个核心上进行测试必须安装pytest-xdist。常用的pytest命令行参数包括:--durations=m,用于显示最慢 m 个测试的持续时间。使用--durations=0和--durations-min=x一起使用,可以显示所有持续时间超过 x 秒的测试的持续时间。--fail-slow=x,如果测试超过 x 秒,则导致测试失败。(注意:必须安装pytest-fail-slow。)--timeout=x,如果任何测试时间超过 x 秒,则会停止所有测试执行。(注意:必须安装pytest-timeout。)
有关 pytest 的更多信息,请参阅 pytest 的 文档。
提示:#
如果您是从源代码构建 SciPy,但在更改代码库后运行测试时遇到问题,请尝试删除 scipy/build 目录。这将强制 spin 在执行测试前完全重新构建 SciPy。
还有一个额外的、非常慢的测试级别(耗时几分钟),即使在调用 spin test -m full 时也会被禁用。可以通过在运行测试套件之前设置环境变量 SCIPY_XSLOW=1 来启用它们。
默认情况下,使用 Hypothesis 的测试将使用在 scipy/scipy/conftest.py 中定义的 deterministic 配置文件运行。此配置文件包含 Hypothesis 设置 derandomize=True,因此在 Hypothesis、Python 或测试函数更新之前,会使用相同的示例。为了更好地利用 Hypothesis 查找反例的能力,请在运行测试套件之前设置环境变量 SCIPY_HYPOTHESIS_PROFILE=nondeterministic 来选择 nondeterministic 配置文件。运行的示例数量可以通过编辑选定的配置来配置,例如添加 max_examples=100_000。