Python測試框架pytest命令列引數用法

東方er發表於2020-09-11

在Shell執行pytest -h可以看到pytest的命令列引數有這10大類,共132個

序號Python測試框架pytest命令列引數用法 類別 中文名 包含命令列引數數量Python測試框架pytest命令列引數用法
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.parametrizeargnames中的引數沒有接收到任何的實參的話,用例的結果將會被置為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=

版權申明:本文為博主原創文章,轉載請保留原文連結及作者。
如果您喜歡我寫的文章,請關注公眾號支援一下,謝謝哈哈哈。
Python測試框架pytest命令列引數用法

相關文章