首页 > 其他分享 >5. Pytest自定义前置后置:fixture参数详解(了解)

5. Pytest自定义前置后置:fixture参数详解(了解)

时间:2023-01-17 10:37:06浏览次数:48  
标签:01 自定义 py fixture pytest print Pytest test

一、前言

我们上节课讲到fixture自定义前置函数的时候,有5个非必填参数,scope ,params,autouse,ids,name。一般情况下这五个参数我们在工作中都不常用,但是个别情况会用到,这节课针对这五个参数做详细讲解。

二、学习目标

1.scope参数实例讲解

2.params参数实例讲解

3.autouse参数实例讲解

4.ids参数实例讲解

5.name参数实例讲解

三、知识点

1.scope参数实例讲解

  • 用于控制Fixture的作用范围
  • 作用类似于Pytest的setup/teardown
  • 默认取值为function(函数级别),控制范围的排序为:session > module > class > function
取值 范围 说明
function 函数级 每一个函数或方法都会调用
class 类级别 每个测试类只运行一次
module 模块级 每一个.py文件调用一次
session 会话级 每次会话只需要运行一次,会话内所有方法及类,模块都共享这个方法

代码示例:

#conftest.py前置定义文件
import pytest

@pytest.fixture(scope="session")
def init_session():
    print("回话前置")
    yield
    print("回话后置")

@pytest.fixture(scope="module")
def init_module():
    print("模块前置")
    yield
    print("模块后置")

@pytest.fixture(scope="class")
def init_class():
    print("类的前置")
    yield
    print("类的后置")

@pytest.fixture(scope="function")
def init_function():
    print("用例前置")
    yield
    print("用例后置")
#test_xxx.py测试用例文件
import pytest

def test_01():
    print("用例01")

@pytest.mark.usefixtures('init_module')
def test_02():
    print("用例02")

@pytest.mark.usefixtures('init_class')
class TestLogin():
    def test_1(self):
        print("用例1")

    @pytest.mark.usefixtures('init_function')
    def test_2(self):
        print("用例2")

运行效果:

test_pytest_demo6.py::test_01 PASSED                                     [ 25%]用例01

test_pytest_demo6.py::test_02 模块前置
PASSED                                     [ 50%]用例02

test_pytest_demo6.py::TestLogin::test_1 类的前置
PASSED                           [ 75%]用例1

test_pytest_demo6.py::TestLogin::test_2 用例前置
PASSED                           [100%]用例2
用例后置
类的后置
模块后置
============================== 4 passed in 0.03s ==============================

2.params参数实例讲解

  • Fixture的可选形参列表,支持列表传入
  • 默认None,每个param的值
  • fixture都会去调用执行一次,类似for循环
  • 可与参数ids一起使用,作为每个参数的标识,详见ids
  • 被Fixture装饰的函数要调用是采用:Request.param(固定写法)

代码示例:

#conftest.py前置定义文件
@pytest.fixture(params=["a","b",{"name":"user1"},{"name":"user2"}]) #params必须是列表
def demo(request):
    return request.param  #固定写法
#test_xxx.py测试用例文件
#测试用例文件test_XXX.py
import pytest

class TestCase():

    def test_case_01(self,demo):
        print("打印param:{}".format(demo))

运行效果:(列表中的每一组数据都执行了一遍测试用例)

test-demo7.py::TestCase::test_case_01[a] PASSED                          [ 25%]打印param:a

test-demo7.py::TestCase::test_case_01[b] PASSED                          [ 50%]打印param:b

test-demo7.py::TestCase::test_case_01[demo2] PASSED                      [ 75%]打印param:{'name': 'user1'}

test-demo7.py::TestCase::test_case_01[demo3] PASSED                      [100%]打印param:{'name': 'user2'}

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

3.ids参数实例讲解

  • 用例标识ID
  • 与params配合使用,一对一关系

代码示例:

#conftest.py前置定义文件
@pytest.fixture(params=["a","b",{"name":"user1"},{"name":"user2"}],ids=["one","two","three","four"])
def demo(request):
    return request.param
#测试用例文件test_XXX.py
import pytest

class TestCase():

    def test_case_01(self,demo):
        print("打印param:{}".format(demo))

运行效果:

test-demo7.py::TestCase::test_case_01[one] 回话前置 #运行时显示了我们指定的ids
PASSED                        [ 25%]打印param:a

test-demo7.py::TestCase::test_case_01[two] PASSED                        [ 50%]打印param:b

test-demo7.py::TestCase::test_case_01[three] PASSED                      [ 75%]打印param:{'name': 'user1'}

test-demo7.py::TestCase::test_case_01[four] PASSED                       [100%]打印param:{'name': 'user2'}
回话后置

============================== 4 passed in 0.02s ==============================

