本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。

在 Shell 执行pytest -h可以看到 pytest 的命令行参数有这 10 大类,共 132 个

序号 类别 中文名 包含命令行参数数量
1 positional arguments 形参 1
2 general 通用 31
3 reporting 报告 18
4 collection 收集 15
5 test session debugging and configuration 测试 session 调试和配置 11
6 pytest-warnings pytest 警告 1
7 logging 日志 11
8 reporting-allure allure 测试报告 3
9 ini-options pytest.ini/tox.ini/setup.cfg
配置文件
37
10 environment variables 环境变量 4

1.positional arguments

file_or_dir

指定一个或多个文件/目录

pytest [file_or_dir] [file_or_dir] [...]

2.general

-k EXPRESSION

名字包含 test_method 或 test_other 的函数或类

-k "test_method or test_other"

名字不包含 test_method

-k "not test_method"

名字不包含 test_method 不包含 test_other

-k 'not test_method and not test_other'

大小写敏感。

源码这里不是很明白,先放这,以后再补充解释吧

@classmethod
def from_item(cls, item: "Item") -> "KeywordMatcher":
    mapped_names = set()

    # Add the names of the current item and any parent items.
    import pytest

    for node in item.listchain():
        if not isinstance(node, (pytest.Instance, pytest.Session)):
            mapped_names.add(node.name)

    # Add the names added as extra keywords to current or parent items.
    mapped_names.update(item.listextrakeywords())

    # Add the names attached to the current function through direct assignment.
    function_obj = getattr(item, "function", None)
    if function_obj:
        mapped_names.update(function_obj.__dict__)

    # Add the markers to the keywords as we no longer handle them correctly.
    mapped_names.update(mark.name for mark in item.iter_markers())

    return cls(mapped_names)

-m MARKEXPR

包含 mark1,不包含 mark2

-m 'mark1 and not mark2'

–markers

显示 markers

pytest --markers

-x, –exitfirst

第一个 error 或 failed 的 test 就退出,2 个参数等价

pytest -x
pytest --exitfirst

–maxfail=num

2 个 errors 或 failures 就退出

pytest --maxfail=2

–strict-config

解析配置文件中pytest部分时,遇到 warning 就抛出 error

pytest --strict-config

-c file

从my.ini文件加载配置

pytest -c my.ini

–continue-on-collection-errors

收集 test 失败,仍然强制继续执行

pytest --continue-on-collection-errors

–rootdir=ROOTDIR

tests 根目录,相对路径

pytest --rootdir="root_dir"
pytest --rootdir="./root_dir"
pytest --rootdir="root_dir/another_dir/"

绝对路径

pytest --rootdir="/home/user/root_dir"

带变量

pytest --rootdir="$HOME/root_dir"

–fixtures, –funcargs

显示 fixtures,以下等价

pytest --fixtures
pytest --funcargs

显示以_开头的 fixture

pytest --fixtures -v

–fixtures-per-test

显示每个 test 用到的 fixture

pytest --fixtures-per-test

–pdb

在 errors 或 KeyboardInterrupt 时,启用默认 Python debugger

pytest --pdb

–pdbcls=modulename:classname

启用自定义 Python debugger,由IPython.terminal.debugger module 下的TerminalPdb class 定义

pytest --pdbcls=IPython.terminal.debugger:TerminalPdb

–trace

run 每个 test 时 break,进入 debugger 交互

pytest --trace

–capture=method

文件描述符(默认)

pytest --capture=fd

stdout/stderr 内存

pytest --capture=sys

显示 print

pytest --capture=no

tee-sys

pytest --capture=tee-sys

-s

等价于--capture=no

–runxfail

强制运行 xfail 标记的 test

pytest --runxfail

–lf, –last-failed

重跑上次失败的 tests,如果没有失败就重跑全部,以下等价

pytest -lf
pytest --last-failed

–ff, –failed-first

优先跑上次失败的 test,tests 的顺序会被打乱,以下等价

pytest -ff
pytest --failed-first

