在 pytest 中,可以利用命令行参数、配置文件以及 `conftest.py` 文件来灵活控制测试的发现和执行范围,实现忽略特定路径、修改命名规则和动态排除文件等需求。
### 忽略测试路径和文件
1. **使用 `--ignore` 选项忽略路径:** 您可以通过在命令行使用 `--ignore=path` 选项来忽略特定的测试目录或模块。可以多次使用此选项来忽略多个路径。
2. **使用 `--ignore-glob` 选项忽略文件模式:** 如果需要根据 Unix shell 风格的通配符忽略测试文件路径,可以使用 `--ignore-glob` 选项,例如忽略所有以 `_01.py` 结尾的文件。
3. **使用 `--deselect` 选项排除特定测试项:** 在收集阶段,可以使用 `--deselect=item` 选项来排除特定的测试项。例如,如果 `tests/foobar/test_foobar_01.py` 包含 `test_a` 和 `test_b`,您可以通过 `--deselect=tests/foobar/test_foobar_01.py::test_a` 来排除 `test_a`。
### 配置文件控制(`pytest.toml`)
1. **忽略目录:** 您可以在 `pytest.toml` 文件中设置 `norecursedirs` 选项,指定 pytest 不应递归进入的目录,例如 `[pytest]
norecursedirs = ["\.svn", "_build", "tmp*"]`。
2. **修改命名约定:** 要改变 pytest 查找测试文件的命名约定,可以在 `pytest.toml` 中设置 `python_files`、`python_classes` 和 `python_functions` 选项。例如,要让 pytest 查找匹配 `check_*.py` 的文件,并查找类名包含 `Check` 和函数名包含 `*_check` 的测试,可以配置:
```toml
[pytest]
python_files = ["check_*.py"]
python_classes = ["Check"]
python_functions = ["*_check"]
```
3. **设置默认参数:** 也可以在 `pytest.toml` 中使用 `addopts` 选项来永久设置命令行参数,例如设置 `--pyargs`。
### 在 `conftest.py` 中动态控制收集
在 `conftest.py` 文件中,可以更精细地控制测试的收集过程:
1. **忽略文件:** 您可以通过设置 `collect_ignore` 列表来指定需要忽略的模块或文件,例如排除 `setup.py`。
2. **忽略文件模式:** 此外,还可以设置 `collect_ignore_glob` 列表,用于忽略匹配特定通配符的文件。
3. **动态逻辑:** 结合 `sys.version_info` 等系统信息,可以在 `conftest.py` 中编写逻辑来动态地决定哪些文件应该被忽略或包含,例如根据 Python 版本来决定是否忽略某些文件。
通过结合使用这些命令行和配置文件选项,可以实现对 pytest 测试发现机制的全面定制和灵活控制。