我正在使用 pytest-flake8 插件来检查我的 Python 代码。 每次我这样运行 linting 时:
pytest --flake8
除了 linting 之外,还运行所有测试。 但我只想运行 linter 检查。
如何配置 pytest,使其仅对代码进行 lint 测试,但跳过所有测试,最好通过命令行(或 conftest.py) - 无需向我的测试添加跳过标记?
flake8 测试标有
flake8
标记,因此您可以通过运行仅选择这些测试:
pytest --flake8 -m flake8
Pytests
--ignore <<path>>
选项在这里也能正常工作。
我通常将其隐藏在 make 命令后面。在这种情况下,我的
Makefile
和 tests
目录都位于存储库的根目录。
.PHONY: lint
lint:
pytest --flake8 --ignore tests
我遇到了同样的问题,经过一番挖掘,我意识到我只想运行
flake8
:
flake8 <path to folder>
就是这样。无需运行任何其他内容,因为您的
flake8
配置 独立于 PyTest。
您可以自己更改测试运行逻辑,例如,当
--flake8
arg 通过时忽略收集的测试:
# conftest.py
def pytest_collection_modifyitems(session, config, items):
if config.getoption('--flake8'):
items[:] = [item for item in items if item.get_closest_marker('flake8')]
现在只执行 flake8 测试,其余的将被忽略。
经过更多思考,这是我想出的解决方案 - 它适用于 pytest 5.3.5(来自
https://stackoverflow.com/a/52891274/319905的
get_marker
不再存在)。
它允许我通过命令行运行特定的 linting 检查。 由于我仍然喜欢保留运行 linting 检查和测试的选项,因此我添加了一个标志,告诉 pytest 是否应该只进行 linting。
用途:
# Run only flake8 and mypy, no tests
pytest --lint-only --flake8 --mypy
# Run tests and flake8
pytest --flake8
代码:
# conftest.py
def pytest_addoption(parser):
parser.addoption(
"--lint-only",
action="store_true",
default=False,
help="Only run linting checks",
)
def pytest_collection_modifyitems(session, config, items):
if config.getoption("--lint-only"):
lint_items = []
for linter in ["flake8", "black", "mypy"]:
if config.getoption(f"--{linter}"):
lint_items.extend(
[item for item in items if item.get_closest_marker(linter)]
)
items[:] = lint_items