本地运行 SciPy 测试#
在 Python 解释器中编写和执行基本测试的文档位于 NumPy/SciPy 测试指南。此页面包含有关使用 SciPy 的 dev.py
命令行工具从命令行运行测试的信息。注意:在开始之前,请确保已安装 pytest
。
注意
dev.py
接口是自文档化的,从某种意义上说,此页面上的所有内容以及更多内容(包括每个命令的用法示例)都可以通过 python dev.py --help
和针对单个命令(如 python dev.py <command-name> --help
)进行访问。在本例中,您可以检查 python dev.py test --help
。
要运行所有测试,请在命令行导航到 SciPy 根目录并执行
python dev.py test
这将构建 SciPy(或更新现有的构建)并运行测试。
要对特定子模块(例如 optimize
)运行测试,请使用 --submodule
选项
python dev.py test -s optimize
要运行特定的测试模块,请使用 Pytest 的 --test
(或 -t
) 语法
python dev.py test -t scipy.<module>.tests.<test_file>
例如,对于 scipy/optimize/tests/test_linprog.py
文件测试,运行
python dev.py test -t scipy.optimize.tests.test_linprog
要运行一个测试类
python dev.py test -t scipy.<module>.tests.<test_file>::<TestClass>
例如,对于来自 test_linprog.py
的 TestLinprogRSCommon
类
python dev.py test -t scipy.optimize.tests.test_linprog::TestLinprogRSCommon
要运行特定的测试
python dev.py test -t scipy.<module>.tests.<test_file>::<test_name>
例如,对于来自 test_linprog.py
的 test_unknown_solvers_and_options
python dev.py test -t scipy.optimize.tests.test_linprog::test_unknown_solvers_and_options
对于类中的测试,您需要指定类名和测试名
python dev.py test -t scipy.<module>.tests.<test_file>::<TestClass>::<test_name>
示例
python dev.py test -t scipy.optimize.tests.test_linprog::TestLinprogRSCommon::test_nontrivial_problem_with_guess
其他有用的选项包括
-v
或--verbose
,它激活详细选项以获得更详细的输出。-b
或--array-api-backend
backend 在与 array-api 兼容的测试中包含替代数组后端。有关详细信息,请参见 对数组 API 标准的支持。--coverage
用于在scipy/build/coverage/index.html
中生成测试覆盖率报告。注意:必须安装pytest-cov
。-n
或--no-build
用于在测试之前阻止 SciPy 更新构建-j
或--parallel
n 在构建 SciPy 时使用 n 个核心;例如,python dev.py test -j 4
使用四个核心。从 #10172 开始,如果安装了pytest-xdist
,它还会在四个核心上运行测试。-m full
或--mode full
运行 “完整” 测试套件,包括标记为slow
的测试(例如使用@pytest.mark.slow
)。请注意,这不会运行 标记为xslow
的测试;请参见下面的提示。--
将剩余的命令行参数发送到pytest
而不是dev.py test
。例如,虽然发送到pytest.py
的-n
会激活--no-build
选项,但发送到pytest
的-n
会在多个核心上运行测试;例如,python dev.py 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
目录。这会强制 dev.py
在执行测试之前完全重建 SciPy。
还有另一个非常慢的测试级别(几分钟),即使在调用 python dev.py 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
。