Pytest:仅运行 linter 检查(pytest-flake8),不运行测试

问题描述 投票:0回答:5

我正在使用 pytest-flake8 插件来检查我的 Python 代码。 每次我这样运行 linting 时:

pytest --flake8

除了 linting 之外,还运行所有测试。 但我只想运行 linter 检查。

如何配置 pytest,使其仅对代码进行 lint 测试,但跳过所有测试,最好通过命令行(或 conftest.py) - 无需向我的测试添加跳过标记

python pytest
5个回答
5
投票

flake8 测试标有

flake8
标记,因此您可以通过运行仅选择这些测试:

pytest --flake8 -m flake8

4
投票
如果所有测试都在一个目录中,

Pytests

--ignore <<path>>
选项在这里也能正常工作。

我通常将其隐藏在 make 命令后面。在这种情况下,我的

Makefile
tests
目录都位于存储库的根目录。

.PHONY: lint

lint:
    pytest --flake8 --ignore tests

2
投票

我遇到了同样的问题,经过一番挖掘,我意识到我只想运行

flake8

flake8 <path to folder>

就是这样。无需运行任何其他内容,因为您的

flake8
配置 独立于 PyTest。


1
投票

您可以自己更改测试运行逻辑,例如,当

--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 测试,其余的将被忽略。


0
投票

经过更多思考,这是我想出的解决方案 - 它适用于 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
© www.soinside.com 2019 - 2024. All rights reserved.