接口自动化测试框架
一、接口自动化测试框架(python+request+unittest+ddt)
首先我们新建一个新项目:名称zdh
二、在一个项目中:新建6个包
第一个包conf包用来填写配置参数、地址等
第二个包data 包用来存放测试用例的表格
第三个包report 包用来存放测试报告
第四个包case 用例包 用来编写测试用例
第五个包run包 运行包 用来运行所有的用例或邮件等
第六个包utils 包 工具类包 存放所有自己封装的语句和外包导入的工具函数
三、我们开始来编写框架,今天这个接口自动化框架只要是为了实现一个接口有多条用例的情况;
详解:
(1)cmf_ini 新建一个ini文件
ini 文件中格式: ini文件中的数据是动态变化
节点
键=值
[env] #section #option
url= http://cms.duoceshi.cn
headers = {"Content-Type":"application/x-www-form-urlencoded"}
[test_data]
username = admin
pwd = 123456
[db]
[email]
(2)我们要把整个项目项目中的路径设计好。如下:
# 定义项目的路径
# 获取当前运行脚本的绝对路径
import os
base_path = os.path.dirname(os.path.dirname(__file__))
# print(base_path)
# 定义conf的路径
conf_path = os.path.join(base_path,'conf')
# 定义data的路径
data_path = os.path.join(base_path,'data')
# 定义report路径
report_path = os.path.join(base_path,'report')
#定义testcase路径
testcase_path = os.path.join(base_path,'testcase')
(3)然后可以把我们接口用例写好,用xlsx的表格
(4)创建一个接口调用的方法:api 报名
#这个模块是用来封装发送接口请求的工具类,我们首先先顶定义一个类Send_requests,那么要根据类创建对象,
保存会话,我们请求的参数在Session() 点击下ctrl;我们请求的method是哪一种,我们去判断
import requests
class Send_requests(object): def __init__(self):self.session=requests.Session() # 创建session对象保持会话def send(self,method,url,data= None,json=None,params=None,headers= None):method=method.lower() #接口请求方法中都转换成小写格式if method=='get': #对mehod做判断response=self.session.get(url,params)elif method=='post': # 还有很多异常分支response=self.session.post(url,data,headers)elif method=='post_json':response=self.session.post(url,json,headers)elif method=='delete':response=self.session.delete(url,data)elif method=="put":response=self.session.put(url,data)return response
这个封装完以后,就涉及到数据的入参(如,环境,url等),我们可以去读取ini文件中的配置参数
首先要下载ConfigParser 模块
from configparser import ConfigParser #导入ConfigParser文件
from conf.cms_path import *
import os
class R_conf(ConfigParser): #可以使用继承,可以不使用继承,我们现在继承了ConfigParser类,我们要调用def __init__(self,filename): #构造函数super(R_conf,self).__init__() #继承父类的构造方法self.filename=filename #把传进来实行参数赋值给到实例变量self.read(self.filename) #我要读ini文件进行读取def get_value(self,section,option): #获取ini文件的数据value=self.get(section,option) #return value
path=os.path.join(conf_path,"cms_conf.ini")
c=R_conf(path)
print(c.get_value("env","url"))
# print(c.get_value("test_data","username"))
我们封装一个编写read_excel.py 的py文件在utils下:
我们要下载一个openpyxl
我们要实现读excel模块
#封装一个读取表格的工具类import openpyxl
from conf.cms_path import *class R_excel(object): #我们封装一个读取excel表格的数据def __init__(self,filename,sheet_name): self.filename=filenameself.sheet_name=sheet_namedef open(self): #打开excel 表格取对应的sheet页面#load_workbook是打开表格,加载打开页面self.wb=openpyxl.load_workbook(self.filename)#self.wb这个对象读取对应sheet页面self.sh=self.wb[self.sheet_name] #根据页面名来读取def read_data(self): #定义一个读取数据self.open() #先调用open打开表格datas=list(self.sh.rows) #把每一行的元数据放在list列表# print(datas)# for i in datas[0]:# print(i.value)title=[i.value for i in datas[0]]cases=[]for j in datas[1:]:values=[k.value for k in j]# print(values)case=dict(zip(title,values)) #把# print(case)cases.append(case) #把所有数据添加到列表return cases #把所有的用例作为返回参数def write_excel(self,row,colum,value=None):self.open()self.sh.cell(row,colum,value)self.wb.save(self.filename)
if __name__ == '__main__':path=os.path.join(data_path,"apicase.xlsx"c=R_excel(path,'login')# c.read_data()c.write_excel(2,8,'通过')
在封装一个登录的公共方法
from utils.read_conf import *
from utils.api import Send_requests
class Cms_login():def login(self):request=Send_requests()url=c.get_value('env','url')+'/cms/manage/loginJump.do'data={'userAccount': 'admin', 'loginPwd': '123456'}headers={"Content-Type":"application/x-www-form-urlencoded"}response=request.send(method='post',url=url,data=data,headers=headers)print(response.json())return request
if __name__ == '__main__':DX=Cms_login()DX.login()
然后再开始在testcase模块中编写用例
定义:test_login
import unittest
from ddt import ddt,data,unpack,file_data
from utils.read_excel import *
from conf.cms_path import *
from utils.api import Send_requests
from utils.read_conf import ccase_file = os.path.join(data_path,'apicase.xlsx')@ddt
class Test_Login(unittest.TestCase):excel = R_excel(case_file,'login')cases = excel.read_data() #一个列表当中是5个字典,每个字典都是一个用例# print(cases)request = Send_requests() #创建了一个发送接口请求的对象@data(*cases)def test_01_login(self,case):'''封装登录接口''' #数据要从Excel表格里面拿# 1.准备接口的入参url = c.get_value('env','url')+case['url']print(url)# eval() 函数是用来执行一个字符串表达式,并返回表达式的值headers = eval(c.get_value('env','headers'))method = case['method']data = eval(case['data'])excepted = eval(case['excepted'])case_id = case['case_id']case_id = case_id+1 #记录当前跑了几条用例# 2.发送接口请求response = self.request.send(method=method,url=url,data=data,headers=headers)result = response.json()# print(result)# 3.对接口的响应内容进行断言try: #try尝试去执行代码self.assertEqual(excepted['msg'],result['msg']) #断言期望结果和实际结果是否一直self.assertEqual(excepted['code'],result['code'])except Exception as e: #捕捉异常self.excel.write_excel(case_id,8,'未通过')print(e)else:self.excel.write_excel(case_id,8,'通过')if __name__ == '__main__':unittest.main()
封装好了用例模板以后就可以安装格式进行读取
写好用例以后,我们要在run包,将内容运行生成报告,发送邮件邮件
第一:将报告模板,邮件导入工具类中