pytest基本用法总结

参考官方文档:https://docs.pytest.org/en/stable/contents.html#toc

1、安装

命令行pip install pytest
pycharm安装
下载pytest包,python setup.py install

2、start

先创建一个简单的用例:
def func(x):
return x + 1
def test_answer():
assert func(3) == 5
注意:用例的名字必须是test开头,如果写在类里面则需要类以Test开头命名:
查看下述代码运行结果说明上面的解释:
代码:


def func(x):
    return x + 1

def testanswer():
    assert func(3) == 4

def add_test():
    assert 3-1==2

class A:
    def test_div( self ):
        assert 9/3==3

class TestA:
    def test_x( self ):
        assert 3*6==18
    def ddf( self ):
        assert 1==1

运行结果:

C:\Users\18566\Desktop\APPAutoTest\pytest_leran>pytest -v
Test session starts (platform: win32, Python 3.8.1, pytest 5.4.3, pytest-sugar 0.9.4)
cachedir: .pytest_cache
metadata: {'Python': '3.8.1', 'Platform': 'Windows-10-10.0.18362-SP0', 'Packages': {'pytest': '5.4.3', 'py': '1.9.0', 'pluggy': '0.13.1'}, 'Plugins': {'allure-pytest': '2.8.16', 'assume': '2.2.1', 'cov':
 '2.10.0', 'emoji': '0.2.0', 'forked': '1.2.0', 'html': '2.1.1', 'metadata': '1.10.0', 'ordering': '0.6', 'repeat': '0.8.0', 'rerunfailures': '9.0', 'sugar': '0.9.4', 'timeout': '1.4.1', 'xdist': '1.33.0
'}, 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_202'}
rootdir: C:\Users\18566\Desktop\APPAutoTest\pytest_leran
plugins: allure-pytest-2.8.16, assume-2.2.1, cov-2.10.0, emoji-0.2.0, forked-1.2.0, html-2.1.1, metadata-1.10.0, ordering-0.6, repeat-0.8.0, rerunfailures-9.0, sugar-0.9.4, timeout-1.4.1, xdist-1.33.0
collecting ... 
 test_sample.py::testanswer ✓                                                                                                                                                                50% █████
     
 test_sample.py::TestA.test_x ✓                                                                                                                                                             100% █████
█████

Results (0.18s):
       2 passed

查看用例只收集了test开头的用例和Test开头的类(类里面也是查找test开头的方法)的用例。
100%显示已经执行完成所有的用例。
运行方式可以直接在pycharm里面或者IDE等工具进入terminal执行pytest可以直接找到符合命名规则的用例并执行。
指定测试用例文件则pytest 文件名
每个收集的测试都分配有一个唯一的nodeid名称,该名称由模块文件名后跟说明符(例如类名,函数名和参数化参数)组成,并用::字符分隔
指定测试文件具体的测试函数则 pytest 文件名::测试函数名
指定测试文件具体的测试类 pytest 文件名::类名
指定测试文件具体的测试方法 pytest 文件名::类名::方法名
如果不指定则默认在当前目录查看所有符合的用例。
没有特殊指定,以test_.py或者_test.py的文件都会被作为测试用例文件。

2.1 pytest遇到失败直接停止

pytest -x
遇到失败直接停止

2.2 pytest遇到失败停止设置失败次数

pytest --maxfail==2
遇到2次失败则停止

2.3 pytest通过关键字表达式运行测试

pytest -k “Myclass and not method”
运行myClass的类且不运行method名字的方法的
这个myclass和method的名字不区分大小写
上面的示例将运行,TestMyClass.test_something 但不会运行TestMyClass.test_method_simple

2.4pytest通过标记表达式运行测试

pytest -m slow
将运行用@pytest.mark.slow装饰器装饰的所有测试

2.5 pytest带参数运行输出 详细的结果

pytest -r
在测试会话结束时显示“简短的测试摘要信息”,从而使得在大型测试套件中轻松获得所有失败,跳过,xfails等的清晰画面
-r选项后面接受多个字符
适配的字符有:
这是可以使用的可用字符的完整列表:

f -失败

E -错误

s -跳过

x -xfailed

X -xpass

p -通过

P -通过输出

a -除 pP

A -全部

N-无,可用于不显示任何内容(fE默认设置)

比如:
仅查看失败和跳过的测试:pytest -rfs
仅查看所有通过的测试:pytest -rp

2.6 分析测试执行持续时间

获取最慢的10个测试持续时间的列表:
pytest --durations=10
默认情况下,除非-vv(打印详细信息)在命令行传递,否则pytest不会显示太短执行的执行时间,比如<0.01s.

2.7 从Python代码中调用pytest

上述介绍了一部分命令参数,但是都是直接在命令行执行的。在python中执行则需要导入pytest,然后用pytest.main()函数执行。
传递参数则是向main传入一个列表,如下格式:
pytest.main(["-v","-s",“class::fucntion”])

3 pytest fixtures不加参数调用

pytest fixture是对setup和teardown的提升。
之前unittest setup和teardown是针对测试用例前准备环境和测试用例执行后销毁环境,或者是setup_class和teardown_class。
fixtures可以声明是在test的函数、模块、类或者整个session生效。
fixtures也可以进行参数化,测试用例通过配置和选项运行fixtures,fixtures可以在不同用例多次调用。
fixtures定义是用装饰器@pytest.fixture
简单例子示例:
test_smtpsimple.py


```css
import pytest
@pytest.fixture
def smtp_connection():
    import smtplib
    return smtplib.SMTP("smtp.qiye.163.com", 25, timeout=15)
def test_ehlo(smtp_connection):
    response, msg = smtp_connection.ehlo()
    print(response,msg)
    assert response == 250
    assert 0  # for demo purposes

上述是一种使用fixture的方式,smtp_connection用装饰器@pytest.fixture
在测试用例test_ehlo中调用smtp_connection,这种方式可以在test_ehlo调用smtp_connection的方法或者参数等.
当运行pytest时会自动去找@pytest.fixture装饰器装饰的函数
运行结果如下:

C:\Users\18566\Desktop\APPAutoTest\pytest_leran>pytest -vv
Test session starts (platform: win32, Python 3.8.1, pytest 5.4.3, pytest-sugar 0.9.4)
cachedir: .pytest_cache
metadata: {'Python': '3.8.1', 'Platform': 'Windows-10-10.0.18362-SP0', 'Packages': {'pytest': '5.4.3', 'py': '1.9.0', 'pluggy': '0.13.1'}, 'Plugins': {'allure-pytest': '2.8.16', 'assume': '2.2.1', 'cov':
 '2.10.0', 'emoji': '0.2.0', 'forked': '1.2.0', 'html': '2.1.1', 'metadata': '1.10.0', 'ordering': '0.6', 'repeat': '0.8.0', 'rerunfailures': '9.0', 'sugar': '0.9.4', 'timeout': '1.4.1', 'xdist': '1.33.0
'}, 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_202'}
rootdir: C:\Users\18566\Desktop\APPAutoTest\pytest_leran
plugins: allure-pytest-2.8.16, assume-2.2.1, cov-2.10.0, emoji-0.2.0, forked-1.2.0, html-2.1.1, metadata-1.10.0, ordering-0.6, repeat-0.8.0, rerunfailures-9.0, sugar-0.9.4, timeout-1.4.1, xdist-1.33.0
collecting ... 

――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― test_ehlo ―
―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

smtp_connection = <smtplib.SMTP object at 0x000001AEA239A580>

    def test_ehlo(smtp_connection):
        response, msg = smtp_connection.ehlo()
        print(response,msg)
        assert response == 250
>       assert 0  # for demo purposes
E       assert 0

test_sample.py:36: AssertionError
------------------------------------------------------------------------------------------ Captured stdout call ------------------------------------------------------------------------------------------
250 b'proxy-sm-thq-2.hmbj.internal\nPIPELINING\n8BITMIME\nAUTH=LOGIN PLAIN\nAUTH PLAIN LOGIN\nSTARTTLS'

 test_sample.py::test_ehlo ⨯                                                                                                                                                                100% █████
█████
======================================================================================== short test summary info =========================================================================================
FAILED test_sample.py::test_ehlo - assert 0

Results (0.97s):
       1 failed
         - test_sample.py:32 test_ehlo

上述使用assert进行了断言,从运行结果可知可以进行多个断言,如果某一个断言出错,则判断这个用例结果是fail.
解读整个过程:
1、pytest运行先去运行符合规则的用例,test***,这个例子是test_ehlo
2、test用例函数形参是smtp_connection,在查找fixture标记的函数时找到定义的fixture函数
3、smtp_connection被调用
4、运行test_ehlo里面的命令,assert 0导致断言失败

这里需要注意的是:如果没有在test形参里面写入fixture的函数名或者是写的是一个不存在的fixture函数名,将会引发错误,并打印一个可用的fixture列表。将上述引用的smtp_connection修改为smtp_connection1运行结果如下:

C:\Users\18566\Desktop\APPAutoTest\pytest_leran>pytest -vv
Test session starts (platform: win32, Python 3.8.1, pytest 5.4.3, pytest-sugar 0.9.4)
cachedir: .pytest_cache
metadata: {'Python': '3.8.1', 'Platform': 'Windows-10-10.0.18362-SP0', 'Packages': {'pytest': '5.4.3', 'py': '1.9.0', 'pluggy': '0.13.1'}, 'Plugins': {'allure-pytest': '2.8.16', 'assume': '2.2.1', 'cov':
 '2.10.0', 'emoji': '0.2.0', 'forked': '1.2.0', 'html': '2.1.1', 'metadata': '1.10.0', 'ordering': '0.6', 'repeat': '0.8.0', 'rerunfailures': '9.0', 'sugar': '0.9.4', 'timeout': '1.4.1', 'xdist': '1.33.0
'}, 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_202'}
rootdir: C:\Users\18566\Desktop\APPAutoTest\pytest_leran
plugins: allure-pytest-2.8.16, assume-2.2.1, cov-2.10.0, emoji-0.2.0, forked-1.2.0, html-2.1.1, metadata-1.10.0, ordering-0.6, repeat-0.8.0, rerunfailures-9.0, sugar-0.9.4, timeout-1.4.1, xdist-1.33.0
collecting ... 

―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― ERROR at setup of test_ehlo ―
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
file C:\Users\18566\Desktop\APPAutoTest\pytest_leran\test_sample.py, line 32
  def test_ehlo(smtp_connection1):
E       fixture 'smtp_connection1' not found
>       available fixtures: __pytest_repeat_step_number, cache, capfd, capfdbinary, caplog, capsys, capsysbinary, cov, doctest_namespace, extra, metadata, monkeypatch, no_cover, pytestconfig, record_prop
erty, record_testsuite_property, record_xml_attribute, recwarn, smtp_connection, testrun_uid, tmp_path, tmp_path_factory, tmpdir, tmpdir_factory, worker_id
>       use 'pytest --fixtures [testpath]' for help on them.

C:\Users\18566\Desktop\APPAutoTest\pytest_leran\test_sample.py:32
                                                                                                                                                                                            100% █████
█████
======================================================================================== short test summary info =========================================================================================
FAILED test_sample.py::test_ehlo

Results (0.24s):
       1 error

运行结果显示没有找到fixture ‘smtp_connection1’ not found,然后显示了可用的fixture列表 available fixtures。
用pytest --fixtures [testpath]可以显示存在的fixture,并显示每一个fixture的描述,不加testpath则显示当前的目录支持的fixtures,运行结果如下:

C:\Users\18566\Desktop\APPAutoTest\pytest_leran>pytest --fixtures
Test session starts (platform: win32, Python 3.8.1, pytest 5.4.3, pytest-sugar 0.9.4)
rootdir: C:\Users\18566\Desktop\APPAutoTest\pytest_leran
plugins: allure-pytest-2.8.16, assume-2.2.1, cov-2.10.0, emoji-0.2.0, forked-1.2.0, html-2.1.1, metadata-1.10.0, ordering-0.6, repeat-0.8.0, rerunfailures-9.0, sugar-0.9.4, timeout-1.4.1, xdist-1.33.0
cache
    Return a cache object that can persist state between testing sessions.

    cache.get(key, default)
    cache.set(key, value)

    Keys must be a ``/`` separated value, where the first part is usually the
    name of your plugin or application to avoid clashes with other cache users.

    Values can be any object handled by the json stdlib module.

capsys
    Enable text capturing of writes to ``sys.stdout`` and ``sys.stderr``.

    The captured output is made available via ``capsys.readouterr()`` method
    calls, which return a ``(out, err)`` namedtuple.
    ``out`` and ``err`` will be ``text`` objects.

capsysbinary
    Enable bytes capturing of writes to ``sys.stdout`` and ``sys.stderr``.

    The captured output is made available via ``capsysbinary.readouterr()``
    method calls, which return a ``(out, err)`` namedtuple.
    ``out`` and ``err`` will be ``bytes`` objects.

capfd
    Enable text capturing of writes to file descriptors ``1`` and ``2``.

    The captured output is made available via ``capfd.readouterr()`` method
    calls, which return a ``(out, err)`` namedtuple.
    ``out`` and ``err`` will be ``text`` objects.

capfdbinary
    Enable bytes capturing of writes to file descriptors ``1`` and ``2``.

    The captured output is made available via ``capfd.readouterr()`` method
    calls, which return a ``(out, err)`` namedtuple.
    ``out`` and ``err`` will be ``byte`` objects.

doctest_namespace [session scope]
    Fixture that returns a :py:class:`dict` that will be injected into the namespace of doctests.

pytestconfig [session scope]
    Session-scoped fixture that returns the :class:`_pytest.config.Config` object.

    Example::

        def test_foo(pytestconfig):
            if pytestconfig.getoption("verbose") > 0:
                ...

record_property
    Add an extra properties the calling test.
    User properties become part of the test report and are available to the
    configured reporters, like JUnit XML.
    The fixture is callable with ``(name, value)``, with value being automatically
    xml-encoded.

    Example::

        def test_function(record_property):
            record_property("example_key", 1)

record_xml_attribute
    Add extra xml attributes to the tag for the calling test.
    The fixture is callable with ``(name, value)``, with value being
    automatically xml-encoded

record_testsuite_property [session scope]
    Records a new ``<property>`` tag as child of the root ``<testsuite>``. This is suitable to
    writing global information regarding the entire test suite, and is compatible with ``xunit2`` JUnit family.

    This is a ``session``-scoped fixture which is called with ``(name, value)``. Example:

    .. code-block:: python

        def test_foo(record_testsuite_property):
            record_testsuite_property("ARCH", "PPC")
            record_testsuite_property("STORAGE_TYPE", "CEPH")

    ``name`` must be a string, ``value`` will be converted to a string and properly xml-escaped.

caplog
    Access and control log capturing.

    Captured logs are available through the following properties/methods::

    * caplog.messages        -> list of format-interpolated log messages
    * caplog.text            -> string containing formatted log output
    * caplog.records         -> list of logging.LogRecord instances
    * caplog.record_tuples   -> list of (logger_name, level, message) tuples
    * caplog.clear()         -> clear captured records and formatted log output string

monkeypatch
    The returned ``monkeypatch`` fixture provides these
    helper methods to modify objects, dictionaries or os.environ::

        monkeypatch.setattr(obj, name, value, raising=True)
        monkeypatch.delattr(obj, name, raising=True)
        monkeypatch.setitem(mapping, name, value)
        monkeypatch.delitem(obj, name, raising=True)
        monkeypatch.setenv(name, value, prepend=False)
        monkeypatch.delenv(name, raising=True)
        monkeypatch.syspath_prepend(path)
        monkeypatch.chdir(path)

    All modifications will be undone after the requesting
    test function or fixture has finished. The ``raising``
    parameter determines if a KeyError or AttributeError
    will be raised if the set/deletion operation has no target.

recwarn
    Return a :class:`WarningsRecorder` instance that records all warnings emitted by test functions.

    See http://docs.python.org/library/warnings.html for information
    on warning categories.

tmpdir_factory [session scope]
    Return a :class:`_pytest.tmpdir.TempdirFactory` instance for the test session.


tmp_path_factory [session scope]
    Return a :class:`_pytest.tmpdir.TempPathFactory` instance for the test session.


tmpdir
    Return a temporary directory path object
    which is unique to each test function invocation,
    created as a sub directory of the base temporary
    directory.  The returned object is a `py.path.local`_
    path object.

    .. _`py.path.local`: https://py.readthedocs.io/en/latest/path.html

tmp_path
    Return a temporary directory path object
    which is unique to each test function invocation,
    created as a sub directory of the base temporary
    directory.  The returned object is a :class:`pathlib.Path`
    object.

    .. note::

        in python < 3.6 this is a pathlib2.Path


-------------------------------------------------------------------------------- fixtures defined from pytest_cov.plugin ---------------------------------------------------------------------------------
no_cover
    A pytest fixture to disable coverage.

cov
    A pytest fixture to provide access to the underlying coverage object.


-------------------------------------------------------------------------------- fixtures defined from pytest_html.plugin --------------------------------------------------------------------------------
extra
    Add details to the HTML reports.

    .. code-block:: python

        import pytest_html
        def test_foo(extra):
            extra.append(pytest_html.extras.url('http://www.example.com/'))


------------------------------------------------------------------------------ fixtures defined from pytest_metadata.plugin ------------------------------------------------------------------------------
metadata [session scope]
    Provide test session metadata


---------------------------------------------------------------------------------- fixtures defined from pytest_repeat -----------------------------------------------------------------------------------

----------------------------------------------------------------------------------- fixtures defined from xdist.plugin -----------------------------------------------------------------------------------
worker_id [session scope]
    Return the id of the current worker ('gw0', 'gw1', etc) or 'master'
    if running on the master node.

testrun_uid [session scope]
    Return the unique id of the current test.


----------------------------------------------------------------------------- fixtures defined from pytest_leran.test_sample -----------------------------------------------------------------------------
smtp_connection
    test_sample.py:27: no docstring available



Results (0.34s):

4 conftest.py+fixture

如果在测试过程中,fixture 函数需要在多个测试文件使用,此时应该把fixture函数写在conftest.py中。这种情况下不需要导入这个fixture到testcase,pytest会自动去发现。
查找fixture顺序是test classes–>test module–>conftest.py–>第三方插件
如何在用例之间共享测试数据:
1、把数据写在fixture里面
2、把数据添加到tests的文件夹,使用插件来帮助实现,插件分别是pytest-datadir或者pytest-datatfiles(后续补充用法)

4.1带参数的fixture

上述的fixture是所有的用例前都会执行,可以通过参数来限制fixture的作用域。
参数scope指定范围
@pytest(scope=“module”)
module—fixture在每个测试文件执行前执行一次
class—fixture在每一个测试类执行前执行都执行一次
function–fixture在每个函数或者每个类方法执行前都会执行一次
session–fixture在整个session执行最开始先执行一次
package–理论上是在一个包执行前执行一次,这个没用过,暂时先写这里
举例说明:
三个文件conftest.py test_1.py test_2.py sample.py
内容分别如下:
conftest.py

import pytest
@pytest.fixture
def fixture1():
    pass
    print("这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次")

@pytest.fixture(scope="session")
def fixture2():
    pass
    # print("这个限制范围session")

@pytest.fixture(scope='module')
def fixture3():
    pass
    # print("这个限制范围是module")

@pytest.fixture(scope="class")
def fixture4():
    pass
    # print("这个限制范围是class")
    
@pytest.fixture(scope="function")
def fixture5():
    pass
    # print("这个限制范围是function")

test_1.py内容如下:

def test1_test1(fixture1,fixture2,fixture3,fixture4,fixture5):
    print("test1_test1")
def test2(fixture1,fixture2,fixture3,fixture4,fixture5):
    print("test1_test2")
class Test1:
    def test1_Test1( self,fixture1,fixture2,fixture3,fixture4,fixture5 ):
        print("test1_test1_Test1")
    def test2_Test1( self,fixture1,fixture2,fixture3,fixture4,fixture5 ):
        print("test1_test1_Test1")

test_2.py内容如下:

def test1(fixture1,fixture2,fixture3,fixture4,fixture5):
    print("test1")
def test2(fixture1,fixture2,fixture3,fixture4,fixture5):
    print("test2")
class Test1:
    def test1_Test1( self,fixture1,fixture2,fixture3,fixture4,fixture5 ):
        print("test1_Test1")
    def test2_Test1( self,fixture1,fixture2,fixture3,fixture4,fixture5 ):
        print("test1_Test1")

sample.py随便写内容即可,按照pytest的执行过滤是不会识别为测试用例。

4.2 不带scope限定范围的fixture示例

首先先验证不带scope,则应该所有识别的用例都会执行一次,修改conftest把该项的print去掉注释:

@pytest.fixture
def fixture1():
    print("这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次")

执行pytest结果如下,结果可看到:

C:\Users\18566\Desktop\APPAutoTest\pytest_leran>pytest -vv -s
Test session starts (platform: win32, Python 3.8.1, pytest 5.4.3, pytest-sugar 0.9.4)
cachedir: .pytest_cache
metadata: {'Python': '3.8.1', 'Platform': 'Windows-10-10.0.18362-SP0', 'Packages': {'pytest': '5.4.3', 'py': '1.9.0', 'pluggy': '0.13.1'}, 'Plugins': {'allure-pytest': '2.8.16', 'assume': '2.2.1', 'cov':
 '2.10.0', 'emoji': '0.2.0', 'forked': '1.2.0', 'html': '2.1.1', 'metadata': '1.10.0', 'ordering': '0.6', 'repeat': '0.8.0', 'rerunfailures': '9.0', 'sugar': '0.9.4', 'timeout': '1.4.1', 'xdist': '1.33.0
'}, 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_202'}
rootdir: C:\Users\18566\Desktop\APPAutoTest\pytest_leran
plugins: allure-pytest-2.8.16, assume-2.2.1, cov-2.10.0, emoji-0.2.0, forked-1.2.0, html-2.1.1, metadata-1.10.0, ordering-0.6, repeat-0.8.0, rerunfailures-9.0, sugar-0.9.4, timeout-1.4.1, xdist-1.33.0
collecting ... 这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
test1_test1

 test_1.py::test1_test1 ✓                                                                                                                                                                    12% █▍
  这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
test1_test2

 test_1.py::test2 ✓                                                                                                                                                                          25% ██▌
   这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
test1_test1_Test1

 test_1.py::Test1.test1_Test1 ✓                                                                                                                                                              38% ███▊
    这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
test1_test1_Test1

 test_1.py::Test1.test2_Test1 ✓                                                                                                                                                              50% █████
     这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
test1

 test_2.py::test1 ✓                                                                                                                                                                          62% █████
█▍   这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
test2

 test_2.py::test2 ✓                                                                                                                                                                          75% █████
██▌  这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
test1_Test1

 test_2.py::Test1.test1_Test1 ✓                                                                                                                                                              88% █████
███▊ 这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
test1_Test1

 test_2.py::Test1.test2_Test1 ✓                                                                                                                                                             100% █████
█████

Results (0.58s):
       8 passed

4.3 scope='module’示例

conftest.py将scope=‘module’的print代码去掉注释

@pytest.fixture(scope='module')
def fixture3():
    print("这个限制范围是module")

运行结果:

:\Users\18566\Desktop\APPAutoTest\pytest_leran>pytest -vv -s
Test session starts (platform: win32, Python 3.8.1, pytest 5.4.3, pytest-sugar 0.9.4)
cachedir: .pytest_cache
metadata: {'Python': '3.8.1', 'Platform': 'Windows-10-10.0.18362-SP0', 'Packages': {'pytest': '5.4.3', 'py': '1.9.0', 'pluggy': '0.13.1'}, 'Plugins': {'allure-pytest': '2.8.16', 'assume': '2.2.1', 'cov':
 '2.10.0', 'emoji': '0.2.0', 'forked': '1.2.0', 'html': '2.1.1', 'metadata': '1.10.0', 'ordering': '0.6', 'repeat': '0.8.0', 'rerunfailures': '9.0', 'sugar': '0.9.4', 'timeout': '1.4.1', 'xdist': '1.33.0
'}, 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_202'}
rootdir: C:\Users\18566\Desktop\APPAutoTest\pytest_leran
plugins: allure-pytest-2.8.16, assume-2.2.1, cov-2.10.0, emoji-0.2.0, forked-1.2.0, html-2.1.1, metadata-1.10.0, ordering-0.6, repeat-0.8.0, rerunfailures-9.0, sugar-0.9.4, timeout-1.4.1, xdist-1.33.0
collecting ... 这个限制范围是module
test1_test1

 test_1.py::test1_test1 ✓                                                                                                                                                                    12% █▍
  test1_test2

 test_1.py::test2 ✓                                                                                                                                                                          25% ██▌
   test1_test1_Test1

 test_1.py::Test1.test1_Test1 ✓                                                                                                                                                              38% ███▊
    test1_test1_Test1

 test_1.py::Test1.test2_Test1 ✓                                                                                                                                                              50% █████
     这个限制范围是module
test1

 test_2.py::test1 ✓                                                                                                                                                                          62% █████
█▍   test2

 test_2.py::test2 ✓                                                                                                                                                                          75% █████
██▌  test1_Test1

 test_2.py::Test1.test1_Test1 ✓                                                                                                                                                              88% █████
███▊ test1_Test1

 test_2.py::Test1.test2_Test1 ✓                                                                                                                                                             100% █████
█████

Results (0.33s):
       8 passed

从结果看test_1.py和test_2.py个运行可一次fixture

4.4 scope='session’示例

修改conftest.py,scope='session’的fixture取消注释print打印

@pytest.fixture(scope="session")
def fixture2():
    # pass
    print("这个限制范围session")

运行结果如下:

C:\Users\18566\Desktop\APPAutoTest\pytest_leran>pytest -vv -s
Test session starts (platform: win32, Python 3.8.1, pytest 5.4.3, pytest-sugar 0.9.4)
cachedir: .pytest_cache
metadata: {'Python': '3.8.1', 'Platform': 'Windows-10-10.0.18362-SP0', 'Packages': {'pytest': '5.4.3', 'py': '1.9.0', 'pluggy': '0.13.1'}, 'Plugins': {'allure-pytest': '2.8.16', 'assume': '2.2.1', 'cov':
 '2.10.0', 'emoji': '0.2.0', 'forked': '1.2.0', 'html': '2.1.1', 'metadata': '1.10.0', 'ordering': '0.6', 'repeat': '0.8.0', 'rerunfailures': '9.0', 'sugar': '0.9.4', 'timeout': '1.4.1', 'xdist': '1.33.0
'}, 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_202'}
rootdir: C:\Users\18566\Desktop\APPAutoTest\pytest_leran
plugins: allure-pytest-2.8.16, assume-2.2.1, cov-2.10.0, emoji-0.2.0, forked-1.2.0, html-2.1.1, metadata-1.10.0, ordering-0.6, repeat-0.8.0, rerunfailures-9.0, sugar-0.9.4, timeout-1.4.1, xdist-1.33.0
collecting ... 这个限制范围session
test1_test1

 test_1.py::test1_test1 ✓                                                                                                                                                                    12% █▍
  test1_test2

 test_1.py::test2 ✓                                                                                                                                                                          25% ██▌
   test1_test1_Test1

 test_1.py::Test1.test1_Test1 ✓                                                                                                                                                              38% ███▊
    test1_test1_Test1

 test_1.py::Test1.test2_Test1 ✓                                                                                                                                                              50% █████
     test1

 test_2.py::test1 ✓                                                                                                                                                                          62% █████
█▍   test2

 test_2.py::test2 ✓                                                                                                                                                                          75% █████
██▌  test1_Test1

 test_2.py::Test1.test1_Test1 ✓                                                                                                                                                              88% █████
███▊ test1_Test1

 test_2.py::Test1.test2_Test1 ✓                                                                                                                                                             100% █████
█████

Results (0.36s):
       8 passed

从运行结果查看,session只执行了一次,这是因为我们整个pytest算是一个会话,如果后续xdist这个插件可以指定分布式运行则可能存在多个会话。

4.5 scope='class’示例

修改conftest.py的用例,取消注释到scope='class’的print。

@pytest.fixture(scope="class")
def fixture4():
    # pass
    print("这个限制范围是class")

执行结果:

C:\Users\18566\Desktop\APPAutoTest\pytest_leran>pytest -vv -s
Test session starts (platform: win32, Python 3.8.1, pytest 5.4.3, pytest-sugar 0.9.4)
cachedir: .pytest_cache
metadata: {'Python': '3.8.1', 'Platform': 'Windows-10-10.0.18362-SP0', 'Packages': {'pytest': '5.4.3', 'py': '1.9.0', 'pluggy': '0.13.1'}, 'Plugins': {'allure-pytest': '2.8.16', 'assume': '2.2.1', 'cov':
 '2.10.0', 'emoji': '0.2.0', 'forked': '1.2.0', 'html': '2.1.1', 'metadata': '1.10.0', 'ordering': '0.6', 'repeat': '0.8.0', 'rerunfailures': '9.0', 'sugar': '0.9.4', 'timeout': '1.4.1', 'xdist': '1.33.0
'}, 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_202'}
rootdir: C:\Users\18566\Desktop\APPAutoTest\pytest_leran
plugins: allure-pytest-2.8.16, assume-2.2.1, cov-2.10.0, emoji-0.2.0, forked-1.2.0, html-2.1.1, metadata-1.10.0, ordering-0.6, repeat-0.8.0, rerunfailures-9.0, sugar-0.9.4, timeout-1.4.1, xdist-1.33.0
collecting ... 这个限制范围是class
test1_test1

 test_1.py::test1_test1 ✓                                                                                                                                                                    12% █▍
  这个限制范围是class
test1_test2

 test_1.py::test2 ✓                                                                                                                                                                          25% ██▌
   这个限制范围是class
test1_test1_Test1

 test_1.py::Test1.test1_Test1 ✓                                                                                                                                                              38% ███▊
    test1_test1_Test1

 test_1.py::Test1.test2_Test1 ✓                                                                                                                                                              50% █████
     这个限制范围是class
test1

 test_2.py::test1 ✓                                                                                                                                                                          62% █████
█▍   这个限制范围是class
test2

 test_2.py::test2 ✓                                                                                                                                                                          75% █████
██▌  这个限制范围是class
test1_Test1

 test_2.py::Test1.test1_Test1 ✓                                                                                                                                                              88% █████
███▊ test1_Test1

 test_2.py::Test1.test2_Test1 ✓                                                                                                                                                             100% █████
█████

Results (0.26s):
       8 passed

从运行的结果查看,scope=‘class’,在每一个函数调用时也运行可一次,然后整个类是运行一次。

4.6 scope='function’示例

scope='function’和不对scope赋值是一样的效果,原因是scope的默认值既是function.源码展示如下:

def fixture(
    callable_or_scope=None,
    *args,
    scope="function",
    params=None,
    autouse=False,
    ids=None,
    name=None
):

修改conftest.py,不带参数和带scope=‘function’的对其进行取消注释:

import pytest
@pytest.fixture
def fixture1():
    print("这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次")
@pytest.fixture(scope="function")
def fixture5():
    # pass
    print("这个限制范围是function")

运行结果如下:

C:\Users\18566\Desktop\APPAutoTest\pytest_leran>pytest -vv -s
Test session starts (platform: win32, Python 3.8.1, pytest 5.4.3, pytest-sugar 0.9.4)
cachedir: .pytest_cache
metadata: {'Python': '3.8.1', 'Platform': 'Windows-10-10.0.18362-SP0', 'Packages': {'pytest': '5.4.3', 'py': '1.9.0', 'pluggy': '0.13.1'}, 'Plugins': {'allure-pytest': '2.8.16', 'assume': '2.2.1', 'cov':
 '2.10.0', 'emoji': '0.2.0', 'forked': '1.2.0', 'html': '2.1.1', 'metadata': '1.10.0', 'ordering': '0.6', 'repeat': '0.8.0', 'rerunfailures': '9.0', 'sugar': '0.9.4', 'timeout': '1.4.1', 'xdist': '1.33.0
'}, 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_202'}
rootdir: C:\Users\18566\Desktop\APPAutoTest\pytest_leran
plugins: allure-pytest-2.8.16, assume-2.2.1, cov-2.10.0, emoji-0.2.0, forked-1.2.0, html-2.1.1, metadata-1.10.0, ordering-0.6, repeat-0.8.0, rerunfailures-9.0, sugar-0.9.4, timeout-1.4.1, xdist-1.33.0
collecting ... 这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_test1

 test_1.py::test1_test1 ✓                                                                                                                                                                    12% █▍
  这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_test2

 test_1.py::test2 ✓                                                                                                                                                                          25% ██▌
   这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_test1_Test1

 test_1.py::Test1.test1_Test1 ✓                                                                                                                                                              38% ███▊
    这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_test1_Test1

 test_1.py::Test1.test2_Test1 ✓                                                                                                                                                              50% █████
     这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1

 test_2.py::test1 ✓                                                                                                                                                                          62% █████
█▍   这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test2

 test_2.py::test2 ✓                                                                                                                                                                          75% █████
██▌  这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_Test1

 test_2.py::Test1.test1_Test1 ✓                                                                                                                                                              88% █████
███▊ 这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_Test1

 test_2.py::Test1.test2_Test1 ✓                                                                                                                                                             100% █████
█████

Results (0.52s):
       8 passed

从运行结果查不给scope赋值和scope='function’效果是一样的,每一个function和方法都会运行一次fixture

4.7 fixture运行时调用的顺序

把conftest所有注释去掉:

import pytest
@pytest.fixture
def fixture1():
    print("这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次")

@pytest.fixture(scope="session")
def fixture2():
    print("这个限制范围session")

@pytest.fixture(scope='module')
def fixture3():
    print("这个限制范围是module")

@pytest.fixture(scope="class")
def fixture4():
    print("这个限制范围是class")


@pytest.fixture(scope="function")
def fixture5():
    print("这个限制范围是function")

运行结果如下:

C:\Users\18566\Desktop\APPAutoTest\pytest_leran>pytest -vv -s
Test session starts (platform: win32, Python 3.8.1, pytest 5.4.3, pytest-sugar 0.9.4)
cachedir: .pytest_cache
metadata: {'Python': '3.8.1', 'Platform': 'Windows-10-10.0.18362-SP0', 'Packages': {'pytest': '5.4.3', 'py': '1.9.0', 'pluggy': '0.13.1'}, 'Plugins': {'allure-pytest': '2.8.16', 'assume': '2.2.1', 'cov':
 '2.10.0', 'emoji': '0.2.0', 'forked': '1.2.0', 'html': '2.1.1', 'metadata': '1.10.0', 'ordering': '0.6', 'repeat': '0.8.0', 'rerunfailures': '9.0', 'sugar': '0.9.4', 'timeout': '1.4.1', 'xdist': '1.33.0
'}, 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_202'}
rootdir: C:\Users\18566\Desktop\APPAutoTest\pytest_leran
plugins: allure-pytest-2.8.16, assume-2.2.1, cov-2.10.0, emoji-0.2.0, forked-1.2.0, html-2.1.1, metadata-1.10.0, ordering-0.6, repeat-0.8.0, rerunfailures-9.0, sugar-0.9.4, timeout-1.4.1, xdist-1.33.0
collecting ... 这个限制范围session
这个限制范围是module
这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_test1

 test_1.py::test1_test1 ✓                                                                                                                                                                    12% █▍
  这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_test2

 test_1.py::test2 ✓                                                                                                                                                                          25% ██▌
   这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_test1_Test1

 test_1.py::Test1.test1_Test1 ✓                                                                                                                                                              38% ███▊
    这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_test1_Test1

 test_1.py::Test1.test2_Test1 ✓                                                                                                                                                              50% █████
     这个限制范围是module
这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1

 test_2.py::test1 ✓                                                                                                                                                                          62% █████
█▍   这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test2

 test_2.py::test2 ✓                                                                                                                                                                          75% █████
██▌  这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_Test1

 test_2.py::Test1.test1_Test1 ✓                                                                                                                                                              88% █████
███▊ 这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_Test1

 test_2.py::Test1.test2_Test1 ✓                                                                                                                                                             100% █████
█████

Results (0.34s):
       8 passed

运行结果分析:
从生成的结果可以查看fixture的顺序如下:
session - module -class - function
当同一个scope有多个时,写在前面的先运行。

4.8 动态指定fixture范围

如果需要变动fixture范围,可以写一个函数来返回需要的scope值,然后直接赋给fixture中的scope即可。

4.9 fixture参数autouse

修改conftest.py为:

import pytest
@pytest.fixture(autouse=True)
def fixture5():
    print("这个限制范围是function")

用例文件test_autouse.py

def test1():
    print("test1")
def test2():
    print("test2")
class Test1:
    def test1_Test1( self, ):
        print("test1_Test1")
    def test2_Test1( self, ):
        print("test1_Test1")

运行结果如下:

C:\Users\18566\Desktop\APPAutoTest\pytest_leran>pytest -vv -s
Test session starts (platform: win32, Python 3.8.1, pytest 5.4.3, pytest-sugar 0.9.4)
cachedir: .pytest_cache
metadata: {'Python': '3.8.1', 'Platform': 'Windows-10-10.0.18362-SP0', 'Packages': {'pytest': '5.4.3', 'py': '1.9.0', 'pluggy': '0.13.1'}, 'Plugins': {'allure-pytest': '2.8.16', 'assume': '2.2.1', 'cov':
 '2.10.0', 'emoji': '0.2.0', 'forked': '1.2.0', 'html': '2.1.1', 'metadata': '1.10.0', 'ordering': '0.6', 'repeat': '0.8.0', 'rerunfailures': '9.0', 'sugar': '0.9.4', 'timeout': '1.4.1', 'xdist': '1.33.0
'}, 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_202'}
rootdir: C:\Users\18566\Desktop\APPAutoTest\pytest_leran
plugins: allure-pytest-2.8.16, assume-2.2.1, cov-2.10.0, emoji-0.2.0, forked-1.2.0, html-2.1.1, metadata-1.10.0, ordering-0.6, repeat-0.8.0, rerunfailures-9.0, sugar-0.9.4, timeout-1.4.1, xdist-1.33.0
collecting ... 这个限制范围是function
test1

 test_autouse.py::test1 ✓                                                                                                                                                                    25% ██▌
   这个限制范围是function
test2

 test_autouse.py::test2 ✓                                                                                                                                                                    50% █████
     这个限制范围是function
test1_Test1

 test_autouse.py::Test1.test1_Test1 ✓                                                                                                                                                        75% █████
██▌  这个限制范围是function
test1_Test1

 test_autouse.py::Test1.test2_Test1 ✓                                                                                                                                                       100% █████
█████

Results (0.33s):
       4 passed

从上述运行结果看不用把fixture传入也可以调用fixture,但是这种情况下,用例内部不能使用fixture函数的数据

4.10 yield加入

fixture的作用类似setup,如果在fixture中加入yield,yeild相当于return,return会直接结束这个函数。yield后面的代码都相当于teardown的代码。
yeild后面如果有返回值,则可以后续直接使用。
示例如下:
修改conftest.py文件如下:

@pytest.fixture
def fixture5():
    print("这个限制范围是function")
    a=5
    yield a
    print("a+6="+str(a+6))

测试用例文件内容如下:

def test1(fixture5):
    print("test1")
    print(str(fixture5)+"test1")
def test2(fixture5):
    print("test2")
    print ( str ( fixture5 ) + "test2" )
class Test1:
    def test1_Test1( self, fixture5):
        print("test1_Test1")
        print ( str ( fixture5 ) + "test1_Test1" )
    def test2_Test1( self,fixture5 ):
        print("test1_Test1")
        print ( str ( fixture5 ) + "test1_Test1" )

运行结果如下:

C:\Users\18566\Desktop\APPAutoTest\pytest_leran>pytest -vv -s
Test session starts (platform: win32, Python 3.8.1, pytest 5.4.3, pytest-sugar 0.9.4)
cachedir: .pytest_cache
metadata: {'Python': '3.8.1', 'Platform': 'Windows-10-10.0.18362-SP0', 'Packages': {'pytest': '5.4.3', 'py': '1.9.0', 'pluggy': '0.13.1'}, 'Plugins': {'allure-pytest': '2.8.16', 'assume': '2.2.1', 'cov':
 '2.10.0', 'emoji': '0.2.0', 'forked': '1.2.0', 'html': '2.1.1', 'metadata': '1.10.0', 'ordering': '0.6', 'repeat': '0.8.0', 'rerunfailures': '9.0', 'sugar': '0.9.4', 'timeout': '1.4.1', 'xdist': '1.33.0
'}, 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_202'}
rootdir: C:\Users\18566\Desktop\APPAutoTest\pytest_leran
plugins: allure-pytest-2.8.16, assume-2.2.1, cov-2.10.0, emoji-0.2.0, forked-1.2.0, html-2.1.1, metadata-1.10.0, ordering-0.6, repeat-0.8.0, rerunfailures-9.0, sugar-0.9.4, timeout-1.4.1, xdist-1.33.0
collecting ... 这个限制范围是function
test1
5test1

a+6=11
 test_autouse.py::test1 ✓                                                                                                                                                                    25% ██▌
   这个限制范围是function
test2
5test2

a+6=11
 test_autouse.py::test2 ✓                                                                                                                                                                    50% █████
     这个限制范围是function
test1_Test1
5test1_Test1

a+6=11
 test_autouse.py::Test1.test1_Test1 ✓                                                                                                                                                        75% █████
██▌  这个限制范围是function
test1_Test1
5test1_Test1

a+6=11
 test_autouse.py::Test1.test2_Test1 ✓                                                                                                                                                       100% █████
█████

Results (0.26s):
       4 passed

可以查看你yield后面的代码在每一个测试用例的后面都执行了一次。
如果socpe='module’则是在每一个模块的最后面都运行一次
修改scope='module’运行结果如下:

C:\Users\18566\Desktop\APPAutoTest\pytest_leran>pytest -vv -s
Test session starts (platform: win32, Python 3.8.1, pytest 5.4.3, pytest-sugar 0.9.4)
cachedir: .pytest_cache
metadata: {'Python': '3.8.1', 'Platform': 'Windows-10-10.0.18362-SP0', 'Packages': {'pytest': '5.4.3', 'py': '1.9.0', 'pluggy': '0.13.1'}, 'Plugins': {'allure-pytest': '2.8.16', 'assume': '2.2.1', 'cov':
 '2.10.0', 'emoji': '0.2.0', 'forked': '1.2.0', 'html': '2.1.1', 'metadata': '1.10.0', 'ordering': '0.6', 'repeat': '0.8.0', 'rerunfailures': '9.0', 'sugar': '0.9.4', 'timeout': '1.4.1', 'xdist': '1.33.0
'}, 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_202'}
rootdir: C:\Users\18566\Desktop\APPAutoTest\pytest_leran
plugins: allure-pytest-2.8.16, assume-2.2.1, cov-2.10.0, emoji-0.2.0, forked-1.2.0, html-2.1.1, metadata-1.10.0, ordering-0.6, repeat-0.8.0, rerunfailures-9.0, sugar-0.9.4, timeout-1.4.1, xdist-1.33.0
collecting ... 这个限制范围是function
test1
5test1

 test_autouse.py::test1 ✓                                                                                                                                                                    25% ██▌
   test2
5test2

 test_autouse.py::test2 ✓                                                                                                                                                                    50% █████
     test1_Test1
5test1_Test1

 test_autouse.py::Test1.test1_Test1 ✓                                                                                                                                                        75% █████
██▌  test1_Test1
5test1_Test1

a+6=11
 test_autouse.py::Test1.test2_Test1 ✓                                                                                                                                                       100% █████
█████

Results (0.21s):
       4 passed

5 用例数据参数化扩展

用到pytest.mark.parameterize,参数用元组或者列表,如果有多个参数则多个参数也用列表或者元组作为输入。
示例:

import pytest
@pytest.mark.parametrize("a,b,c",[(1,2,3),(4,5,6),[7,8,9]])
def test1(a,b,c):
    print(f"{a}+{b}+{c}: "+str(a+b+c))
运行结果如下:
C:\Users\18566\Desktop\APPAutoTest\pytest_leran>pytest -vv -s
Test session starts (platform: win32, Python 3.8.1, pytest 5.4.3, pytest-sugar 0.9.4)
cachedir: .pytest_cache
metadata: {'Python': '3.8.1', 'Platform': 'Windows-10-10.0.18362-SP0', 'Packages': {'pytest': '5.4.3', 'py': '1.9.0', 'pluggy': '0.13.1'}, 'Plugins': {'allure-pytest': '2.8.16', 'assume': '2.2.1', 'cov':
 '2.10.0', 'emoji': '0.2.0', 'forked': '1.2.0', 'html': '2.1.1', 'metadata': '1.10.0', 'ordering': '0.6', 'repeat': '0.8.0', 'rerunfailures': '9.0', 'sugar': '0.9.4', 'timeout': '1.4.1', 'xdist': '1.33.0
'}, 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_202'}
rootdir: C:\Users\18566\Desktop\APPAutoTest\pytest_leran
plugins: allure-pytest-2.8.16, assume-2.2.1, cov-2.10.0, emoji-0.2.0, forked-1.2.0, html-2.1.1, metadata-1.10.0, ordering-0.6, repeat-0.8.0, rerunfailures-9.0, sugar-0.9.4, timeout-1.4.1, xdist-1.33.0
collecting ... 1+2+3: 6

 test_autouse.py::test1[1-2-3]33% ███▍
    4+5+6: 15

 test_autouse.py::test1[4-5-6]67% █████
█▋   7+8+9: 24

 test_autouse.py::test1[7-8-9]100% █████
█████

Results (0.20s):
       3 passed

6 参数化扩展fixture-request.para

fixture里面对参数的解释如下:

   :arg params: an optional list of parameters which will cause multiple
                invocations of the fixture function and all of the tests
                using it.
                The current parameter is available in ``request.param``.

这些参数可以所有用例使用,使用示例如下:
conftest.py内容如下:

@pytest.fixture(autouse=True,params=[(1,2,3),(4,5,6),[7,8,9]])
def fixture5(request):
    print("这个限制范围是function")
    yield request.param
    print(request.param)

测试用例内如下:

import pytest
#@pytest.mark.parametrize("a,b,c",[(1,2,3),(4,5,6),[7,8,9]])
def test1(fixture5):
    a,b,c=fixture5
    print(f"{a}+{b}+{c}: "+str(a+b+c))

运行结果如下:

C:\Users\18566\Desktop\APPAutoTest\pytest_leran>pytest -vv -s
Test session starts (platform: win32, Python 3.8.1, pytest 5.4.3, pytest-sugar 0.9.4)
cachedir: .pytest_cache
metadata: {'Python': '3.8.1', 'Platform': 'Windows-10-10.0.18362-SP0', 'Packages': {'pytest': '5.4.3', 'py': '1.9.0', 'pluggy': '0.13.1'}, 'Plugins': {'allure-pytest': '2.8.16', 'assume': '2.2.1', 'cov':
 '2.10.0', 'emoji': '0.2.0', 'forked': '1.2.0', 'html': '2.1.1', 'metadata': '1.10.0', 'ordering': '0.6', 'repeat': '0.8.0', 'rerunfailures': '9.0', 'sugar': '0.9.4', 'timeout': '1.4.1', 'xdist': '1.33.0
'}, 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_202'}
rootdir: C:\Users\18566\Desktop\APPAutoTest\pytest_leran
plugins: allure-pytest-2.8.16, assume-2.2.1, cov-2.10.0, emoji-0.2.0, forked-1.2.0, html-2.1.1, metadata-1.10.0, ordering-0.6, repeat-0.8.0, rerunfailures-9.0, sugar-0.9.4, timeout-1.4.1, xdist-1.33.0
collecting ... 这个限制范围是function
1+2+3: 6

(1, 2, 3)
 test_autouse.py::test1[fixture50]33% ███▍
    这个限制范围是function
4+5+6: 15

(4, 5, 6)
 test_autouse.py::test1[fixture51]67% █████
█▋   这个限制范围是function
7+8+9: 24

[7, 8, 9]
 test_autouse.py::test1[fixture52]100% █████
█████

Results (0.32s):
       3 passed

结果分析:
相对于单独的用例数据参数化扩展,这里实际上是对fixture进行了参数扩展,同时testcase调用fixture可以对其返回的数据进行操作。当很多个用例共用一些参数的情况下可以采用这种情况减少代码冗余。

7 使用markers传输数据给fixture

可以使用marker传输数据给fixture
修改conftest.py内容如下:

@pytest.fixture
def fixture5(request):
    print("这个限制范围是function")
    data=request.node.get_closest_marker( "test" ).args
    yield data
    print(data)

修改测试用例内容如下:

import pytest
@pytest.mark.test(1,2,3)
def test1(fixture5):
    a,b,c=fixture5
    print(f"{a}+{b}+{c}: "+str(a+b+c))

运行结果如下:

C:\Users\18566\Desktop\APPAutoTest\pytest_leran>pytest -vv -s
Test session starts (platform: win32, Python 3.8.1, pytest 5.4.3, pytest-sugar 0.9.4)
cachedir: .pytest_cache
metadata: {'Python': '3.8.1', 'Platform': 'Windows-10-10.0.18362-SP0', 'Packages': {'pytest': '5.4.3', 'py': '1.9.0', 'pluggy': '0.13.1'}, 'Plugins': {'allure-pytest': '2.8.16', 'assume': '2.2.1', 'cov':
 '2.10.0', 'emoji': '0.2.0', 'forked': '1.2.0', 'html': '2.1.1', 'metadata': '1.10.0', 'ordering': '0.6', 'repeat': '0.8.0', 'rerunfailures': '9.0', 'sugar': '0.9.4', 'timeout': '1.4.1', 'xdist': '1.33.0
'}, 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_202'}
rootdir: C:\Users\18566\Desktop\APPAutoTest\pytest_leran
plugins: allure-pytest-2.8.16, assume-2.2.1, cov-2.10.0, emoji-0.2.0, forked-1.2.0, html-2.1.1, metadata-1.10.0, ordering-0.6, repeat-0.8.0, rerunfailures-9.0, sugar-0.9.4, timeout-1.4.1, xdist-1.33.0
collecting ... 这个限制范围是function
1+2+3: 6

(1, 2, 3)
 test_autouse.py::test1 ✓                                                                                                                                                                   100% █████
█████
============================================================================================ warnings summary ============================================================================================
test_autouse.py:2
  C:\Users\18566\Desktop\APPAutoTest\pytest_leran\test_autouse.py:2: PytestUnknownMarkWarning: Unknown pytest.mark.test - is this a typo?  You can register custom marks to avoid this warning - for detail
s, see https://docs.pytest.org/en/latest/mark.html
    @pytest.mark.test(1,2,3)

-- Docs: https://docs.pytest.org/en/latest/warnings.html

Results (0.29s):
       1 passed

从上述看,通过request.node.get_closet_marker(“markerName”).args可以获取到marker传输的数据。
和6中request选区别,这里可以将testcase的数据传输给fixture,之前直接对fixture参数扩展然后传输给tescase.
上个场景是多个用例的fixture的数据一样。
该用法可以用到每个用例的数据不一样,但是所作的初始化操作一样。

8 fixture返回函数给testcase

实现方法是在fixture里加一个嵌套函数,示例如下:
修改conftest.py文件内容如下:

@pytest.fixture
def fixture5(request):
    i=0
    data = request.node.get_closest_marker ( "test" ).args
    def init():
        print("这个限制范围是function")
        nonlocal i
        data=request.node.get_closest_marker( "test" ).args[i]
        i+=1
        return data,data+2,data+4
    yield init
    print(data)
    print(i)

修改testca内容如下:

import pytest
@pytest.mark.test(1,2,3)
def test1(fixture5):
    a,b,c=fixture5()
    print(f"{a}+{b}+{c}: "+str(a+b+c))
    a,b,c=fixture5()
    print(f"{a}+{b}+{c}: "+str(a+b+c))
    a,b,c=fixture5()
    print(f"{a}+{b}+{c}: "+str(a+b+c))

运行结果如下:

C:\Users\18566\Desktop\APPAutoTest\pytest_leran>pytest -vv -s
Test session starts (platform: win32, Python 3.8.1, pytest 5.4.3, pytest-sugar 0.9.4)
cachedir: .pytest_cache
metadata: {'Python': '3.8.1', 'Platform': 'Windows-10-10.0.18362-SP0', 'Packages': {'pytest': '5.4.3', 'py': '1.9.0', 'pluggy': '0.13.1'}, 'Plugins': {'allure-pytest': '2.8.16', 'assume': '2.2.1', 'cov':
 '2.10.0', 'emoji': '0.2.0', 'forked': '1.2.0', 'html': '2.1.1', 'metadata': '1.10.0', 'ordering': '0.6', 'repeat': '0.8.0', 'rerunfailures': '9.0', 'sugar': '0.9.4', 'timeout': '1.4.1', 'xdist': '1.33.0
'}, 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_202'}
rootdir: C:\Users\18566\Desktop\APPAutoTest\pytest_leran
plugins: allure-pytest-2.8.16, assume-2.2.1, cov-2.10.0, emoji-0.2.0, forked-1.2.0, html-2.1.1, metadata-1.10.0, ordering-0.6, repeat-0.8.0, rerunfailures-9.0, sugar-0.9.4, timeout-1.4.1, xdist-1.33.0
collecting ... 这个限制范围是function
1+3+5: 9
这个限制范围是function
2+4+6: 12
这个限制范围是function
3+5+7: 15

(1, 2, 3)
3
 test_autouse.py::test1 ✓                                                                                                                                                                   100% █████
█████
============================================================================================ warnings summary ============================================================================================
test_autouse.py:2
  C:\Users\18566\Desktop\APPAutoTest\pytest_leran\test_autouse.py:2: PytestUnknownMarkWarning: Unknown pytest.mark.test - is this a typo?  You can register custom marks to avoid this warning - for detail
s, see https://docs.pytest.org/en/latest/mark.html
    @pytest.mark.test(1,2,3)

-- Docs: https://docs.pytest.org/en/latest/warnings.html

Results (0.19s):
       1 passed

结果分析:
查看结果fixture返回的函数多次调用会有不同的数据处理。

9 --collect-only收集用例不执行

如题目所示,–collect-only手机用例不执行,采用之前的test_2.py进行用例手机,执行结果如下:

C:\Users\18566\Desktop\APPAutoTest\pytest_leran>pytest --collect-only test_2.py
Test session starts (platform: win32, Python 3.8.1, pytest 5.4.3, pytest-sugar 0.9.4)
rootdir: C:\Users\18566\Desktop\APPAutoTest\pytest_leran
plugins: allure-pytest-2.8.16, assume-2.2.1, cov-2.10.0, emoji-0.2.0, forked-1.2.0, html-2.1.1, metadata-1.10.0, ordering-0.6, repeat-0.8.0, rerunfailures-9.0, sugar-0.9.4, timeout-1.4.1, xdist-1.33.0
collecting ... <Module test_2.py>
  <Function test1>
  <Function test2>
  <Class Test1>
      <Function test1_Test1>
      <Function test2_Test1>


Results (0.17s):

运行的用例名字如图:

collecting ... 
 test_2.py::test1 ✓                                                                                                                                                                          25% ██▌
   
 test_2.py::test2 ✓                                                                                                                                                                          50% █████
     
 test_2.py::Test1.test1_Test1 ✓                                                                                                                                                              75% █████
██▌  
 test_2.py::Test1.test2_Test1 ✓ 

可自定义给用例名字,采用参数ids.
conftest.py修改fixture5:

@pytest.fixture(scope="function",params=[0,1,2,3],ids=['case1',"case2","case3",'case5'])
def fixture5():
    print("这个限制范围是function")

运行test_2.py结果如下:

C:\Users\18566\Desktop\APPAutoTest\pytest_leran>pytest -vv -s test_2.py
Test session starts (platform: win32, Python 3.8.1, pytest 5.4.3, pytest-sugar 0.9.4)
cachedir: .pytest_cache
metadata: {'Python': '3.8.1', 'Platform': 'Windows-10-10.0.18362-SP0', 'Packages': {'pytest': '5.4.3', 'py': '1.9.0', 'pluggy': '0.13.1'}, 'Plugins': {'allure-pytest': '2.8.16', 'assume': '2.2.1', 'cov':
 '2.10.0', 'emoji': '0.2.0', 'forked': '1.2.0', 'html': '2.1.1', 'metadata': '1.10.0', 'ordering': '0.6', 'repeat': '0.8.0', 'rerunfailures': '9.0', 'sugar': '0.9.4', 'timeout': '1.4.1', 'xdist': '1.33.0
'}, 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_202'}
rootdir: C:\Users\18566\Desktop\APPAutoTest\pytest_leran
plugins: allure-pytest-2.8.16, assume-2.2.1, cov-2.10.0, emoji-0.2.0, forked-1.2.0, html-2.1.1, metadata-1.10.0, ordering-0.6, repeat-0.8.0, rerunfailures-9.0, sugar-0.9.4, timeout-1.4.1, xdist-1.33.0
collecting ... 这个限制范围session
这个限制范围是module
这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1

 test_2.py::test1[case1]6% ▋
 这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1

 test_2.py::test1[case2]12% █▍
  这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1

 test_2.py::test1[case3]19% █▉
  这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1

 test_2.py::test1[case5]25% ██▌
   这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test2

 test_2.py::test2[case1]31% ███▎
    这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test2

 test_2.py::test2[case2]38% ███▊
    这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test2

 test_2.py::test2[case3]44% ████▍
     这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test2

 test_2.py::test2[case5]50% █████
     这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_Test1

 test_2.py::Test1.test1_Test1[case1]56% █████
▋    这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_Test1

 test_2.py::Test1.test1_Test1[case2]62% █████
█▍   这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_Test1

 test_2.py::Test1.test1_Test1[case3]69% █████
█▉   这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_Test1

 test_2.py::Test1.test1_Test1[case5]75% █████
██▌  这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_Test1

 test_2.py::Test1.test2_Test1[case1]81% █████
███▎ 这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_Test1

 test_2.py::Test1.test2_Test1[case2]88% █████
███▊ 这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_Test1

 test_2.py::Test1.test2_Test1[case3]94% █████
████▍这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_Test1

 test_2.py::Test1.test2_Test1[case5]100% █████
█████

Results (0.45s):
      16 passed

10 pytest.mark.usefixtures

之前的fixture使用,提供2种方法,一种是def testcase(fixturename),另外一种是声明fixture的时候就直接@fixture(autouse=True).现在提供另外一种方法pytest.mark.usefixtures,这里的用法效果同autouse=True设置,不支持testcase内部调用fixture.
@pytest.mark.usefixture(“fixture1”)
def test1():

11 pytest.ini

改变默认的命令行参数
可以把经常要用的参数写在pytest.ini,pytest会自动读取该文件。
比如之前的例子中经常使用pytest -s -vv等,可以把-s和-vv写在pytest.ini
写法如下:

[pytest]
addopts= -s -vv

加了pytest.ini之后运行结果如下:

C:\Users\18566\Desktop\APPAutoTest\pytest_leran>pytest
Test session starts (platform: win32, Python 3.8.1, pytest 5.4.3, pytest-sugar 0.9.4)
cachedir: .pytest_cache
metadata: {'Python': '3.8.1', 'Platform': 'Windows-10-10.0.18362-SP0', 'Packages': {'pytest': '5.4.3', 'py': '1.9.0', 'pluggy': '0.13.1'}, 'Plugins': {'allure-pytest': '2.8.16', 'assume': '2.2.1', 'cov':
 '2.10.0', 'emoji': '0.2.0', 'forked': '1.2.0', 'html': '2.1.1', 'metadata': '1.10.0', 'ordering': '0.6', 'repeat': '0.8.0', 'rerunfailures': '9.0', 'sugar': '0.9.4', 'timeout': '1.4.1', 'xdist': '1.33.0
'}, 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_202'}
rootdir: C:\Users\18566\Desktop\APPAutoTest\pytest_leran, inifile: pytest.ini
plugins: allure-pytest-2.8.16, assume-2.2.1, cov-2.10.0, emoji-0.2.0, forked-1.2.0, html-2.1.1, metadata-1.10.0, ordering-0.6, repeat-0.8.0, rerunfailures-9.0, sugar-0.9.4, timeout-1.4.1, xdist-1.33.0
collecting ... 这个限制范围session
这个限制范围是module
这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1

 test_2.py::test1[case1]6% ▋
 这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1

 test_2.py::test1[case2]12% █▍
  这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1

 test_2.py::test1[case3]19% █▉
  这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1

 test_2.py::test1[case5]25% ██▌
   这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test2

 test_2.py::test2[case1]31% ███▎
    这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test2

 test_2.py::test2[case2]38% ███▊
    这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test2

 test_2.py::test2[case3]44% ████▍
     这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test2

 test_2.py::test2[case5]50% █████
     这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_Test1

 test_2.py::Test1.test1_Test1[case1]56% █████
▋    这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_Test1

 test_2.py::Test1.test1_Test1[case2]62% █████
█▍   这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_Test1

 test_2.py::Test1.test1_Test1[case3]69% █████
█▉   这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_Test1

 test_2.py::Test1.test1_Test1[case5]75% █████
██▌  这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_Test1

 test_2.py::Test1.test2_Test1[case1]81% █████
███▎ 这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_Test1

 test_2.py::Test1.test2_Test1[case2]88% █████
███▊ 这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_Test1

 test_2.py::Test1.test2_Test1[case3]94% █████
████▍这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_Test1

 test_2.py::Test1.test2_Test1[case5]100% █████
█████

Results (0.78s):
      16 passed

可以看到上述和之前直接运行pytest -vv -s的效果一样,现在注释掉pytest.ini,再用pytest运行结果如下:

C:\Users\18566\Desktop\APPAutoTest\pytest_leran>pytest
Test session starts (platform: win32, Python 3.8.1, pytest 5.4.3, pytest-sugar 0.9.4)
rootdir: C:\Users\18566\Desktop\APPAutoTest\pytest_leran
plugins: allure-pytest-2.8.16, assume-2.2.1, cov-2.10.0, emoji-0.2.0, forked-1.2.0, html-2.1.1, metadata-1.10.0, ordering-0.6, repeat-0.8.0, rerunfailures-9.0, sugar-0.9.4, timeout-1.4.1, xdist-1.33.0
collecting ... 
 test_2.py ✓                                                                                                                                                                                  6% ▋
 test_2.py ✓✓                                                                                                                                                                                12% █▍
 test_2.py ✓✓✓                                                                                                                                                                               19% █▉
 test_2.py ✓✓✓✓                                                                                                                                                                              25% ██▌
 test_2.py ✓✓✓✓✓                                                                                                                                                                             31% ███▎
 test_2.py ✓✓✓✓✓✓                                                                                                                                                                            38% ███▊
 test_2.py ✓✓✓✓✓✓✓                                                                                                                                                                           44% ████▍
 test_2.py ✓✓✓✓✓✓✓✓                                                                                                                                                                          50% █████
 test_2.py ✓✓✓✓✓✓✓✓✓                                                                                                                                                                         56% █████
 test_2.py ✓✓✓✓✓✓✓✓✓✓                                                                                                                                                                        62% █████
 test_2.py ✓✓✓✓✓✓✓✓✓✓✓                                                                                                                                                                       69% █████
 test_2.py ✓✓✓✓✓✓✓✓✓✓✓✓                                                                                                                                                                      75% █████
 test_2.py ✓✓✓✓✓✓✓✓✓✓✓✓✓                                                                                                                                                                     81% █████
 test_2.py ✓✓✓✓✓✓✓✓✓✓✓✓✓✓                                                                                                                                                                    88% █████
 test_2.py ✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓                                                                                                                                                                   94% █████
 test_2.py ✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓                                                                                                                                                                 100% █████
█████

Results (0.88s):
      16 passed

去掉注释用pytest.main()运行结果:

C:\Users\18566\AppData\Local\Programs\Python\Python38\python.exe C:/Users/18566/Desktop/APPAutoTest/pytest_leran/test_2.py
============================= test session starts =============================
platform win32 -- Python 3.8.1, pytest-5.4.3, py-1.9.0, pluggy-0.13.1 -- C:\Users\18566\AppData\Local\Programs\Python\Python38\python.exe
cachedir: .pytest_cache
metadata: {'Python': '3.8.1', 'Platform': 'Windows-10-10.0.18362-SP0', 'Packages': {'pytest': '5.4.3', 'py': '1.9.0', 'pluggy': '0.13.1'}, 'Plugins': {'allure-pytest': '2.8.16', 'assume': '2.2.1', 'cov': '2.10.0', 'emoji': '0.2.0', 'forked': '1.2.0', 'html': '2.1.1', 'metadata': '1.10.0', 'ordering': '0.6', 'repeat': '0.8.0', 'rerunfailures': '9.0', 'sugar': '0.9.4', 'timeout': '1.4.1', 'xdist': '1.33.0'}, 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_202'}
rootdir: C:\Users\18566\Desktop\APPAutoTest\pytest_leran, inifile: pytest.ini
plugins: allure-pytest-2.8.16, assume-2.2.1, cov-2.10.0, emoji-0.2.0, forked-1.2.0, html-2.1.1, metadata-1.10.0, ordering-0.6, repeat-0.8.0, rerunfailures-9.0, sugar-0.9.4, timeout-1.4.1, xdist-1.33.0
collecting ... ============================= test session starts =============================
platform win32 -- Python 3.8.1, pytest-5.4.3, py-1.9.0, pluggy-0.13.1 -- C:\Users\18566\AppData\Local\Programs\Python\Python38\python.exe
cachedir: .pytest_cache
metadata: {'Python': '3.8.1', 'Platform': 'Windows-10-10.0.18362-SP0', 'Packages': {'pytest': '5.4.3', 'py': '1.9.0', 'pluggy': '0.13.1'}, 'Plugins': {'allure-pytest': '2.8.16', 'assume': '2.2.1', 'cov': '2.10.0', 'emoji': '0.2.0', 'forked': '1.2.0', 'html': '2.1.1', 'metadata': '1.10.0', 'ordering': '0.6', 'repeat': '0.8.0', 'rerunfailures': '9.0', 'sugar': '0.9.4', 'timeout': '1.4.1', 'xdist': '1.33.0'}, 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_202'}
rootdir: C:\Users\18566\Desktop\APPAutoTest\pytest_leran, inifile: pytest.ini
plugins: allure-pytest-2.8.16, assume-2.2.1, cov-2.10.0, emoji-0.2.0, forked-1.2.0, html-2.1.1, metadata-1.10.0, ordering-0.6, repeat-0.8.0, rerunfailures-9.0, sugar-0.9.4, timeout-1.4.1, xdist-1.33.0
collecting ... collected 16 items

test_2.py::test1[case1] 这个限制范围session
这个限制范围是module
这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1
PASSED
test_2.py::test1[case2] 这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1
PASSED
test_2.py::test1[case3] 这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1
PASSED
test_2.py::test1[case5] 这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1
PASSED
test_2.py::test2[case1] 这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test2
PASSED
test_2.py::test2[case2] 这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test2
PASSED
test_2.py::test2[case3] 这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test2
PASSED
test_2.py::test2[case5] 这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test2
PASSED
test_2.py::Test1::test1_Test1[case1] 这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_Test1
PASSED
test_2.py::Test1::test1_Test1[case2] 这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_Test1
PASSED
test_2.py::Test1::test1_Test1[case3] 这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_Test1
PASSED
test_2.py::Test1::test1_Test1[case5] 这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_Test1
PASSED
test_2.py::Test1::test2_Test1[case1] 这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_Test1
PASSED
test_2.py::Test1::test2_Test1[case2] 这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_Test1
PASSED
test_2.py::Test1::test2_Test1[case3] 这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_Test1
PASSED
test_2.py::Test1::test2_Test1[case5] 这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_Test1
PASSED

============================= 16 passed in 0.35s ==============================
collected 16 items

test_2.py::test1[case1] 这个限制范围session
这个限制范围是module
这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1
PASSED
test_2.py::test1[case2] 这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1
PASSED
test_2.py::test1[case3] 这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1
PASSED
test_2.py::test1[case5] 这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1
PASSED
test_2.py::test2[case1] 这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test2
PASSED
test_2.py::test2[case2] 这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test2
PASSED
test_2.py::test2[case3] 这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test2
PASSED
test_2.py::test2[case5] 这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test2
PASSED
test_2.py::Test1::test1_Test1[case1] 这个限制范围是class
这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_Test1
PASSED
test_2.py::Test1::test1_Test1[case2] 这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_Test1
PASSED
test_2.py::Test1::test1_Test1[case3] 这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_Test1
PASSED
test_2.py::Test1::test1_Test1[case5] 这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_Test1
PASSED
test_2.py::Test1::test2_Test1[case1] 这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_Test1
PASSED
test_2.py::Test1::test2_Test1[case2] 这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_Test1
PASSED
test_2.py::Test1::test2_Test1[case3] 这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_Test1
PASSED
test_2.py::Test1::test2_Test1[case5] 这个是不加参数的fixture,没有设置范围,应该所有符合的test*用例都会执行一次
这个限制范围是function
test1_Test1
PASSED

============================== warnings summary ===============================
C:\Users\18566\AppData\Local\Programs\Python\Python38\lib\site-packages\_pytest\compat.py:333
  C:\Users\18566\AppData\Local\Programs\Python\Python38\lib\site-packages\_pytest\compat.py:333: PytestDeprecationWarning: The TerminalReporter.writer attribute is deprecated, use TerminalReporter._tw instead at your own risk.
  See https://docs.pytest.org/en/latest/deprecations.html#terminalreporter-writer for more information.
    return getattr(object, name, default)

-- Docs: https://docs.pytest.org/en/latest/warnings.html
======================== 16 passed, 1 warning in 1.32s ========================

Process finished with exit code 0

从上看pytest.ini,当采用python的方式运行时也生效的。

先总结到这里,其他的见下一篇。

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值