Pytest
Posted 粥雨
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Pytest相关的知识,希望对你有一定的参考价值。
Pytest - setup 和 teardown
-
执行用例肯定有些需要前置条件或后置操作,例如前置的用户登陆,后置的清理数据等操作;
-
unittest提供了两种前置(setup、setupClass)和两种后置(teardown、teardownClass);
-
相比之下,pytest 提供了十种
setup
和teardown
方法:-
模块级别:setup_module、teardown_module
-
函数级别:setup_function、teardown_function,不在类中的方法
-
类级别:setup_class、teardown_class
-
方法级别:setup_method、teardown_method
-
用例级别:setup、teardown
-
test_py.py
import pytest
def setup_module():
print("\\n!!!! setup_module > 整个.py模块开始前只执行一次:打开浏览器/获取cookie !!!!")
def teardown_module():
print("!!!! teardown_module > 整个.py模块结束后只执行一次:关闭浏览器 !!!!")
def setup_function():
print("\\n### setup_function > 每个函数级别用例开始前都执行 ###")
def teardown_function():
print("### teardown_function > 每个函数级别用例结束后都执行 ###")
def test_one():
print("test case 1")
def test_two():
print("test case 2")
class TestCase():
def setup_class(self):
print("\\n^^^ setup_class > 整个测试类开始前只执行一次 ^^^")
def teardown_class(self):
print("^^^ teardown_class > 整个测试类结束后只执行一次 ^^^")
def setup_method(self):
print("\\n=== setup_method > 类里面每个用例执行前都会执行 ===")
def teardown_method(self):
print("=== teardown_method > 类里面每个用例结束后都会执行 ===")
def setup(self):
print("--- setup > 类里面每个用例执行前都会执行 ---")
def teardown(self):
print("--- teardown > 类里面每个用例结束后都会执行 ---")
def test_three(self):
print("test case 3")
def test_four(self):
print("test case 4")
if __name__ == \'__main__\':
pytest.main(["-q", "-s", "-ra", "test_py.py"])
-
执行结果如图所示各级别(讲解顺序从上往下,级别从低到高):
-
黄色框:用例级别 【setup、teardown】
-
橙色框:方法级别【setup_method、teardown_method】
-
蓝色框:类级别【setup_class、teardown_class】
-
绿色框:函数级别【setup_function、teardown_function】
-
红色框:模块级别【setup_module、teardown_module】
-
本文来自博客园,作者:粥雨,转载请注明原文链接:https://www.cnblogs.com/mzline/p/17431289.html
pytest学习和使用18-pytest.ini配置文件如何使用?
(18-pytest.ini配置文件如何使用?)
1 配置文件的作用
- 改变
pytest
的运行方式; pytest.ini
是一个固定的文件;pytest.ini
用来读取配置信息。
2 文件格式
# 文件名为:pytest.ini
[pytest]
addopts =
xfail_strict =
3 查看pytest.ini的选项
- 使用命令:
pytest --help
- 如下:
C:\\Users\\Administrator>pytest --help
usage: pytest [options] [file_or_dir] [file_or_dir] [...]
positional arguments:
file_or_dir
general:
-k EXPRESSION only run tests which match the given substring expression. An expression is a python evaluatable
expression where all names are substring-matched against test names and their parent classes.
Example: -k test_method or test_other matches all test functions and classes whose name
contains test_method or test_other, while -k not test_method matches those that dont
contain test_method in their names. -k not test_method and not test_other will eliminate the
matches. Additionally keywords are matched to classes and functions containing extra names in
their extra_keyword_matches set, as well as functions which have names assigned directly to
them. The matching is case-insensitive.
-m MARKEXPR only run tests matching given mark expression.
For example: -m mark1 and not mark2.
--markers show markers (builtin, plugin and per-project ones).
-x, --exitfirst exit instantly on first error or failed test.
--fixtures, --funcargs
show available fixtures, sorted by plugin appearance (fixtures with leading _ are only shown
with -v)
--fixtures-per-test show fixtures per test
--pdb start the interactive Python debugger on errors or KeyboardInterrupt.
--pdbcls=modulename:classname
start a custom interactive Python debugger on errors. For example:
--pdbcls=IPython.terminal.debugger:TerminalPdb
--trace Immediately break when running each test.
--capture=method per-test capturing method: one of fd|sys|no|tee-sys.
-s shortcut for --capture=no.
--runxfail report the results of xfail tests as if they were not marked
--lf, --last-failed rerun only the tests that failed at the last run (or all if none failed)
--ff, --failed-first run all tests, but run the last failures first.
This may re-order tests and thus lead to repeated fixture setup/teardown.
--nf, --new-first run tests from new files first, then the rest of the tests sorted by file mtime
--cache-show=[CACHESHOW]
show cache contents, dont perform collection or tests. Optional argument: glob (default: *).
--cache-clear remove all cache contents at start of test run.
--lfnf=all,none, --last-failed-no-failures=all,none
which tests to run with no previously (known) failures.
--sw, --stepwise exit on test failure and continue from last failing test next time
--sw-skip, --stepwise-skip
ignore the first failing test but stop on the next failing test
--allure-severities=SEVERITIES_SET
Comma-separated list of severity names.
Tests only with these severities will be run.
Possible values are: blocker, critical, normal, minor, trivial.
--allure-epics=EPICS_SET
Comma-separated list of epic names.
Run tests that have at least one of the specified feature labels.
--allure-features=FEATURES_SET
Comma-separated list of feature names.
Run tests that have at least one of the specified feature labels.
--allure-stories=STORIES_SET
Comma-separated list of story names.
Run tests that have at least one of the specified story labels.
--allure-link-pattern=LINK_TYPE:LINK_PATTERN
Url pattern for link type. Allows short links in test,
like issue-1. Text will be formatted to full url with python
str.format().
reporting:
--durations=N show N slowest setup/test durations (N=0 for all).
--durations-min=N Minimal duration in seconds for inclusion in slowest list. Default 0.005
-v, --verbose increase verbosity.
--no-header disable header
--no-summary disable summary
-q, --quiet decrease verbosity.
--verbosity=VERBOSE set verbosity. Default is 0.
-r chars show extra test summary info as specified by chars: (f)ailed, (E)rror, (s)kipped, (x)failed,
(X)passed, (p)assed, (P)assed with output, (a)ll except passed (p/P), or (A)ll. (w)arnings are
enabled by default (see --disable-warnings), N can be used to reset the list. (default: fE).
--disable-warnings, --disable-pytest-warnings
disable warnings summary
-l, --showlocals show locals in tracebacks (disabled by default).
--tb=style traceback print mode (auto/long/short/line/native/no).
--show-capture=no,stdout,stderr,log,all
Controls how captured stdout/stderr/log is shown on failed tests. Default is all.
--full-trace dont cut any tracebacks (default is to cut).
--color=color color terminal output (yes/no/auto).
--code-highlight=yes,no
Whether code should be highlighted (only if --color is also enabled)
--pastebin=mode send failed|all info to bpaste.net pastebin service.
--junit-xml=path create junit-xml style report file at given path.
--junit-prefix=str prepend prefix to classnames in junit-xml output
--html=path create html report file at given path.
--self-contained-html
create a self-contained html file containing all necessary styles, scripts, and images - this
means that the report may not render or function where CSP restrictions are in place (see
https://developer.mozilla.org/docs/Web/Security/CSP)
--css=path append given css file content to report style file.
pytest-warnings:
-W PYTHONWARNINGS, --pythonwarnings=PYTHONWARNINGS
set which warnings to report, see -W option of python itself.
--maxfail=num exit after first num failures or errors.
--strict-config any warnings encountered while parsing the `pytest` section of the configuration file raise
errors.
--strict-markers markers not registered in the `markers` section of the configuration file raise errors.
--strict (deprecated) alias to --strict-markers.
-c file load configuration from `file` instead of trying to locate one of the implicit configuration
files.
--continue-on-collection-errors
Force test execution even if collection errors occur.
--rootdir=ROOTDIR Define root directory for tests. Can be relative path: root_dir, ./root_dir,
root_dir/another_dir/; absolute path: /home/user/root_dir; path with variables:
$HOME/root_dir.
collection:
--collect-only, --co only collect tests, dont execute them.
--pyargs try to interpret all arguments as python packages.
--ignore=path ignore path during collection (multi-allowed).
--ignore-glob=path ignore path pattern during collection (multi-allowed).
--deselect=nodeid_prefix
deselect item (via node id prefix) during collection (multi-allowed).
--confcutdir=dir only load conftest.pys relative to specified dir.
--noconftest Dont load any conftest.py files.
--keep-duplicates Keep duplicate tests.
--collect-in-virtualenv
Dont ignore tests in a local virtualenv directory
--import-mode=prepend,append,importlib
prepend/append to sys.path when importing test modules and conftest files, default is to
prepend.
--doctest-modules run doctests in all .py modules
--doctest-report=none,cdiff,ndiff,udiff,only_first_failure
choose another output format for diffs on doctest failure
--doctest-glob=pat doctests file matching pattern, default: test*.txt
--doctest-ignore-import-errors
ignore doctest ImportErrors
--doctest-continue-on-failure
for a given doctest, continue to run after the first failure
test session debugging and configuration:
--basetemp=dir base temporary directory for this test run.(warning: this directory is removed if it exists)
-V, --version display pytest version and information about plugins.When given twice, also display information
about plugins.
-h, --help show help message and configuration info
-p name early-load given plugin module name or entry point (multi-allowed).
To avoid loading of plugins, use the `no:` prefix, e.g. `no:doctest`.
--trace-config trace considerations of conftest.py files.
--debug store internal tracing debug information in pytestdebug.log.
-o OVERRIDE_INI, --override-ini=OVERRIDE_INI
override ini option with "option=value" style, e.g. `-o xfail_strict=True -o cache_dir=cache`.
--assert=MODE Control assertion debugging tools.
plain performs no assertion debugging.
rewrite (the default) rewrites assert statements in test modules on import to provide assert
expression information.
--setup-only only setup fixtures, do not execute tests.
--setup-show show setup of fixtures while executing tests.
--setup-plan show what fixtures and tests would be executed but dont execute anything.
logging:
--log-level=LEVEL level of messages to catch/display.
Not set by default, so it depends on the root/parent log handlers effective level, where it is
"WARNING" by default.
--log-format=LOG_FORMAT
log format as used by the logging module.
--log-date-format=LOG_DATE_FORMAT
log date format as used by the logging module.
--log-cli-level=LOG_CLI_LEVEL
cli logging level.
--log-cli-format=LOG_CLI_FORMAT
log format as used by the logging module.
--log-cli-date-format=LOG_CLI_DATE_FORMAT
log date format as used by the logging module.
--log-file=LOG_FILE path to a file when logging will be written to.
--log-file-level=LOG_FILE_LEVEL
log file logging level.
--log-file-format=LOG_FILE_FORMAT
log format as used by the logging module.
--log-file-date-format=LOG_FILE_DATE_FORMAT
log date format as used by the logging module.
--log-auto-indent=LOG_AUTO_INDENT
Auto-indent multiline messages passed to the logging module. Accepts true|on, false|off or an
integer.
reporting:
--alluredir=DIR Generate Allure report in the specified directory (may not exist)
--clean-alluredir Clean alluredir folder if it exists
--allure-no-capture Do not attach pytest captured logging/stdout/stderr to report
coverage reporting with distributed testing support:
--cov=[SOURCE] Path or package name to measure during execution (multi-allowed). Use --cov= to not do any
source filtering and record everything.
--cov-report=TYPE Type of report to generate: term, term-missing, annotate, html, xml (multi-allowed). term, term-
missing may be followed by ":skip-covered". annotate, html and xml may be followed by ":DEST"
where DEST specifies the output location. Use --cov-report= to not generate any output.
--cov-config=PATH Config file for coverage. Default: .coveragerc
--no-cov-on-fail Do not report coverage if test run fails. Default: False
--no-cov Disable coverage report completely (useful for debuggers). Default: False
--cov-fail-under=MIN Fail if the total coverage is less than MIN.
--cov-append Do not delete coverage but append to current. Default: False
--cov-branch Enable branch coverage.
--cov-context=CONTEXT
Dynamic contexts to use. "test" for now.
forked subprocess test execution:
--forked box each test run in a separate process (unix)
re-run failing tests to eliminate flaky failures:
--only-rerun=ONLY_RERUN
If passed, only rerun errors matching the regex provided. Pass this flag multiple times to
accumulate a list of regexes to match
--reruns=RERUNS number of times to re-run failed tests. defaults to 0.
--reruns-delay=RERUNS_DELAY
add time (seconds) delay between reruns.
--rerun-except=RERUN_EXCEPT
If passed, only rerun errors other than matching the regex provided. Pass this flag multiple
times to accumulate a list of regexes to match
distributed and subprocess testing:
-n numprocesses, --numprocesses=numprocesses
shortcut for --dist=load --tx=NUM*popen, you can use auto here for auto detection CPUs
number on host system and it will be 0 when used with --pdb
--maxprocesses=maxprocesses
limit the maximum number of workers to process the tests when using --numprocesses=auto
--max-worker-restart=MAXWORKERRESTART, --max-slave-restart=MAXWORKERRESTART
maximum number of workers that can be restarted when crashed (set to zero to disable this
feature)
--max-slave-restart option is deprecated and will be removed in a future release
--dist=distmode set mode for distributing tests to exec environments.
each: send each test to all available environments.
load: load balance by sending any pending test to any available environment.
loadscope: load balance by sending pending groups of tests in the same scope to any available
environment.
loadfile: load balance by sending test grouped by file to any available environment.
(default) no: run tests inprocess, dont distribute.
--tx=xspec add a test execution environment. some examples: --tx popen//python=python2.5 --tx
socket=192.168.1.102:8888 --tx ssh=user@codespeak.net//chdir=testcache
-d load-balance tests. shortcut for --dist=load
--rsyncdir=DIR add directory for rsyncing to remote tx nodes.
--rsyncignore=GLOB add expression for ignores when rsyncing to remote tx nodes.
--boxed backward compatibility alias for pytest-forked --forked
-f, --looponfail run tests in subprocess, wait for modified files and re-run failing test set until all pass.
custom options:
--metadata=key value additional metadata.
--count=COUNT Number of times to repeat each test
--repeat-scope=function,class,module,session
Scope for repeating tests
[pytest] ini-options in the first pytest.ini|tox.ini|setup.cfg file found:
markers (linelist): markers for test functions
empty_parameter_set_mark (string):
default marker for empty parametersets
norecursedirs (args): directory patterns to avoid for recursion
testpaths (args): directories to search for tests when no files or directories are given in the command line.
filterwarnings (linelist):
Each line specifies a pattern for warnings.filterwarnings. Processed after -W/--pythonwarnings.
usefixtures (args): list of default fixtures to be used with this project
python_files (args): glob-style file patterns for Python test module discovery
python_classes (args):
prefixes or glob names for Python test class discovery
python_functions (args):
prefixes or glob names for Python test function and method discovery
disable_test_id_escaping_and_forfeit_all_rights_to_community_support (bool):
disable string escape non-ascii characters, might cause unwanted side effects(use at your own
risk)
console_output_style (string):
console output: "classic", or with additional progress information ("progress" (percentage) |
"count").
xfail_strict (bool): default for the strict parameter of xfail markers when not given explicitly (default: False)
enable_assertion_pass_hook (bool):
Enables the pytest_assertion_pass hook.Make sure to delete any previously generated pyc cache
files.
junit_suite_name (string):
Test suite name for JUnit report
junit_logging (string):
Write captured log messages to JUnit report: one of no|log|system-out|system-err|out-err|all
junit_log_passing_tests (bool):
Capture log information for passing tests to JUnit report:
junit_duration_report (string):
Duration time to report: one of total|call
junit_family (string):
Emit XML for schema: one of legacy|xunit1|xunit2
doctest_optionflags (args):
option flags for doctests
doctest_encoding (string):
encoding used for doctest files
cache_dir (string): cache directory path.
log_level (string): default value for --log-level
log_format (string): default value for --log-format
log_date_format (string):
default value for --log-date-format
log_cli (bool): enable log display during test run (also known as "live logging").
log_cli_level (string):
default value for --log-cli-level
log_cli_format (string):
default value for --log-cli-format
log_cli_date_format (string):
default value for --log-cli-date-format
log_file (string): default value for --log-file
log_file_level (string):
default value for --log-file-level
log_file_format (string):
default value for --log-file-format
log_file_date_format (string):
default value for --log-file-date-format
log_auto_indent (string):
default value for --log-auto-indent
faulthandler_timeout (string):
Dump the traceback of all threads if a test takes more than TIMEOUT seconds to finish.
addopts (args): extra command line options
minversion (string): minimally required pytest version
required_plugins (args):
plugins that must be present for pytest to run
rsyncdirs (pathlist): list of (relative) paths to be rsynced for remote distributed testing.
rsyncignore (pathlist):
list of (relative) glob-style paths to be ignored for rsyncing.
looponfailroots (pathlist):
directories to check for changes
environment variables:
PYTEST_ADDOPTS extra command line options
PYTEST_PLUGINS comma-separated plugins to load during startup
PYTEST_DISABLE_PLUGIN_AUTOLOAD set to disable plugin auto-loading
PYTEST_DEBUG set to enable debug tracing of pytests internals
to see available markers type: pytest --markers
to see available fixtures type: pytest --fixtures
(shown according to specified file_or_dir or current dir if not specified; fixtures with leading _ are only shown with the -v option
- 其中
pytest.ini
选项内容如下:
[pytest] ini-options in the first pytest.ini|tox.ini|setup.cfg file found:
markers (linelist): markers for test functions
empty_parameter_set_mark (string):
default marker for empty parametersets
norecursedirs (args): directory patterns to avoid for recursion
testpaths (args): directories to search for tests when no files or directories are given in the command line.
filterwarnings (linelist):
Each line specifies a pattern for warnings.filterwarnings. Processed after -W/--pythonwarnings.
usefixtures (args): list of default fixtures to be used with this project
python_files (args): glob-style file patterns for Python test module discovery
python_classes (args):
prefixes or glob names for Python test class discovery
python_functions (args):
prefixes or glob names for Python test function and method discovery
disable_test_id_escaping_and_forfeit_all_rights_to_community_support (bool):
disable string escape non-ascii characters, might cause unwanted side effects(use at your own
risk)
console_output_style (string):
console output: "classic", or with additional progress information ("progress" (percentage) |
"count").
xfail_strict (bool): default for the strict parameter of xfail markers when not given explicitly (default: False)
enable_assertion_pass_hook (bool):
Enables the pytest_assertion_pass hook.Make sure to delete any previously generated pyc cache
files.
junit_suite_name (string):
Test suite name for JUnit report
junit_logging (string):
Write captured log messages to JUnit report: one of no|log|system-out|system-err|out-err|all
junit_log_passing_tests (bool):
Capture log information for passing tests to JUnit report:
junit_duration_report (string):
Duration time to report: one of total|call
junit_family (string):
Emit XML for schema: one of legacy|xunit1|xunit2
doctest_optionflags (args):
option flags for doctests
doctest_encoding (string):
encoding used for doctest files
cache_dir (string): cache directory path.
log_level (string): default value for --log-level
log_format (string): default value for --log-format
log_date_format (string):
default value for --log-date-format
log_cli (bool): enable log display during test run (also known as "live logging").
log_cli_level (string):
default value for --log-cli-level
log_cli_format (string):
default value for --log-cli-format
log_cli_date_format (string):
default value for --log-cli-date-format
log_file (string): default value for --log-file
log_file_level (string):
default value for --log-file-level
log_file_format (string):
default value for --log-file-format
log_file_date_format (string):
default value for --log-file-date-format
log_auto_indent (string):
default value for --log-auto-indent
faulthandler_timeout (string):
Dump the traceback of all threads if a test takes more than TIMEOUT seconds to finish.
addopts (args): extra command line options
minversion (string): minimally required pytest version
required_plugins (args):
plugins that must be present for pytest to run
rsyncdirs (pathlist): list of (relative) paths to be rsynced for remote distributed testing.
rsyncignore (pathlist):
list of (relative) glob-style paths to be ignored for rsyncing.
looponfailroots (pathlist):
directories to check for changes
4 存放位置
- 名称必须为
pytest.ini
,放置于项目根目录下。
5 常用选项
5.1 marks
- 以下是使用
@pytest.mark.xxx
方法:
# -*- coding:utf-8 -*-
# 作者:虫无涯
# 日期:2023/3/15
# 文件名称:test_ini.py
# 作用:pytest.ini的使用
import pytest
@pytest.mark.name
def one_name():
print("name is xiaoming")
@pytest.mark.old
def two_old():
print("old is 20")
def th_weight():
print("weight is 50")
@pytest.mark.case
class TestCase:
def test_case_01(self):
print("case_01")
def test_case_02(self):
print("case_02")
if __name__ == __main__:
pytest.main(["-v", "test_ini.py", "-m=case"])
- 标签多容易出错,可以写入到
pytest.ini
:
# pytest.ini
[pytest]
markers =
name: run the name
old: run the old
case: run the test_case
- 标记后可使用
pytest --markers
查看:
(venv) F:\\pytest_study\\test_case\\test_i>pytest --markers
@pytest.mark.name: run the name
@pytest.mark.old: run the old
@pytest.mark.case: run the test_case
@pytest.mark.forked: Always fork for this test.
@pytest.mark.flaky(reruns=1, reruns_delay=0): mark test to re-run up to reruns times. Add a delay of rerun
s_delay seconds between re-runs.
@pytest.mark.repeat(n): run the given test function `n` times.
@pytest.mark.run: specify ordering information for when tests should run in relation to one another. Provided
by pytest-ordering. See also: http://pytest-ordering.readthedocs.org/
@pytest.mark.no_cover: disable coverage for this test.
@pytest.mark.allure_label: allure label marker
@pytest.mark.allure_link: allure link marker
@pytest.mark.allure_display_name: allure test name marker
@pytest.mark.allure_description: allure description
@pytest.mark.allure_description_html: allure description html
@pytest.mark.filterwarnings(warning): add a warning filter to the given test. see https://docs.pytest.org/en/
stable/warnings.html#pytest-mark-filterwarnings
@pytest.mark.skip(reason=None): skip the given test function with an optional reason. Example: skip(reason="n
o way of currently testing this") skips the test.
@pytest.mark.skipif(condition, ..., *, reason=...): skip the given test function if any of the conditions eva
luate to True. Example: skipif(sys.platform == win32) skips the test if we are on the win32 platform. See h
ttps://docs.pytest.org/en/stable/reference.html#pytest-mark-skipif
@pytest.mark.xfail(condition, ..., *, reason=..., run=True, raises=None, strict=xfail_strict): mark the test
function as an expected failure if any of the conditions evaluate to True. Optionally specify a reason for be
tter reporting and run=False if you dont even want to execute the test function. If only specific exception(
s) are expected, you can list them in raises, and if the test fails in other ways, it will be reported as a t
rue failure. See https://docs.pytest.org/en/stable/reference.html#pytest-mark-xfail
@pytest.mark.parametrize(argnames, argvalues): call a test function multiple times passing in different argum
ents in turn. argvalues generally needs to be a list of values if argnames specifies only one name or a list
of tuples of values if argnames specifies multiple names. Example: @parametrize(arg1, [1,2]) would lead to
two calls of the decorated test function, one with arg1=1 and another with arg1=2.see https://docs.pytest.org
/en/stable/parametrize.html for more info and examples.
@pytest.mark.usefixtures(fixturename1, fixturename2, ...): mark tests as needing all of the specified fixture
s. see https://docs.pytest.org/en/stable/fixture.html#usefixtures
@pytest.mark.tryfirst: mark a hook implementation function such that the plugin machinery will try to call it
first/as early as possible.
@pytest.mark.trylast: mark a hook implementation function such that the plugin machinery will try to call it
last/as late as possible.
5.2 xfail_strict
- 设置
xfail_strict = True
可以让那些标记为@pytest.mark.xfail
但实际通过显示XPASS
的测试用例被报告标记为失败; - pytest.ini的写法:
[pytest]
markers =
name: run the name
old: run the old
case: run the test_case
xfail_strict = True
- 代码为:
# -*- coding:utf-8 -*-
# 作者:虫无涯
# 日期:2023/3/15
# 文件名称:test_ini01.py
# 作用:pytest.ini的使用
import pytest
@pytest.mark.name
def test_name():
print("name is xiaoming")
@pytest.mark.old
def test_old():
print("old is 20")
@pytest.mark.xfail()
def test_weight():
a = 30
b = 60
assert a != b
@pytest.mark.case
class TestCase:
def test_case_01(self):
print("case_01")
def test_case_02(self):
print("case_02")
if __name__ == __main__:
pytest.main(["-v", "test_ini01.py", "-m=case"])
- 结果如下,可以看到测试结果为失败:
test_ini01.py::test_name PASSED [ 20%]name is xiaoming
test_ini01.py::test_old PASSED [ 40%]old is 20
test_ini01.py::test_weight FAILED [ 60%]
test_case\\test_i\\test_ini01.py:18 (test_weight)
[XPASS(strict)]
test_ini01.py::TestCase::test_case_01 PASSED [ 80%]case_01
test_ini01.py::TestCase::test_case_02 PASSED [100%]case_02
================================== FAILURES ===================================
_________________________________ test_weight _________________________________
[XPASS(strict)]
=========================== short test summary info ===========================
FAILED test_ini01.py::test_weight
========================= 1 failed, 4 passed in 0.05s =========================
5.3 addopts
addopts
参数可以更改默认命令行选项;- 比如测试完生成报告,失败重跑3次,一共运行2次,通过分布式去测试:
addopts = -v --reruns=2 --count=2 --html=reports.html --self-contained-html -n=auto
- 把以上命令加入
pytest.ini
,就不用在命令行重复去写这些参数:
[pytest]
markers =
name: run the name
old: run the old
case: run the test_case
xfail_strict = True
addopts = -v --reruns=2 --count=2 --html=reports.html --self-contained-html -n=auto
- 运行结果:
test_ini01.py::test_old[1-2]
test_ini01.py::test_old[2-2]
test_ini01.py::test_weight[1-2]
test_ini01.py::test_weight[2-2]
test_ini01.py::test_name[1-2]
test_ini01.py::TestCase::test_case_01[2-2]
test_ini01.py::test_name[2-2]
test_ini01.py::TestCase::test_case_01[1-2]
[gw3] [ 10%] PASSED test_ini01.py::test_old[2-2]
[gw6] [ 20%] PASSED test_ini01.py::TestCase::test_case_01[1-2]
[gw2] [ 30%] PASSED test_ini01.py::test_old[1-2]
[gw0] [ 40%] PASSED test_ini01.py::test_name[1-2]
test_ini01.py::TestCase::test_case_02[1-2]
[gw0] [ 50%] PASSED test_ini01.py::TestCase::test_case_02[1-2]
[gw1] [ 60%] PASSED test_ini01.py::test_name[2-2]
test_ini01.py::TestCase::test_case_02[2-2]
[gw7] [ 70%] PASSED test_ini01.py::TestCase::test_case_01[2-2]
[gw1] [ 80%] PASSED test_ini01.py::TestCase::test_case_02[2-2]
[gw5] [ 90%] RERUN test_ini01.py::test_weight[2-2]
test_ini01.py::test_weight[2-2]
[gw4] [100%] RERUN test_ini01.py::test_weight[1-2]
test_ini01.py::test_weight[1-2]
[gw5] [100%] RERUN test_ini01.py::test_weight[2-2]
test_ini01.py::test_weight[2-2]
[gw5] [100%] FAILED test_ini01.py::test_weight[2-2]
test_case\\test_i\\test_ini01.py:18 (test_weight[2-2])
[XPASS(strict)]
[gw4] [100%] RERUN test_ini01.py::test_weight[1-2]
test_ini01.py::test_weight[1-2]
[gw4] [100%] FAILED test_ini01.py::test_weight[1-2]
test_case\\test_i\\test_ini01.py:18 (test_weight[1-2])
[XPASS(strict)]
================================== FAILURES ===================================
______________________________ test_weight[2-2] _______________________________
[gw5] win32 -- Python 3.7.0 F:\\pytest_study\\venv\\Scripts\\python.exe
[XPASS(strict)]
______________________________ test_weight[1-2] _______________________________
[gw4] win32 -- Python 3.7.0 F:\\pytest_study\\venv\\Scripts\\python.exe
[XPASS(strict)]
-- generated html file: file://F:\\pytest_study\\test_case\\test_i\\reports.html --
=========================== short test summary info ===========================
FAILED test_ini01.py::test_weight[2-2]
FAILED test_ini01.py::test_weight[1-2]
==================== 2 failed, 8 passed, 4 rerun in 3.11s =====================
addopts
常用参数:
参数 | 说明 |
---|---|
-s |
表示输出调试信息,用于显示测试函数中print() 打印的信息 |
-v |
未加前只打印模块名,加v后打印类名、模块名、方法名,显示更详细的信息 |
-q |
表示只显示整体测试结果 |
-vs |
这两个参数可以一起使用 |
-n |
支持多线程或者分布式运行测试用例(前提需安装pytest-xdist 插件) |
-html |
生成html 的测试报告(前提需安装pytest-html 插件) 如:pytest -vs --html ./reports/result.html |
5.4 log_cli
- 控制台实时输出日志;
log_cli=True
或False
(默认);log_cli=True
:
collecting ... collected 5 items
test_ini01.py::test_name PASSED [ 20%]name is xiaoming
test_ini01.py::test_old PASSED [ 40%]old is 20
test_ini01.py::test_weight FAILED [ 60%]
test_case\\test_i\\test_ini01.py:18 (test_weight)
[XPASS(strict)]
test_ini01.py::TestCase::test_case_01 PASSED [ 80%]case_01
test_ini01.py::TestCase::test_case_02 PASSED [100%]case_02
================================== FAILURES ===================================
_________________________________ test_weight _________________________________
[XPASS(strict)]
=========================== short test summary info ===========================
FAILED test_ini01.py::test_weight
========================= 1 failed, 4 passed in 0.05s =========================
- 加了
log_cli=True
之后,可以清晰看到哪个package
、module
下的用例执行情况。
5.5 norecursedirs
- pytest 收集测试用例时,会递归遍历所有子目录;
- 如果有些目录不需要执行,可使用
norecursedirs
参数简化pytest
的搜索工作; - 方法如下,多个路径用空格隔开:
norecursedirs = .* build dist CVS _darcs arch *.egg
- 比如:
[pytest]
markers =
name: run the name
old: run the old
case: run the test_case
xfail_strict = True
# addopts = -v --reruns=2 --count=2 --html=reports.html --self-contained-html -n=auto
log_cli = False
norecursedirs = .* build dist CVS _darcs arch *.egg report test_case log
- 也可以使用
norecursedirs
修改pytest的默认用例收集规则; - 其中默认用例收集规则为:
文件名以 test_*.py 文件和 *_test.py
以test_ 开头的函数
以Test 开头的类,不能包含 __init__ 方法
以test_ 开头的类里面的方法
- 比如修改为:
[pytest]
python_files = test* test_* *_test
python_classes = Test* test*
python_functions = test_* test*
6 本文涉及的pytest.ini源码
[pytest]
markers =
name: run the name
old: run the old
case: run the test_case
xfail_strict = True
addopts = -v --reruns=2 --count=2 --html=reports.html --self-contained-html -n=auto
log_cli = False
norecursedirs = .* build dist CVS _darcs arch *.egg report test_case log
python_files = test* test_* *_test
python_classes = Test* test*
python_functions = test_* test*
以上是关于Pytest的主要内容,如果未能解决你的问题,请参考以下文章
pytest学习和使用18-pytest.ini配置文件如何使用?