–nf, –new-first

优先跑新添加的 tests,剩余的按文件 mtime 顺序,以下等价

pytest --nf
pytest --new-first

–cache-show=[CACHESHOW]

显示缓存,默认*

pytest --cache-show

显示缓存,带参数cache\nodeids

pytest --cache-show=cache\nodeids

–cache-clear

运行开始时清缓存

pytest --cache-clear

–lfnf={all,none}, –last-failed-no-failures={all,none}

没有 last-failed 缓存数据,或上次没有失败时,

跑全部 tests

pytest --lfnf=all
pytest --last-failed-no-failures=all

不运行

pytest --lfnf=none
pytest --last-failed-no-failures=none

–sw, –stepwise

逐步运行,在失败时退出,下次运行时从失败的用例开始

pytest -sw
pytest --stepwise

–stepwise-skip

跳过第一个失败的 test,如果再遇到失败就退出

pytest --stepwise-skip

–allure-severities=SEVERITIES_SET

指定 allure severities 运行

pytest --allure-severities=blocker, critical, normal, minor, trivial

–allure-epics=EPICS_SET

指定 allure epics 运行

pytest --allure-epics=my_epic

–allure-features=FEATURES_SET

指定 allure features 运行

pytest --allure-features=my_feature

–allure-stories=STORIES_SET

指定 allure stories 运行

pytest --allure-stories=my_story

–allure-link-pattern=LINK_TYPE:LINK_PATTERN

不知道怎么用,溜了溜了

pytest --allure-link-pattern=

3.reporting

–durations=N

显示 2 个最慢的 setup/test 的耗时

pytest --durations=2

显示所有耗时

pytest --durations=0

-v, –verbose

输出详细信息

pytest -v
pytest --verbose

-q, –quiet

输出简要信息

pytest -q
pytest --quiet

–verbosity=VERBOSE

设置信息显示等级为 2

pytest --verbosity=2

-r chars

默认"fE"

显示 failed 的信息

pytest -r f

显示 Error 的信息

pytest -r E

显示 skipped 的信息

pytest -r s

显示 xfailed 的信息

pytest -r x

显示 Xpassed 的信息

pytest -r X

显示 passed 的信息

pytest -r p

显示 Passed with output 的信息

pytest -r P

显示 all except passed 的信息

pytest -r a
pytest -r A

显示 warnings are enabled by default (–disable-warnings)的信息

pytest -r w

重置 list

pytest -r N

-l, –showlocals

在 tracebacks 中显示局部变量,默认不显示

pytest -l
pytest --showlocals

–tb=style

traceback 打印模式

pytest --tb=auto
pytest --tb=long
pytest --tb=short
pytest --tb=line
pytest --tb=native
pytest --tb=no

–show-capture

失败的 tests 如何显示,默认"all"

pytest --show-capture=no
pytest --show-capture=stdout
pytest --show-capture=stderr
pytest --show-capture=log
pytest --show-capture=all

–full-trace

不截取 traceback,默认会截断

pytest --full-trace

–color=color

显示颜色

pytest --color=yes

不显示颜色

pytest --color=no

自动

pytest --color=auto

–pastebin=mode

没什么用

pytest --pastebin=mode

–junit-xml=path

创建 junit-xml 风格的测试报告

pytest --junit-xml=path

–junit-prefix=str

junit-xml 输出中的 classnames 添加前缀 hello

pytest --junit-prefix="hello"

–result-log=path

不建议使用

pytest --result-log=path

4.collection

–collect-only, –co

只收集,不执行。可以用来统计写了多少条自动化用例

pytest --collect-only
pytest --co

–pyargs

把所有参数解释为 python 包(package)

pytest --pyargs

–ignore=path

忽略不收集,可以多个(逗号隔开)

pytest --ignore=path1,path2,path3

–ignore-glob=path

path 匹配,可以多个(逗号隔开)

pytest --ignore-glob="*_01.py"

–deselect=nodeid_prefix

