在日常接口自动化测试过程中,在request请求时,遇到多个自动化接口用例设计时,发现很多请求的参数数据写在接口请求中会很多,很繁杂,不好维护。基于接口自动化测试数据驱动的思想,对测试数据和测试代码进行分离,就很好的解决了这个问题。

1、写所有请求的参数写在yaml配置文件中:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2023/8/28
# @Author  : ff
# config.yaml
# 使用-分隔用例,则yaml读取到的数据类型为列表
-
 case_title: 01 登录用例

 url: http://xx/ret/user/login

 method: POST

 headers:
   "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.6 (KHTML, like Gecko) Chrome/61.0.313.100 Safari/57.6"
   "Content-Type": "application/x-www-form-urlencoded"

 cookies: 0

 data:
   "email": "138236410xx"
   "password": "00039"
   "remember": "false"
   "forceToNetwork": "false"
   "accountType": "1"

 Assert:
   success:  True

-
 case_title: 02 获取id用例

 url: http://xx/res/getgappurl?apId=711&orgnType=web

 method: GET

 headers: 0

 cookies:
   '__loginType': ''
   'at': '91fc975-ef4e-4d24-8150-e9898dc1d7bb'
   'cd': 'xx.cn'
   'cn': '5d6a0cce4b0c465dbe8f49'
   'cu': '5dce486fe4b0d585b7e136'
   'redirectIndexUrl': '/xx-layout/home'
   'uuid': '90cf658-5546-4f10-807-b646521eb9f'

 data: 0

 Assert:
   success: True

-
 case_title: 03 工作流程

 url: http://xx/gtFlowTdoistV3?ticket=

 method: POST

 headers:
   "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/53.36 (KHTML, like Gecko) Chrome/61.0.363.100 Safari/57.36"
   "Content-Type": "application/x-www-form-urlencoded"

 cookies:
   '__logType': ''
   'at': '91fc975-ef4e-4d24-8150-e9898dc1d7bcb'
   'cd': 'xx.cn'
   'cn': '5db6a0cce4b0c65dbe8f494'
   'cu': '5dce486e4b0d5855b7e1396'
   'redirectIndexUrl': '/xx-layout/home'
   'uuid': '90cf628-546-4f10-807-b64621eb9f0'

 data:
   limi": "10"
   "paIndex": "1"

 Assert:
   success: True

-
 case_title: 04 工作审批

 url: http://xx/myFlwLstFomWidgt?ticket=

 method: POST

 headers:
   "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/57.36 (KHTML, like Gecko) Chrome/61.0.363.100 Safari/537.6"
   "Content-Type": "application/x-www-form-urlencoded"

 cookies:

 data:
   "paSize": "10"
   "paNumber": "1"

 Assert:
   success: True

-
 case_title: 05 获取接口授权

 url: http://xx/gtCategries?apId=711&ticket=

 method: POST

 headers:
   "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_3_5) AppleWebKit/537.6;KHTML,like Gecko) Chrome/61.0.316.100 Safari/537.6"
   "Content-Type": "application/json"

 cookies:

 data:

 Assert:
   success: True

-
 case_title: 06 获取内容

 url: http://xx/gtItemByCde?apId=104&ticket=

 method: POST

 headers:
   "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.3;KHTML,like Gecko) Chrome/61.0.3163.100 Safari/537.3"
   "Content-Type": "application/json"

 cookies:

 data:
   "scop": "globale"
   "itemCde": "syTxtSet"

 Assert:
   success: True

-
 case_title: 07 获取kt

 url: http://xx/fndItems?apId=711&ticket=

 method: POST

 headers:
   "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/57.36;KHTML,like Gecko) Chrome/61.0.3163.100 Safari/53.36"
   "Content-Type": "application/json"

 cookies:

 data:
   "scop": "glbal"
   "itemCdes": ["g_cloudfloProxySet","g_bascDataSet","g_handwritenignatureSet"]

 Assert:
   success: True

2、封装request请求,引入yaml请求参数,进行接口自动化测试

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2023/8/28
# @Author  : ff

import requests
import yaml
import json
import os
import re
import logging

class AutoTest_yaml():

    def __init__(self, file):
        self.file = file

    def sign_testcase(self,title,url,method,headers,cookies,datas,Assert):
        print("用例标题:", title)
        response = requests.request(url=url, method=method, headers=headers,cookies=cookies,data=datas)
        response = json.loads(response.text)
        # print(response)
        try:
            # 通过Assert对比,判断实际结果是否与预期结果一致
            if Assert['success'] == response['success']:
                print("测试通过\n")
            else:
                print("*** 测试失败 ***\n")
                print("***测试失败的用例是{}\n".format(title))
        except Exception as e:
            logging.exception(e)

    def test_send_request(self):
        with open(self.file, encoding='utf-8') as fobj:
            content = fobj.read()
           # 使用 yaml.load()将yaml数据转换为list
            data = yaml.load(content, Loader=yaml.FullLoader)
            # print(data)
           # 使用for循环,依次读取测试用例
            for i in range(len(data)):
                # 访问从config.yaml中提取的列表数据:data 中元素的值
                title = data[i]['case_title']
                url = data[i]['url']
                method = data[i]['method']
                headers = data[i]['headers']
                # print(headers)
                cookies = data[i]['cookies']
                datas = data[i]['data']
                # print(datas)
                Assert = data[i]['Assert']
                # self.sign_testcase(title,url,method,headers,cookies,datas,Assert)
                if i == 0:
                    response = requests.request(url=url, method=method, headers=headers, cookies=cookies, data=datas)
                    self.cookies = requests.utils.dict_from_cookiejar(response.cookies)
                    self.sign_testcase(title, url, method, headers, cookies, datas, Assert)
                if i >= 1 and i != 5 and i != 6:
                    cookies = self.cookies
                    url = url + str(AutoTest_yaml.Acquire_Ticket(self))
                    self.sign_testcase(title, url, method, headers, cookies, datas, Assert)
                if i == 5 or i == 6:
                    cookies = self.cookies
                    url = url + str(AutoTest_yaml.Acquire_Ticket(self))
                    datas = json.dumps(data[i]['data'])
                    self.sign_testcase(title, url, method, headers, cookies, datas, Assert)
                    

if __name__ == "__main__":
    report_path = os.path.abspath(os.path.join(os.getcwd(), ".."))
    YamlConfig = report_path + '/comm' + '/config.yaml'
    Obj_AutoTest_yaml = AutoTest_yaml(YamlConfig)
    Obj_AutoTest_yaml.test_send_request()