4.autouse参数实例讲解

  • 默认False

  • 若为True,刚每个测试函数都会自动调用该fixture,无需传入fixture函数名

  • 由此我们可以总结出调用fixture的三种方式:
    1.函数或类里面方法直接传fixture的函数参数名称
      2.使用装饰器@pytest.mark.usefixtures()修饰
      3.autouse=True自动调用,无需传仍何参数,作用范围跟着scope走(谨慎使用)

代码示例:

#conftest.py前置定义文件
import pytest

@pytest.fixture(scope="session",autouse=True)
def init_session():
    print("回话前置")
    yield
    print("回话后置")
#测试用例文件test_XXX.py
import pytest

class TestCase():

    def test_case_01(self):  #这里没有调用前置,看看运行是否自动执行了
        print("测试用例01")

运行效果:

test-demo7.py::TestCase::test_case_01 回话前置  #前置自动执行了
PASSED                             [100%]测试用例01
回话后置
============================== 1 passed in 0.01s ==============================

5.name参数实例讲解

  • fixture的重命名
  • 通常来说使用 fixture 的测试函数会将 fixture 的函数名作为参数传递,但是 pytest 也允许将fixture重命名
  • 如果使用了name,那只能将name传如,函数名不再生效

代码示例:

#conftest.py前置定义文件
@pytest.fixture(scope="function",name="new_fixture")
def demo_name():
    print("用例前置")
    yield
    print("用例后置")
#test_xxx.py测试用例文件
#测试用例文件test_XXX.py
import pytest

class TestCase():

    def test_case_01(self,new_fixture): #使用新名字调用前置
        print("测试用例01")

运行效果:

test-demo7.py::TestCase::test_case_01 用例前置
PASSED                             [100%]测试用例01
用例后置
============================== 1 passed in 0.01s ==============================

标签:01,自定义,py,fixture,pytest,print,Pytest,test
From: https://www.cnblogs.com/ckxingchen/p/17057166.html

相关文章

  • 4. Pytest自定义前置后置:fixture简单应用
    一、前言前面讲到用例加setup和teardown可以实现在测试用例之前或之后加入一些操作,但这种是整个脚本全局生效的,如果我想实现指定某一个执行前置,另一个不执行前置,则需......
  • 6.Pytest参数化:parametrize简单应用
    一、前言参数化的目的是为了使测试用例代码与测试数据进行分离,这样,测试人员只需要维护测试数据,而不用更改代码。pytest模块给我们提供了专门用来参数化的装饰器:@pytest.ma......
  • 7. Pytest参数化:parametrize参数详解(了解)
    一、前言上节课我们讲解了如何用parametrize装饰器进行参数化,它有5个参数,argnames,argvalues,indirect,ids,scope,本节课针对这五个参数做详细讲解。二、学习目标1.a......
  • 9. Pytest标记预计失败的用例:xfail
    一、前言我们现在要学的pytest.xfail()和pytest.skip()有些相似,只不过他的含义是:将该用例标记成xfail失败,并且该用例中的后续代码不会执行。二、学习目标[email protected]......
  • 8. Pytest跳过某个测试用例:skip和skipif
    一、前言skip和skipif,看名字就是跳过测试的意思,主要用于不想执行的代码,标记后,标记的代码不执行。希望满足某些条件才执行某些测试用例,否则pytest会跳过运行该测试用例......
  • 11. Pytest常用插件:pytest-ordering调整用例执行顺序
    一、前言在pytest中,测试用例的默认执行顺序是从上到下执行的,但是有时候我们会有这样的需求,就是打乱测试用例的执行顺序来达到某个测试效果,这时候就需要用到Pytest中的一个......
  • 10. Pytest设置用例标签:mark
    一、前言mark主要用来标记用例,通过不同的标记实现不同的运行策略。一个大项目自动化用例时,可以划分多个模块,也可以使用标记功能,标明哪些是模块1用例,哪些是模块2的,运行代码......
  • 13. Pytest常用插件:pytest-repeat重复运行用例
    一、前言上面我们介绍了当用例失败时的重复运行,其实我们在实际工作中还会遇到一种情况,我们就是单纯的想让某条用例重复运行指定的次数。平常在做功能测试的时候,经常会遇......
  • 12. Pytest常用插件: pytest-rerunfailures失败用例重跑
    一、前言测试环境不稳定偶发接口超时(和服务无关,纯粹是环境问题),然后执行接口case也因此偶发失败。比如同一个接口case跑五次,其中有两次失败,另外三次都是成功的,这种偶发性的......
  • echarts自定义tooltip提示框内容
    需求:echarts中的tooltip提示框需要拼接单位,效果如下:代码:tooltip:{trigger:'axis',formatter:(params)=>{//unit为单位,此处是需要动态拼接单位......