通过 node id prefix 反选。可以多个(逗号隔开)

取消选择 tests/foobar/test_foobar_01.py::test_a

--deselect="tests/foobar/test_foobar_01.py::test_a"

–confcutdir=dir

只加载相对于 tests/foobar/目录的 conftest.py 文件

pytest --confcutdir="tests/foobar/"

–noconftest

不加载 conftest.py 文件

pytest --noconftest

–keep-duplicates

收集重复的 test 文件,默认只会收集 1item,加参数后会收集 2items

pytest test.py test.py --keep-duplicates

–collect-in-virtualenv

收集本地虚拟环境目录的 tests

pytest --collect-in-virtualenv

–doctest-modules

doctest 没啥用

pytest --doctest-modules

–doctest-report={none,cdiff,ndiff,udiff,only_first_failure}

doctest 没啥用

pytest --doctest-report={none,cdiff,ndiff,udiff,only_first_failure}

–doctest-glob=pat

doctest 没啥用

pytest --doctest-glob=pat

–doctest-ignore-import-errors

doctest 没啥用

pytest --doctest-ignore-import-errors

–doctest-continue-on-failure

doctest 没啥用

pytest --doctest-continue-on-failure

5.test session debugging and configuration

–basetemp=dir

test run 的 base 临时目录(如果存在会先删除)

pytest --basetemp=dir

-V, –version

pytest 版本

pytest -V
pytest --version

-h, –help

pytest 帮助

pytest -h
pytest --help

-p name

加载 plugin module 或 entry point

pytest -p name

不加载 doctest

pytest -p no:doctest

–trace-config

查看本地安装好的第三方插件

pytest --trace-config

–debug

保存 debug 信息到’pytestdebug.log’文件

pytest --debug

-o OVERRIDE_INI, –override-ini=OVERRIDE_INI

覆盖 ini 文件配置

pytest -o xfail_strict=True -o cache_dir=cache
pytest --override-ini=OVERRIDE_INI

–assert=MODE

默认 rewrite

pytest --assert=rewrite

无 assertion debugging

pytest --assert=plain

–setup-only

只 setup fixtures,不执行 tests

pytest --setup-only

–setup-show

执行 tests 的时候显示 fixture setup

pytest --setup-show

–setup-plan

显示 fixtures 和 tests 计划会执行什么,但是不执行

也可以用来统计自动化用例

pytest --setup-plan

6.pytest-warnings

-W PYTHONWARNINGS, –pythonwarnings=PYTHONWARNINGS

设置报告哪些 warnings

pytest -W PYTHONWARNINGS
pytest --pythonwarnings=PYTHONWARNINGS

7.logging

推荐直接使用loguru第三方库。

–log-level=LEVEL

默认没有设置,依赖 log handler

WARNING DEBUG INFO ERROR

pytest --log-level=LEVEL

–log-format=LOG_FORMAT

日志格式

pytest --log-format="%(asctime)s %(levelname)s %(message)s"

–log-date-format=LOG_DATE_FORMAT

日期格式

pytest --log-date-format="%Y-%m-%d %H:%M:%S"

–log-cli-level=LOG_CLI_LEVEL

cli 日志级别

pytest --log-cli-level=LOG_CLI_LEVEL

–log-cli-format=LOG_CLI_FORMAT

cli 日志格式

pytest --log-cli-format="%(asctime)s %(levelname)s %(message)s"

–log-cli-date-format=LOG_CLI_DATE_FORMAT

cli 日志级别

pytest --log-cli-date-format="%Y-%m-%d %H:%M:%S"

–log-file=LOG_FILE

日志文件路径

pytest --log-file=LOG_FILE

–log-file-level=LOG_FILE_LEVEL

日志文件级别

pytest --log-file-level=LOG_FILE_LEVEL

–log-file-format=LOG_FILE_FORMAT

日志文件格式

pytest --log-file-format="%(asctime)s %(levelname)s %(message)s"

–log-file-date-format=LOG_FILE_DATE_FORMAT

