在本地运行 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>
TestLinprogRSCommon 类来自 test_linprog.py 的示例:
python dev.py test -t scipy.optimize.tests.test_linprog::TestLinprogRSCommon
要运行一个特定的测试:
python dev.py test -t scipy.<module>.tests.<test_file>::<test_name>
test_unknown_solvers_and_options 来自 test_linprog.py 的示例:
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,用于激活详细输出选项以获取更详细的输出。--coverage用于在scipy/build/coverage/index.html生成测试覆盖率报告。注意:pytest-cov必须安装。-n或--no-build以防止 SciPy 在测试前更新构建-j或--paralleln 在构建 SciPy 时启用 n 个核心;例如,python dev.py test -j 4启用四个核心。自 #10172 起,如果安装了pytest-xdist,这也会在四个核心上运行测试。-m full或--mode full用于运行“完整”测试套件,包括标记为slow的测试(例如使用@pytest.mark.slow标记的测试)。请注意,这不会 运行 标记为xslow的测试;请参见下面的提示。--将剩余的命令行参数传递给pytest而不是dev.py test。例如,当-n传递给pytest.py时,会激活--no-build选项,而-n传递给pytest时,会在多个核心上运行测试;例如,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。