pytest的fixure详解,以及如何在场景中利用


前言

在构建自动化框架的时候,我们想要按照自己的想法构建一些方法,但是利用了单元测试框架,在不破坏单元测试框架运行的前提下,pytest官方给出了一个很好的解决办法,那就是利用fixure来构建一些,需要在test用例之前执行的方法


提示:以下是本篇文章正文内容,下面案例可供参考

一、首先来简单介绍一下fixure的属性:

在这里插入图片描述1、的scope:scope是用来确定fixure作用的范围,scope有四个作用范围,分别是function、class、mdolue、session,后面我们会具体讲解这四个范围的用法

2、params:是用来对fixure进行传参的,是一个可选的参数列表,根据列表中的数量,多次调用fixure

3、autouse:默认是Flase,它的作用就是在当前的scope范围下,自动调用。

4:ids:每个对应于参数的字符串 id 列表,因此它们是测试 id 的一部分。如果没有提供 id,它们将从参数中自动生成。这个就相当于利用params进行fixure参数化时,生成一个特定的id显示,ids是结合params来使用的。

5:name:相当于为fixure取了一个别名,调用的时候直接调用别名即可。

二、fixure的作用范围:

function的作用范围是函数级别的,实例代码如下:

#conftest.py
import pytest
@pytest.fixture()
def login():
    print("开始fixure")
    yield
    print("结束fixure")
#conftets.py的作用就是在执行test用例之前调用,conftest的作用很大,后续文章会讲到
import pytest
#test_123.py
def test_1(login):
    print("这个是测试用例test1")
def test_2(login):
    print("这个是test2")

if __name__=="__main__":
    pytest.main()

运行结果:
在这里插入图片描述可以看出fixure默认作用范围是function,他只在函数中起作用,其中的yield可以看成是后置操作,yield之前是在test用例之前执行,之后是在执行完一个test用例之后执行。接下来我们来看看scope作用范围是class的介绍
同样的conftest.py:
在这里插入图片描述在conftest.py中我们只需要将scope=‘class’让她的作用范围是class级别的
test_123.py:
在这里插入图片描述运行结果:
在这里插入图片描述可以看见scope='class’的时候,不管函数调用几次fixure,都只执行一次。

注意是一次,以此类推scope='modoule’时,只在.py级别运行一次,不管.py中有多少个class,scope='session’时,在多个文件之间,只运行一次。

但是,当fixure有返回值的时候,我们可以多次调用返回的值,返回值可以看成一个全局变量,调用一次,执行一次。

可能有人会说,每次都要调用fixure很麻烦,fixure提供了autouse,当autouse=True时,fixure会自动执行指定scope范围,比如scope=‘function’,autouse=True那么fixure将会在每个test用例执行之前,执行一次。
conftest.py:

import pytest
@pytest.fixture(autouse=True)
def login():
    print('开始执行fixure')
    yield
    print('结束fixure')

test_123.py:

import pytest

#test_123.py
class Test:
    def test_1(self):#这次没有调用login
        print("这个是测试用例test1")
    def test_2(self):
        print("这个是test2")

if __name__=="__main__":
    pytest.main()

运行结果:
在这里插入图片描述可以看见我们设置了autouse=True时,在没有调用的时候fixure也被执行了,因为我们fixure的scope默认是function,所以fixure每次都在test函数之前被调用。

三、fixure参数化

上面我们讲到fixure的param主要作用就是对fixure传参。
conftest.py

@pytest.fixture(params=['test1','test2','test3'],autouse=True)
def login(request):
    return request.param

test_123.py

import pytest
#test_123.py
class Test:
    def test_1(self,login):
        print("运行param的:{}".format(login))
if __name__=="__main__":
    pytest.main()

运行test_123.py:
在这里插入图片描述可以看见我们的test_1调用fixure,刚好fixure的param有三个值,所以test_1也就执行了三次来传param的三个参数。有时候param的值可以一样,所以生成的ids也就一样,所以为了进行区分,所以我们也可以对ids自定义命名
conftest.py:

@pytest.fixture(params=['test1','test2','test3'],ids=['param1','param2','param3'])
def login(request):
    return request.param

运行结果:
在这里插入图片描述可以看见我们红框中出现了我们自定义的ids,ids具体利用可以运用到用例的区分上。

四、fixure在实际场景中的利用

前面我们说到fixure是在用例执行之前调用,在实际的测试场景中有很多需要我们在测试之前准备的工作,比如在测试之前清空数据库,写入测试日志的一些准备工作,接口测试之前的一些准备工作(得到返回的token等),如果每次执行用例都需要登录的话,也可以将登录方法写到fixure提高复用性。下面通过一个例子来运用fixure,希望大家举一反三:

import time
import pytest
#test_123.py
class Test:
    def test_1(self,dri):
        dri.get("http://www.baidu.com")
        print("进行自动化操作")
        dri.find_element_by_id("kw").send_keys('123')
        time.sleep(1)
if __name__=="__main__":
    pytest.main()

conftest.py

import pytest
from selenium import webdriver
@pytest.fixture
def dri():
    print("打开浏览器")
    driver=webdriver.Chrome()
    return driver
@pytest.fixture(autouse=True)
def driver_quit(dri):
    yield
    print("test_1执行完毕,关闭浏览器")
    dri.quit()

由此我们就完成了pytest的固件介绍,感谢支持!!!更多问题请关注微信公众python自动化测试技术.
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值