1、Scope参数作用范围说明

fixture里面scope参数可以控制fixture的作用范围:

session > package >module > class > function

default:不传参数就是默认的,作用域就是所有的函数
class:作用域是每个class文件,只会运行一次
module:作用域是一个模块,在一个模块中只会运行一次

package :作用域是在一个package包中都有效 需要将fixture 放到 conftest里
session :在整个会话都有效,整个pytest 程序只运行一次 需要将fixture 放到 conftest里


例子 12-1

代码:

  1. # -*- coding:utf-8 -*-
  2. # Author:tang_ren_li
  3. # 2022-1-29 22:45
  4. import pytest
  5. #自动调用打开 默认范围为函数级别 在自动调用的情况,无法向测试用例传参
  6. @pytest.fixture(autouse=True)
  7. def fixture_7():
  8. print(" 默认范围 模块里定义 fixture7前置调用 !")
  9. yield '默认范围模块里定义 fixture7 '
  10. print(" 默认范围模块里定义 fixture7后置调用 !")
  11. @pytest.fixture(autouse=True,scope='class')
  12. def fixture_8():
  13. print(" class范围模块里定义 fixture8前置调用 !")
  14. yield 'class范围模块里定义 fixture8'
  15. print("class范围模块里定义 fixture8后置调用 !")
  16. @pytest.fixture(autouse=True,scope='module')
  17. def fixture_9():
  18. print(" module范围模块里定义 fixture9前置调用 !")
  19. yield 'module范围模块里定义 fixture9 '
  20. print("module范围模块里定义 fixture9后置调用 !")
  21. def test_case_1():
  22. print(" test_case 1 running !")
  23. assert 1
  24. class Test_A():
  25. def test_case_A_1(self):
  26. print(" test_case_A_1 running !")
  27. def test_case_A_2(self):
  28. print(" test_case_A_2 running !")
  29. def test_case_A_3(self):
  30. print(" test_case_A_3 running !")

运行结果:

================== test session starts =============================
collecting … collected 4 items

scope_test.py::test_case_1

module范围模块里定义 fixture9前置调用 !

class范围模块里定义 fixture8前置调用 !
默认范围 模块里定义 fixture7前置调用 !
PASSED [ 25%] test_case 1 running !
默认范围模块里定义 fixture7后置调用 !
class范围模块里定义 fixture8后置调用 !

scope_test.py::Test_A::test_case_A_1

class范围模块里定义 fixture8前置调用 !
默认范围 模块里定义 fixture7前置调用 !
PASSED [ 50%] test_case_A_1 running !
默认范围模块里定义 fixture7后置调用 !

scope_test.py::Test_A::test_case_A_2

默认范围 模块里定义 fixture7前置调用 !
PASSED [ 75%] test_case_A_2 running !
默认范围模块里定义 fixture7后置调用 !

scope_test.py::Test_A::test_case_A_3

默认范围 模块里定义 fixture7前置调用 !
PASSED [100%] test_case_A_3 running !
默认范围模块里定义 fixture7后置调用 !
class范围模块里定义 fixture8后置调用 !

module范围模块里定义 fixture9后置调用 !

===================== 4 passed in 0.03s ====================

说明:

  1. fixture 可以在模块文件中直接定义,可以使用函数级别, 类级别,模块级别三种范围

    1. fixture
    1. 所有不在类里的函数当做一个类来看待,调用一次类范围的fixture

    2. 自动调用打开 默认范围为函数级别在自动调用的情况,无法向测试用例传参

2、Conftest.py 文件的讲解

什么是conftest.py
可以理解成一个专门存放fixture的配置文件

实际开发场景
多个测试用例文件(test_.py)的所有用例都需要*用登录功能来作为前置操作,那就不能把登录功能写到某个用例文件中去了

如何解决上述场景问题?
conftest.py的出现,就是为了解决上述问题,单独管理一些全局的fixture

conftest.py配置fixture注意事项

  • pytest会默认读取conftest.py里面的所有fixture
  • conftest.py 文件名称是固定的,不能改动
  • conftest.py只对同一个package下的所有测试用例生效
  • 不同目录可以有自己的conftest.py,一个项目中可以有多个conftest.py
  • 测试用例文件中不需要手动import conftest.py,pytest会自动查找

例子 12-2

目录:

image.png

 构建2个测试用例包,每个包配置有2个单独的conftest文件  <br />     在根目录配置一个单独的conftest文件

代码:

test_case_1 包 :

scope_test.py , 就是例子12-1 所示代码

Test_Demo1.py :

# -*- coding:utf-8 -*-
# Author:tang_ren_li
# 2022-1-29 22:45


import pytest

class Test_Demo1():

      def test_demo_case_1(self):
          print(" test_demo_case_1 running !")


      def test_demo_case_2(self):
          print(" test_demo_case_2 running !")

