pytest之fixture前置和后置

一、conftest.py

定义公共的fixture,多个测试类中都可以调用
pytest提供了conftest.py文件,可以将fixture定义在此文件中
运行测试用例时,不需要去导入这个文件,会自动去查找conftest.py文件,然后去找到对用的fixture

二、前置和后置

fixture函数根据关键字yield作为前置和后置的分割线,并且yield也可以接收返回值,作用相当于return

unittest的前置后置写在setUp和tearDown中的,如果其他测试类有一样的前置后置我要重复运用这些前置后置unittest办不到,或者我需要用之前的部分前置 后置.pytest的共享conftest.py的函数里面的前置后置,可以做到前置后置共享。也不要引用。

image.png
@pytest.fixture(scope="class")
def access_web():
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get(cd.login_url)
    yield driver
    driver.quit()


@pytest.fixture(scope="class")
def longin_web(access_web):  # 继承access_web的前置后置 access_web作为参数,也作为返回值
    # 以学生帐叼,登陆系统。这里是在网页上操作
    # driver = webdriver.Chrome()
    # driver.maximize_window()
    # driver.get(cd.login_url)
    LoginPage(access_web).login(*cd.student_user)
    # ip = IndexPage(access_web)
    yield access_web
    # driver.quit()
# 先调用access_web的前置
# 在调用自己的前置
# 在执行用例
# 在执行自己的后置
# 在执行access_web的后置
#继承顺序 函数可以继承类 类可以继承模块 模块可以继承会话 低级别可以跨越继承高级别

import pytest

@pytest.fixture()
def init_demo():
    print("这是测试用例的前置")
    a = 1
    yield a  # 分割线(yield + 返回值)
    print("这是测试用例的后置")

三、调用fixture

1.在测试用例中直接调用

  • 将fixtures的函数名称作为测试用例的入参

  • 如果fixture有返回值,那么测试用例中的fixture函数名称就接收返回值,并且可以将fixture函数名称作为返回值使用

def test_add_01(init_demo):
    b = init_demo + 2
    assert 3 == b

如图打断点分析

image.png

2.用fixture装饰器调用fixture

  • 在测试用例/测试类前面加上@pytest.mark.usefixtures('fixture函数名称')
  • ps:定义conftest.py文件,在此文件中可以定义多个fixture,pytest会自动搜索此文件
import pytest


@pytest.mark.usefixtures('init_demo')
def test_add_02():
    b = 1 + 2
    assert 3 == b
image.png

3.用autos调用fixture

  • 在定义fixture时,有一个参数autouse,默认设置的为False
  • 当默认为False,就可以选择用上面两种方式来使用fixture
  • 当设置为Ture时,在一个session内的所有的test都会自动调用这个fixture,建议该开关谨慎使用
      conftest代码如下:

import pytest

@pytest.fixture(autouse=True)
def init_demo():
    print("这是测试用例的前置")
    yield
    print("这是测试用例的后置")

测试代码如下

import pytest


def test_add_02():
    b = 1 + 2
    assert 3 == b
image.png

四、fixture的继承(前置的前置,后置的后置)

  • 作用域(scope关键字):function/函数级(测试用例)、class/类级(测试类)、- module/模块级(测试模块—py文件)、session/会话级(整个测试执行会话)
  • 形象比喻:夹心饼干
  • 继承条件:作用域由里向外继承作用域,也可以继承同级的作用域
  • 执行顺序:前置由外层到内层执行,后置由内层到外层执行,先执行最里层的作用域,在执行它的上一层作用域,直到再向外找不到作用域为止
  • 继承方法:直接将继承的fixture的函数名称作为入参传入即可
  • 返回值:继承父类的同时,也继承了父类的返回值
      conftest.py代码如下:
import pytest

@pytest.fixture(scope='session')
def init_session():
    print("这是测试会话的前置")
    yield
    print("这是测试会话的后置")


@pytest.fixture(scope='module')
def init_module(init_session):
    print("这是测试模块的前置")
    yield
    print("这是测试模块的后置")


@pytest.fixture(scope='class')
def init_class(init_module):
    print("这是测试类的前置")
    yield
    print("这是测试类的后置")


@pytest.fixture  # 相当于@pytest.fixture(scope='function')
def init_function(init_class):
    print("这是测试用例的前置")
    yield
    print("这是测试用例的后置")
image.png

打印结果

image.png

fixture不同级别的执行次数

  • session 会话级,在一个会话只会执行一次。不管你在py文件打多少次,只会执行一次
  • module 模块级。 不管你在py文件,哪里多次打多少次,一个模块只会执行一次。
    会话级和module打一个对象头上,会先执行会话级的前置--module的前置--代码--module的后置--session的前置 如下图这种
    image.png

演示代码

mport 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  # 相当于@pytest.fixture(scope='function')
def init_function():
    print("这是测试用例的前置")
    yield
    print("这是测试用例的后置")

测试代码 全程打断点 可以看得非常清楚

image.png
image.png
  • 会话级 class 打类上面,类里面的测试用例在执行测试用例之前只会执行一次,相当于unittest的setupClass 和tearDownClass 例子我就不举了,但是如果类级别打在外面的函数上,还是会执行的。这里要注意
  • 函数级 函数级fixture打类上面,下面所有测试用例都会,执行函数级的前置 后置。类似unittest 的setUp tearDown.
    pytest fixture的作用域,函数级和会话级 可以用unittest的 setup setUpClass来理解
image.png
image.png

fixture的参数params接收一个容器比如list 元组 嵌套的list等等。传个内置的fixturerequest通过request.para返回。这种也可以类似parametrize功能。

image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,539评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,594评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,871评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,963评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,984评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,763评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,468评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,850评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,002评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,144评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,823评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,483评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,026评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,150评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,415评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,092评论 2 355

推荐阅读更多精彩内容