pytest+requests+allure实现接口自动化测试系列(8)-接口之间的数据依赖

2022-07-21 15:01:59 浏览数 (1)

接着上一篇分享

我们做接口测试的时候,肯定会遇到接口间数据依赖的问题,就是上一次接口的数据,是下一个接口的请求参数,最常见的是登录时,token是每个接口都需要传递的参数

下面的是两个接口的的数据,使用过jmeter的同学应该知道jmeter变量引用的方式是{变量名},我参照jmeter的用法,也是通过{变量名}进行变量引用

代码语言:javascript复制
  - testCase:
      description: login success
      name: login
      method: post
      uri: "https://api2.mubu.com/v3/api/user/phone_login"
      headers:
        Content-Type: application/json
      payload:
        phone: "13528872dsds"
        password: "Aa12345678"
        callbackType: 0
      extract:
        token: $.data.token
      validate:
         - equal_to:
            $.code: 0
         - equal_to:
            $.code: 0
  - testCase:
      description: profile
      name: profile
      method: post
      uri: "https://api2.mubu.com/v3/api/user/profile"
      headers:
        Content-Type: application/json
        jwt-token: ${token}
      payload: {}
      validate:
        - equal_to:
            $.code: 0
        - equal_to:
            $.code: 0

如何实现?

需要两个步骤

1.读取数据时,先找出所有符合${变量名}格式的字符

2.从EnvData获取对应变量名的值替换对应的字符串

在utils.py新增函数handle_request_data,代码如下:

代码语言:javascript复制
    @staticmethod
    def handle_request_data(request_data: dict):
        """
        :param request_data: 请求的数据
        :return: 返回替换后的request_data
        """
        request_data = json.dumps(request_data)
        regex = r"${. ?}"
        regex_obj = re.compile(regex)
        replace_values = regex_obj.findall(request_data)
        for val in replace_values:
            key = val[2:-1]  # 截取变量名
            request_data = request_data.replace(val, getattr(EnvData, key))
        return json.loads(request_data)

实验下,编写的函数是否起作用,我们修改下测试用例,示例代码如下:

代码语言:javascript复制
#!/usr/bin/python
# -*- coding: utf-8 -*-
import pytest
from common.request_handler import request_handler
from common.yamlRead import read_yaml
from common.logger import logger
from common.utils import Utils


class Testrequests:
    @pytest.mark.parametrize('test_data', read_yaml('../testData/login.yml'))
    def test_requests(self, test_data):
        request_data = test_data['testCase']
        request_data = Utils.handle_request_data(request_data)
        method = request_data['method']
        headers = request_data['headers']
        url = request_data['uri']
        data = request_data['payload']
        logger.debug(request_data)
        response = request_handler(method, url, headers, data)
        if 'extract' in request_data:
            Utils.extract(request_data['extract'], response)

执行测试用例,查看第一个用例的请求数据是否带上第一个接口的token

执行结果,可以看到第一个接口的请求数据jwt-token已经被替换成token的值啦!

0 人点赞