conftest.py


# -*- coding:utf-8 -*-
# Author:tang_ren_li
# 2022-2-1 22:45


import pytest


#自动调用打开 默认范围为函数级别 在自动调用的情况,无法向测试用例传参
@pytest.fixture(autouse=True)
def fixture_1():
    print(" 默认范围fixture1前置调用 !")
    yield '默认范围fixture1 '
    print(" 默认范围fixture1后置调用 !")


@pytest.fixture(autouse=True,scope='class')
def fixture_2():
    print(" class范围fixture2前置调用 !")
    yield 'class范围fixture2 '
    print("class范围fixture2后置调用 !")


@pytest.fixture(autouse=True,scope='module')
def fixture_3():
    print(" module范围fixture3前置调用 !")
    yield 'module范围fixture3 '
    print("module范围fixture3后置调用 !")


@pytest.fixture(autouse=True,scope='package')
def fixture_4():
    print(" test_case_1 package范围fixture4前置调用 !")
    yield 'test_case_1  package范围fixture4 '
    print("test_case_1 package范围fixture4后置调用 !")


test_case_2 包 :

Test_Demo2.py

class Test_Demo2():

    def test_demo2_case1(self):
        print("test_demo2_case1 run !")

    def test_demo2_case2(self):
        print("test_demo2_case2 run !")


conftest.py

import pytest

@pytest.fixture(autouse=True,scope='package')
def fixture_4():
    print(" test_case_2 package范围fixture4前置调用 !")
    yield 'test_case_2  package范围fixture4 '
    print("test_case_2 package范围fixture4后置调用 !")

根目录:

conftest.py

import pytest

@pytest.fixture(autouse=True,scope='session')
def fixture_6():
    print("session范围fixture6前置调用 !")
    yield 'session范围fixture6'
    print("session范围fixture6后置调用 !")

run.py

import pytest

if __name__ == '__main__':

    pytest.main(["-s"])

运行结果:

===================== test session starts=============================

collected 8 items

test_case_1\Test_Demo1.py

session范围fixture6前置调用 !

test_case_1 package范围fixture4前置调用 !

module范围fixture3前置调用 !

class范围fixture2前置调用 !

默认范围fixture1前置调用 !
test_demo_case_1 running !
. 默认范围fixture1后置调用 !

默认范围fixture1前置调用 !
test_demo_case_2 running !
. 默认范围fixture1后置调用 !

class范围fixture2后置调用 !

module范围fixture3后置调用 !

test_case_1\scope_test.py

module范围fixture3前置调用 !
module范围模块里定义 fixture9前置调用
class范围fixture2前置调用 !
class范围模块里定义 fixture8前置调用 !
默认范围fixture1前置调用 !
默认范围 模块里定义 fixture7前置调用 !
test_case running !
. 默认范围模块里定义 fixture7后置调用 !
默认范围fixture1后置调用 !
class范围模块里定义 fixture8后置调用 !
class范围fixture2后置调用 !
class范围fixture2前置调用 !
class范围模块里定义 fixture8前置调用 !
默认范围fixture1前置调用 !
默认范围 模块里定义 fixture7前置调用 !
test_case_A_1 running !
. 默认范围模块里定义 fixture7后置调用 !
默认范围fixture1后置调用 !
默认范围fixture1前置调用 !
默认范围 模块里定义 fixture7前置调用 !
test_case_A_2 running !
. 默认范围模块里定义 fixture7后置调用 !
默认范围fixture1后置调用 !
默认范围fixture1前置调用 !
默认范围 模块里定义 fixture7前置调用 !
test_case_A_3 running !
. 默认范围模块里定义 fixture7后置调用 !
默认范围fixture1后置调用 !
class范围模块里定义 fixture8后置调用 !
class范围fixture2后置调用 !
module范围模块里定义 fixture9后置调用 !
module范围fixture3后置调用 !
test_case_1 package范围fixture4后置调用 !

test_case_2\Test_Demo2.py test_case_2

package范围fixture4前置调用 !
test_demo2_case1 run !
.test_demo2_case2 run !
.test_case_2 package范围fixture4后置调用 !

session范围fixture6后置调用 !

==================== 8 passed in 0.06s ===========================

说明:

1. 较高 scope 范围的fixture(session)在较低 scope 范围的fixture( function 、 class )之前实例化【session > package > module > class > function】
2 . 具有相同作用域的fixture遵循测试函数中声明的顺序,并遵循fixture之间的依赖关系【在fixture_A里面依赖的fixture_B优先实例化,然后到fixture_A实例化】
3. 当模块里面的fixture 和 conftest里面的 fixture 都存在通类fixture时
4. 前置先运行conftest文件里的同级别fixture ,后置后运行conftest文件里的同级别fixture 3. session 始终跟随pytest 程序只运行一次,