使用fixture来传递token(方法一)

fixture的解释chatgpt的解释,我直接抄过来的):

在 Pytest 中,Fixture 是一种用来为测试函数提供初始化数据、执行某些操作、进行测试后的清理等工作的装置。Fixture 可以被定义在测试模块或者测试文件中,也可以跨越多个测试模块或者测试文件进行共享。Fixture 能够大大简化测试用例编写的工作量,提高测试用例的可维护性、可读性、可重复性和可扩展性。

使用 Fixture 的过程中,我们需要定义一个返回测试数据或者测试环境的函数,并且给这个函数打上 @pytest.fixture 装饰器,Pytest 会自动将这个函数作为一个 Fixture 来运行。我们可以使用这个 Fixture 名称来注入测试函数中的参数中,这样测试函数就能够使用 Fixture 返回的数据或者环境了。我们也可以在测试函数中使用 Fixture 函数返回的上下文管理器,来确保测试数据的生命周期,例如在测试前的数据初始化和测试后的数据清理等操作。

1.先读取yaml文件里面的接口参数

def read_yaml_select():
    with open('select.yaml','r',encoding="utf-8") as f:
        value = yaml.load(f,Loader=yaml.FullLoader)
        return value

2.获取token,使用fixture来将获取到的token进行参数传递

@pytest.fixture()
def getToken():
    '''获取token,使用fixture来将获取到的token进行参数传递,调用时使用getToken函数即可'''
    r = requests.post(
        url='http://xxx/login',
        json= {"account":"admin","password":"123456"}
    )
    return r.json()['data']['token']
    # print(r.json()['data']['token'])

3.参数用例

@pytest.mark.parametrize('args1',read_yaml_select()['holiday'])
# 这里的getToken函数是获取到的token
def test_get_all_holiday(args1,getToken):
    url = args1["request"]["url"]
    method = args1["request"]["method"]
    data = args1["request"]["data"]
    # 替换 header 中的 token
    # 由于日常工作中token一般是作为header传入的,所以我们这里需要将获取到的token,传入到header里面去。最后整体调用header
    template_token2 = Template(args1["request"]["header"]['token'])
    args1["request"]["header"]['token'] = template_token2.safe_substitute({"token":"{0}".format(getToken)})
    headers = args1["request"]["header"]
    # print(type(headers))
    r = requests.request(url=url, method=method, json=data, headers=headers)
    print(r.json())

4.yaml文件

holiday:
  - name: 查询请假数据
    request:
      method: post
      url: http://使用到token的接口/page
      data:
        startTime:
        endTime:
        currPage: 1
        pageSize: 10
        unitId:
      header:
        Accept-Encoding: gzip, deflate
        Accept-Language: zh-CN,zh;q=0.9
        Connection: keep-alive
        Content-Length: str(68)
        Content-Type: application/json;charset=UTF-8
        User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36
        # 将token的值使用参数化,方便我们后面替换他
        token: $token

5.整体代码

import pytest
import requests
import yaml
from string import Template

'''
fixture
1.返回值
2.初始化清理
3.conftest.py
4.fixture的参数化
'''


def read_yaml_select():
    with open('select.yaml','r',encoding="utf-8") as f:
        value = yaml.load(f,Loader=yaml.FullLoader)
        return value



@pytest.fixture()
def getToken():
    '''获取token,使用fixture来将获取到的token进行参数传递'''
    r = requests.post(
        url='http://登录接口',
        json= {"account":"pos","password":"2"}
    )
    return r.json()['data']['token']
    # print(r.json()['data']['token'])

@pytest.mark.parametrize('args1',read_yaml_select()['holiday'])
def test_get_all_holiday(args1,getToken):
    url = args1["request"]["url"]
    method = args1["request"]["method"]
    data = args1["request"]["data"]
    # 替换 header 中的 token
    '''
    由于日常工作中token一般是作为header传入的,
    所以我们这里需要将获取到的token,
    传入到header里面去,最后整体调用header。
    '''
    template_token2 = Template(args1["request"]["header"]['token'])
    args1["request"]["header"]['token'] = template_token2.safe_substitute({"token":"{0}".format(getToken)})
    headers = args1["request"]["header"]
    # print(type(headers))
    r = requests.request(url=url, method=method, json=data, headers=headers)
    print(r.json())


if __name__ == '__main__':
    pytest.main('-v','-s','test_one.py')

6.总结
由于我们在获取token的代码未使用到参数化(本人不是很喜欢),最终就达不到代码与测试数据的分离,不利于代码更加清晰和易于维护。所以不是很推荐这种方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值