pytest-cov 插件报告导入和函数定义未被测试覆盖
pytest-cov plugin reports imports and function definitions not being covered by tests
我正在使用 pytest 覆盖率,然后我在命令行中有测试脚本,它们将为我生成覆盖率报告:
"""Manager script to run the commands on the Flask API."""
import os
import click
from api import create_app
from briqy.logHelper import b as logger
import pytest
app = create_app()
@app.cli.command("tests")
@click.argument("option", required=False)
def run_test_with_option(option: str = None):
from subprocess import run
from shlex import split
if option is None:
raise SystemExit(
pytest.main(
[
"--disable-pytest-warnings",
"--cov=lib",
"--cov-config=.coveragerc",
"--cov-report=term",
"--cov-report=xml",
"--cov-report=html",
"--junitxml=./tests/coverage/junit.xml",
"--cov-append",
"--no-cov-on-fail",
]
)
)
elif option == "watch":
run(
split(
'ptw --runner "python3 -m pytest tests --durations=5 '
'--disable-pytest-warnings"'
)
)
elif option == "debug":
run(
split(
'ptw --pdb --runner "python3 -m pytest tests --durations=5 '
'--disable-pytest-warnings"'
)
)
if __name__ == "__main__":
HOST = os.getenv("FLASK_RUN_HOST", default="127.0.0.1")
PORT = os.getenv("FLASK_RUN_PORT", default=5000)
DEBUG = os.getenv("FLASK_DEBUG", default=False)
app.run(
host=HOST,
port=PORT,
debug=DEBUG,
)
if bool(DEBUG):
logger.info(f"Flask server is running in {os.getenv('ENV')}")
但是,在 运行 测试之后,它显示了测试未发现文件顶部的导入。有谁知道如何去掉那些未覆盖的线条?
我设法通过将以下行添加到我的 .coveragerc
来修复报告为未覆盖行的导入。
以下是我在 .coveragerc
:
制作的 cahgne
[report]
.
.
.
exclude_lines=
# Ignore imports
from
import
但是,我仍在努力解决函数定义 (def func_name(): ...
) 被测试发现的问题。
你没有展示整个程序,但我猜你在这个文件的顶部导入了你的产品代码。这意味着在 pytest-cov 插件开始覆盖测量时,产品代码中的所有顶级语句(import、class、def 等)都已经 运行。
您可以做几件事:
- 运行 从命令行而不是在产品代码中进行 pytest。
- 更改此代码以在子进程中启动 pytest,以便 pytest 重新导入所有内容。
你不应该做的:从覆盖率测量中排除导入行。您显示的 .coveragerc 将忽略其中包含字符串“from”或“import”的任何行,这不是您想要的(例如,“import”在“do_important_thing()”中!)
我正在使用 pytest 覆盖率,然后我在命令行中有测试脚本,它们将为我生成覆盖率报告:
"""Manager script to run the commands on the Flask API."""
import os
import click
from api import create_app
from briqy.logHelper import b as logger
import pytest
app = create_app()
@app.cli.command("tests")
@click.argument("option", required=False)
def run_test_with_option(option: str = None):
from subprocess import run
from shlex import split
if option is None:
raise SystemExit(
pytest.main(
[
"--disable-pytest-warnings",
"--cov=lib",
"--cov-config=.coveragerc",
"--cov-report=term",
"--cov-report=xml",
"--cov-report=html",
"--junitxml=./tests/coverage/junit.xml",
"--cov-append",
"--no-cov-on-fail",
]
)
)
elif option == "watch":
run(
split(
'ptw --runner "python3 -m pytest tests --durations=5 '
'--disable-pytest-warnings"'
)
)
elif option == "debug":
run(
split(
'ptw --pdb --runner "python3 -m pytest tests --durations=5 '
'--disable-pytest-warnings"'
)
)
if __name__ == "__main__":
HOST = os.getenv("FLASK_RUN_HOST", default="127.0.0.1")
PORT = os.getenv("FLASK_RUN_PORT", default=5000)
DEBUG = os.getenv("FLASK_DEBUG", default=False)
app.run(
host=HOST,
port=PORT,
debug=DEBUG,
)
if bool(DEBUG):
logger.info(f"Flask server is running in {os.getenv('ENV')}")
但是,在 运行 测试之后,它显示了测试未发现文件顶部的导入。有谁知道如何去掉那些未覆盖的线条?
我设法通过将以下行添加到我的 .coveragerc
来修复报告为未覆盖行的导入。
以下是我在 .coveragerc
:
[report]
.
.
.
exclude_lines=
# Ignore imports
from
import
但是,我仍在努力解决函数定义 (def func_name(): ...
) 被测试发现的问题。
你没有展示整个程序,但我猜你在这个文件的顶部导入了你的产品代码。这意味着在 pytest-cov 插件开始覆盖测量时,产品代码中的所有顶级语句(import、class、def 等)都已经 运行。
您可以做几件事:
- 运行 从命令行而不是在产品代码中进行 pytest。
- 更改此代码以在子进程中启动 pytest,以便 pytest 重新导入所有内容。
你不应该做的:从覆盖率测量中排除导入行。您显示的 .coveragerc 将忽略其中包含字符串“from”或“import”的任何行,这不是您想要的(例如,“import”在“do_important_thing()”中!)