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

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

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

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

1.利用fixture读取测试数据文件并返回数据

# 利用fixture读取测试数据文件并返回数据
@pytest.fixture(scope="module")
def api_data():
    with open("test_fixture_token.yaml",'r',encoding='utf-8') as f:
        data = yaml.safe_load(f)
    return data

2.使用fixture来传递token

# 使用 api_data Fixture 来获取 token
# 获取token,使用fixture来将获取到的token进行参数传递
# 使用fixture来传递token
@pytest.fixture()
def token(api_data):
    # 使用 api_data Fixture 来进行测试
    # 这里读取yaml文件的时候为什么要带上[0]呢
    # 因为yaml文件返回的数据类型时列表,列表里面又包含字典。根据列表的读取特性,获取下标索引。所以这里就是[0]
    url = api_data['login'][0]['request']['url']
    method = api_data['login'][0]['request']['method']
    data = api_data['login'][0]['request']['data']
    r = requests.request(url=url,method=method,json=data)
    return r.json()['data']['token']

3.测试用例

# 测试用例
def test_get_all_holiday(api_data,token):
    # 获取接口参数
    url = api_data['holiday'][0]["request"]["url"]
    method = api_data['holiday'][0]["request"]["method"]
    data = api_data['holiday'][0]["request"]["data"]
    # 替换 header 中的 token
    # 由于日常工作中token一般是作为header传入的,所以我们这里需要将获取到的token,传入到header里面去。最后整体调用header
    template_token2 = Template(api_data['holiday'][0]["request"]["header"]['token'])
    api_data['holiday'][0]["request"]["header"]['token'] = template_token2.safe_substitute({"token":"{0}".format(token)})
    headers = api_data['holiday'][0]["request"]["header"]
    # 发送请求并验证响应结果
    r = requests.request(url=url, method=method, json=data, headers=headers)
    print(r.json())
    # return r.json()

4.yaml文件内容

login:
  - name: 登录并返回token
    request:
      method: post
      url: http://登录接口
      data:
        account: pos
        password: 2
      header:
    expect:
      code: 0

holiday:
  - name: 使用token
    request:
      method: post
      url: http://使用到token的接口
      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 requests
from string import Template
import pytest
import yaml

# 利用fixture读取测试数据文件并返回数据
@pytest.fixture(scope="module")
def api_data():
    with open("test_fixture_token.yaml",'r',encoding='utf-8') as f:
        data = yaml.safe_load(f)
    return data

# 使用 api_data Fixture 来获取 token
# 获取token,使用fixture来将获取到的token进行参数传递
# 使用fixture来传递token
@pytest.fixture()
def token(api_data):
    # 使用 api_data Fixture 来进行测试
    # 这里读取yaml文件的时候为什么要带上[0]呢
    # 因为yaml文件返回的数据类型时列表,列表里面又包含字典。根据列表的读取特性,获取下标索引。所以这里就是[0]
    url = api_data['login'][0]['request']['url']
    method = api_data['login'][0]['request']['method']
    data = api_data['login'][0]['request']['data']
    r = requests.request(url=url,method=method,json=data)
    return r.json()['data']['token']

# 测试用例
def test_get_all_holiday(api_data,token):
    # 获取接口参数
    url = api_data['holiday'][0]["request"]["url"]
    method = api_data['holiday'][0]["request"]["method"]
    data = api_data['holiday'][0]["request"]["data"]
    # 替换 header 中的 token
    # 由于日常工作中token一般是作为header传入的,所以我们这里需要将获取到的token,传入到header里面去。最后整体调用header
    template_token2 = Template(api_data['holiday'][0]["request"]["header"]['token'])
    api_data['holiday'][0]["request"]["header"]['token'] = template_token2.safe_substitute({"token":"{0}".format(token)})
    headers = api_data['holiday'][0]["request"]["header"]
    # 发送请求并验证响应结果
    r = requests.request(url=url, method=method, json=data, headers=headers)
    print(r.json())
    # return r.json()

if __name__ == '__main__':
    pytest("-v","-s","test_ai_union_token.py")

7.来看看chatgpt的解释:
在这个代码中,api_data 是一个 Fixture,它是用来读取测试数据的。为什么要使用 Fixture 呢?主要是因为 Fixture 可以在测试运行之前和之后自动运行一些代码,来帮助我们进行测试的前置和后置操作,例如读取测试数据、初始化测试环境、清理测试数据等。

在这个例子中,api_data 用来读取测试数据,这是一个很常见的 Fixture 的使用场景。因为测试数据通常比较多,而且需要被多个测试函数共享,所以我们把读取测试数据的代码放到一个 Fixture 中,然后在需要使用测试数据的测试函数中通过参数注入这个 Fixture,来方便地使用测试数据。这样做的好处是,我们可以将测试数据和测试函数分离,使得测试代码更加清晰和易于维护。

6.总结
这段代码为什么没有使用parametrize来达到参数化呢,其实fixture也可以达到参数化的效果。两者达到的效果都一样。喜欢用什么就用。至与这里如果要使用parametrize的话似乎比较麻烦,我也不知道怎么去处理。不过我还是更喜欢上面这种方法。省事。

方法一传送入口:https://blog.csdn.net/weixin_42619126/article/details/130034294?spm=1001.2014.3001.5502
读取和写入的方法来达到token传递:https://blog.csdn.net/weixin_42619126/article/details/123342715?spm=1001.2014.3001.5502

你可能感兴趣的:(python,pytest,自动化)