日志文件日期

pytest --log-file-date-format="%Y-%m-%d %H:%M:%S"

–log-auto-indent=LOG_AUTO_INDENT

自动换行

true|flase on|off

pytest --log-auto-indent=LOG_AUTO_INDENT

8.reporting-allure

–alluredir=DIR

allure 数据生成目录,注意不是 html 哦,而是 json 文件,需要allure generate data_dir -o html_dir才能生成 html

pytest --alluredir=DIR

–clean-alluredir

如果存在 alluredir,先清除

pytest --clean-alluredir

–allure-no-capture

报告不捕获 pytest 的 logging/stdout/stderr 信息

pytest --allure-no-capture

9.ini-options

ini 文件用例设置一些初始化默认值。

部分内容其实质跟参数是一样用法。

markers (linelist)

自定义 marker

## pytest.ini
[pytest]

markers =
  webtest:  Run the webtest case
  hello: Run the hello case

empty_parameter_set_mark (string)

默认情况下,如果@pytest.mark.parametrize的argnames中的参数没有接收到任何的实参的话,用例的结果将会被置为SKIPPED;empty_parameter_set_mark 可以设置为 skip、xfail、fail_at_collect。

norecursedirs (args)

忽略一些目录

## pytest.ini
 
[pytest]
 
norecursedirs = .* build dist CVS _darcs {arch} *.egg venv src

testpaths (args)

指定目录

## pytest.ini
 
[pytest]
 
testpaths = test_path

usefixtures (args)

默认使用 fixtures。

python_files (args)

glob 文件匹配模式的 python test modules。

python_classes (args)

前缀/glob 文件匹配模式的 python test classes。

python_functions (args)

前缀/glob 文件匹配模式的 python test functions。

ty_support (bool)

有风险,没用。

console_output_style (string)

控制台输出样式

  • classic 经典样式
  • progress: 带进度百分比
  • count 计数而不是百分比

xfail_strict (bool)

默认 false,true 时@pytest.mark.xfail 的 test,会被强制失败,即使是成功的。

enable_assertion_pass_hook (bool)

确保删除之前生成的 pyc 缓存文件。

junit_suite_name (string)

不用学。

junit_logging (string)

不用学。

junit_log_passing_tests (bool)

不用学。

junit_duration_report (string)

不用学。

junit_family (string)

不用学。

doctest_optionflags (args)

不用学。

doctest_encoding (string)

不用学。

cache_dir (string)

缓存目录。

filterwarnings (linelist)

同 -W/–pythonwarnings。

log_level (string)

同命令行参数。

log_format (string)

同命令行参数。

log_date_format (string)

同命令行参数。

log_cli (bool)

true,test run 的时候,实时显示日志。

log_cli_level (string)

同命令行参数。

log_cli_format (string)

同命令行参数。

log_cli_date_format (string)

同命令行参数。

log_file (string)

同命令行参数。

log_file_level (string)

同命令行参数。

log_file_format (string)

同命令行参数。

log_file_date_format (string)

同命令行参数。

log_auto_indent (string)

同命令行参数。

faulthandler_timeout (string)

如果 test 的运行时间超过设定的时间(超时),会打印相关 traceback。

addopts (args)

执行时带的默认参数,可以避免每次都要输入一遍

addopts = -rsxX -v --reruns=1 --count=2

minversion (string)

pytest 最小版本号。如果 pytest 低于这个版本,运行会报错。

required_plugins (args)

必须的插件。

10.environment variables

PYTEST_ADDOPTS

命令行选项

export PYTEST_ADDOPTS=

PYTEST_PLUGINS

包含应作为插件加载的以逗号分隔的模块列表

export PYTEST_PLUGINS=mymodule.plugin,xdist

PYTEST_DISABLE_PLUGIN_AUTOLOAD

禁用插件自动加载

export PYTEST_DISABLE_PLUGIN_AUTOLOAD=

PYTEST_DEBUG

启用 pytest 调试

export PYTEST_DEBUG=