【pytest-6】fixture之conftest实现setup

前言

前面一篇文章详细介绍了setup和teardown的在测试前后可以加一些操作,但是这个是针对整个脚本全局生效的,

设想有以下场景:用例1需要登录,用例2不需要登录,用例3需要登录...这种就无法使用setup和teardown实现

fixture可以让我们自定义测试用例的前置

fixture的优点

  • 命名方式灵活,不局限于setup和teardown这几个命名
  • conftest.py配置里可以实现数据共享,不需要import就能自动找到fixture
  • scope="module"可以实现多个.py跨文件共享前置
  • scopr="session"可以实现多个.py跨文件使用一个session来完成多个用例

fixture参数列表

@pytest.fixture(scope="function", params=None, autouse=False, ids=None, name=None)
'''
使用装饰器标记fixture的功能
可以使用此装饰器(带或不带参数)来定义fixture功能。 fixture功能的名称可以在以后使用
引用它会在运行测试之前调用它:test模块或类可以使用pytest.mark.usefixtures(fixturename标记。
测试功能可以直接使用fixture名称作为输入参数,在这种情况下,夹具实例从fixture返回功能将被注入。
'''
def initFixture():
  
print("fixture初始化的参数列表")

参数列表解析:

  •        args scope:scope 有四个级别参数 "function" (默认), "class", "module" or "session". session的作用域:是整个测试会话,即开始执行pytest到结束测试
  •   args params:可选的参数列表,它将导致fixture函数和所有测试的调用使用它
  •   args autouse:如果为True,则为所有测试激活fixture func,如果为false(默认)则显示fixture需要参考来激活fixture
  •   args ids:字符串ID的列表,每个id对应于参数,因此他们是测试id的一部分,如果没有提供id,他们将从params自动生成。
  •   argd name:fixture的名称。 这默认为装饰函数的名称。 如果fixture在定义它的同一模块中使用,夹具的功能名称将被请求夹具的功能arg遮蔽; 解决这个问题的一种 方法是将装饰函数命名 “fixture_ <fixturename>”然后使用”@ pytest.fixture(name ='<fixturename>')“”。

注意:Fixtures可以选择使用 yield 语句为测试函数提供它们的值,而不是 return 。 在这种情况下, yield 语句之后的代码块作为拆卸代码执行,而不管测试结果如何。fixture功能必须只产生一次

conftest.py配置

场景1:如果多个.py文件都需要调用这个登录,不能把登录写到用例里面,就直接弄一个配置文件,单独管理一些前置的操作,pytest里面有默认的读取conftest.py里面的配置

 conftest.py配置要注意以下点:

  conftest.py配置脚本名称是固定的,不能该名称

  conftest.py与运行的用例要在同一个package下,且有__init__.py文件

  不需要import导入conftest.py,pytest用例会自动查找

示例代码:

conftest.py

#encoding:utf-8
#@Time:2020/11/30 13:54
#@Author:sunny

import pytest

@pytest.fixture()
def login():
    print("我是登录")

test_fixt1.py

#encoding:utf-8
#@Time:2020/11/29 14:24
#@Author:sunny

import pytest

def test_1(login):
    print("用例1:登录之后的其他操作")
def test_2():#不传login
    print("用例2:不需要登录的其他操作")
def test_3(login):
    print("用例3:登录之后的其他操作")
if __name__ == '__main__':
    pytest.main(['-s','test_fixt1.py'])

test_fixt2.py

#encoding:utf-8
#@Time:2020/11/30 14:03
#@Author:sunny

import pytest

def test_4(login):
    print("用例1:登录之后的其他操作")
def test_5():#不传login
    print("用例2:不需要登录的其他操作")

if __name__ == '__main__':
    pytest.main(['-s','test_fixt2.py'])

3.单独运行test_fix1.py和test_fix2.py都能调用到login()方法,这样就能实现一些公共的操作可以单独拿出来了

 

fixture参数传入(scope="function")

场景2:用例1需要登录,用例2不需要,用例3需要。

test_fixt.py

#encoding:utf-8
#@Time:2020/11/29 14:24
#@Author:sunny

import pytest

@pytest.fixture()
def login():
    print("我是登录")

def test_1(login):
    print("用例1:登录之后的其他操作")
def test_2():#不传login print("用例2:不需要登录的其他操作")
def test_3(login): print("用例3:登录之后的其他操作")
if __name__ == '__main__': pytest.main(['-s','test_fixt.py'])

运行结果:

Testing started at 21:33 ...

============================= test session starts =============================
collected 3 items

test_fixt.py 我是登录
.用例1:登录之后的其他操作
.用例2:不需要登录的其他操作
我是登录
.用例3:登录之后的其他操作
                                                         [100%]

========================== 3 passed in 0.03 seconds ===========================
Process finished with exit code 0

如果pytest.fixture()里面没有参数,默认是function,针对的是函数有效。

 

posted @ 2020-11-30 17:13  做一只热爱生活的小透明  阅读(340)  评论(0)    收藏  举报