之前的学习中,我们已经将需要的插件都安装好了,现在我们开始记录一下一个包含token关联的接口自动化框架的搭建全过程
我们的总体结构如下:
common:用来存放公共类 reports是生成报告temp是测试接口生成的json数据 ,用于生成报告的(详细可看之前的报告生成文章)testcases用来存放测试用例,其它就是一些配置文件,运行程序和前后置
第一步,YAML数据方法的封装
首先我们先对yaml数据的读取,写入,清除等方法进行封装,属于公共方法,因此我们在common下创建yaml_util.py代码如下
import os
import yaml
#读取
class YamlUtil:
# 读取
def read_yaml(self,key):
with open(os.getcwd() + '/extract.yaml', encoding='utf-8', mode='r') as f:
value = yaml.load(f, yaml.FullLoader)
return value[key]
# 写入
def write_yaml(self,data):
with open(os.getcwd() + '/extract.yaml', encoding='utf-8', mode='a') as f:
yaml.dump(data, stream=f, allow_unicode=True)
# 清空
def clear_yaml(self):
with open(os.getcwd() + '/extract.yaml', encoding='utf-8', mode='w') as f:
f.truncate()
# 读取测试用例
def read_testcase(self,yaml_name):
with open(os.getcwd() + '\\testcases\\' + yaml_name, mode='r', encoding='utf-8') as f:
value = yaml.load(f, yaml.FullLoader)
return value
第二步,接口请求的封装
依旧在common中创建request_util.py文件,代码如下:
import requests
import json
class RequestUtil:
sess= requests.session()
def send_request(self,method,url,datas=None,**kwargs):
method=str(method).lower() #转换小写
res=None
if method=="get":
res=RequestUtil.sess.request(method=method,url=url,params=datas,**kwargs)
elif method=="post":
if datas and isinstance(datas,dict):
datas=json.dumps(datas)
res=RequestUtil.sess.request(method=method, url=url, data=datas, **kwargs)
else:
pass
return res
这里我只封装了get和post两种请求,如果要使用其它方法,自行加入即可。
第三步,yaml数据创建
创建一个get_token.yaml文件,用来存放我们登录接口的用例,例如我的:
-
name: 获取接口统一鉴权码token接口
request:
method: post
url: https://***/jlcloud/api/login
data:
"account": "****"
"password": "014f4041514bc5dcb82845fe5efa3c54"
"project": "DEFAULT"
"teacherLogin": False
"clientId": "1"
"secret": ""
headers:
'Content-Type': 'application/json'
validate: None
-
name: 获取接口统一鉴权码token接口
request:
method: post
url: https://***/jlcloud/api/login
data:
"account": "***"
"password": "123456"
"project": "DEFAULT"
"teacherLogin": False
"clientId": "1"
"secret": ""
headers:
'Content-Type': 'application/json'
validate: None
yaml数据写入规则请看我之前的文章,
第二个接口是获取用户信息的get请求,我创建userinfo.yaml来存放第二个接口的用例
-
name: 获取接口统一鉴权码token接口
request:
method: get
url: https://***/jlcloud/api/login/getUserInfo
data:
{}
headers:
'Content-Type': 'application/json'
validate: None
第四步,接口测试自动化
数据准备完成后,在testcases下创建一个test_login的py文件,这里我们在test_login里写入代码、
import pytest
import requests
import json
from common.request_util import RequestUtil
from common.yaml_util import YamlUtil
class TestRequest:
pass
@pytest.mark.parametrize("args_name",YamlUtil().read_testcase('get_token.yaml')) ##读取测试用例的get_token.yaml文件中的参数及值,赋值给变量args_name
def test_login(self,args_name):
url=args_name['request']['url']
data = args_name['request']['data']
method= args_name['request']['method']
headers=args_name['request']['headers']
res = RequestUtil().send_request(method=method, url=url, datas=data, headers=headers)
print(res.text)
if "data" in res.text:
YamlUtil().write_yaml({"token":res.json()['data']}) #将token值写入yaml文件,执行后根目录生成extract.yaml文件,可在此查看提取的token
@pytest.mark.parametrize("userinfo", YamlUtil().read_testcase('userinfo.yaml'))##读取测试用例的userinfo.yaml文件中的参数及值,赋值给变量userinfo
def test_userinfo(self, userinfo):
token = YamlUtil().read_yaml('token') # 读取token的值
url = userinfo['request']['url']+'?token='+token #我这里的url需要带上token
data = userinfo['request']['data']
method = userinfo['request']['method']
headers = userinfo['request']['headers']
res = RequestUtil().send_request(method=method, url=url, datas=data, headers=headers)
print(res.text)
第五步,测试前置后置
在根目录下创建conftest.py,注意这个文件名称是pytest 框架写死的不能更改,常用来处理测试用例的前置条件。并用fixture标记一些函数,例如连接数据库的操作、或者我们这种token值变化,每次运行前就需要清除一下等
这里我们在测试时进行yaml数据清除
import pytest
from common.yaml_util import YamlUtil
@pytest.fixture(scope="function")
def exe_sql():
print("用例执行之前")
yield
print("用例执行之后")
#在所有的接口请求之前执行
@pytest.fixture(scope="session",autouse=True)
def clear_extract():
YamlUtil().clear_yaml()
第六步,运行
在根目录新建run.py文件
import pytest
import os
if __name__ == '__main__': # pytest运行模式
pytest.main()
os.system("allure generate ./temp -o ./reports --clean") ##生成测试报告
运行后,目录中会自动生成temp的json数据,以及reports里的的index.html文件,打开文件即可查看报告,如下:
这样一个简单的框架就搭建好了,当然这只是很初步的一个框架,很多问题使用这个框架是无法实现的,例如动态参数问题,数据太大的问题等,后续我在学习的过程中会继续跟进,欢迎各位前辈指点,讨论~
Original: https://blog.csdn.net/weixin_42833736/article/details/125488198
Author: 小丫么小二郎~
Title: 【python做接口测试的学习记录day5——pytest+yaml数据驱动+allure报告的一个包含token关联的自动化测试框架】
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/773462/
转载文章受原作者版权保护。转载请注明原作者出处!