跳转至

测试项目


test 命令(默认情况下)使用 pytest,结合特定插件和 coverage.py。更多信息请参见 测试配置

大多数项目都可以通过这种方式完成全部测试,无需自定义 环境

传递参数

当你不带参数运行 test 命令时,tests 会作为 默认参数 传递给 pytest(假设你有一个 tests 目录)。例如,以下命令:

hatch test

大致等同于:

pytest tests

你可以通过在 test 命令后追加参数来传递给 pytest。例如,以下命令:

hatch test -vv tests/test_foo.py::test_bar

大致等同于:

pytest -vv tests/test_foo.py::test_bar

test 命令的内建选项与 pytest 的选项发生冲突(如 --help)时,可以使用 -- 分隔符强制将参数视为位置参数。例如:

hatch test -r -- -r fE -- tests

大致等同于:

pytest -r fE -- tests

Note

要确保 pytest 能够收到指示要运行哪些测试或从哪里查找测试的参数。其默认行为是 .,意味着它会从当前目录递归查找测试文件。这不仅可能很慢,还可能导致意外行为。

环境选择

单一环境

如果未指定任何环境选项,test 命令只会在第一个已定义且兼容的环境中运行测试。查找顺序会优先选择定义了与 Hatch 运行的解释器版本一致的 Python 版本 的环境。

例如,若你覆盖了 默认 matrix 如下:

[[tool.hatch.envs.hatch-test.matrix]]
python = ["3.12", "3.11"]

[[tool.hatch.envs.hatch-test.matrix]]
python = ["3.11"]
feature = ["foo", "bar"]

则扩展后的环境为:

hatch-test.py3.12
hatch-test.py3.11
hatch-test.py3.11-foo
hatch-test.py3.11-bar

如果你是在 Python 3.11 上安装的 Hatch,则查找顺序为:

hatch-test.py3.11
hatch-test.py3.11-foo
hatch-test.py3.11-bar
hatch-test.py3.12

Note

如果你使用官方 安装器 安装 Hatch,或使用了某个 独立二进制文件,那么 Hatch 运行的 Python 版本是不可控的。如果你依赖此单一环境解析行为,建议根据 Python 版本 显式选择环境

所有环境

你可以使用 --all 标志在所有兼容的环境中运行测试。例如,若你定义了如下 matrix 和 overrides

[[tool.hatch.envs.hatch-test.matrix]]
python = ["3.12", "3.11"]
feature = ["foo", "bar"]

[tool.hatch.envs.hatch-test.overrides]
matrix.feature.platforms = [
  { value = "linux", if = ["foo", "bar"] },
  { value = "windows", if = ["foo"] },
  { value = "macos", if = ["bar"] },
]

则以下表格表示在哪些环境下将运行测试:

环境 Linux Windows macOS
hatch-test.py3.12-foo
hatch-test.py3.12-bar
hatch-test.py3.11-foo
hatch-test.py3.11-bar

指定环境

你可以使用 --include/-i--exclude/-x 选项选择环境的子集。这些选项可用于包含或排除某些 matrix 变量,支持指定逗号分隔的值,且可以重复使用。

例如,定义如下 matrix:

[[tool.hatch.envs.hatch-test.matrix]]
python = ["3.12", "3.11"]
feature = ["foo", "bar", "baz"]

若你想在 Python 3.12 且具有 foobar 特性的环境中运行测试,可以使用:

hatch test -i python=3.12 -i feature=foo,bar

或者,也可以通过排除 baz 特性达到相同目的:

hatch test -i python=3.12 -x feature=baz

Tip

由于选择 Python 版本是常见需求,可使用 --python/-py 作为简写。例如,上述命令可写为:

hatch test -py 3.12 -i feature=foo,bar
hatch test -py 3.12 -x feature=baz

测量代码覆盖率

你可以使用 --cover 标志启用 代码覆盖率。例如,以下命令:

hatch test --cover

大致等同于:

coverage run -m pytest tests

在所有 选定环境 运行测试后,覆盖率数据将被合并,并显示报告。--cover-quiet 标志可用于隐藏报告,同时隐式启用 --cover 标志:

hatch test --cover-quiet

Note

覆盖率数据文件会生成在项目根目录。请确保使用如下通配符模式将其从版本控制中排除:

.coverage*

重试失败测试

你可以使用 --retries 选项来 重试 失败的测试:

hatch test --retries 2

如果某个测试每次都失败,且重试次数为 2,则该测试总共会运行三次。

你还可以使用 --retry-delay 设置每次重试之间的等待秒数:

hatch test --retries 2 --retry-delay 1

并行化测试执行

你可以使用 --parallel/-p 标志 并行化 测试执行:

hatch test --parallel

这会将单个环境内的测试任务分发给多个工作进程。工作进程的数量取决于系统的逻辑 CPU 数量(而非物理核心数)。

随机化测试顺序

你可以使用 --randomize/-r 标志 随机化 测试顺序:

hatch test --randomize