在日常接口自动化测试过程中,在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()