pip install requests
pip install xlrd
pip install json
pip install unittesthtml
import requests #导入requests模块 class Base(): def method_post(self,url,params = None,data = None,headers = None,files = None): return requests.post(url = url,params = params,data = data,headers = headers,files = files) def method_get(self,url,params = None,data = None,headers = None,files = None): return requests.get(url = url,params = params,data = data,headers = headers,files = files) def method_put(self,url,params = None,data = None,headers = None,files = None): return requests.put(url = url,params = params,data = data,headers = headers,files = files) def method_delete(self,url,params = None,data = None,headers = None,files = None): return requests.delete(url = url,params = params,data = data,headers = headers,files = files)
由于每个请求都会有params参数或是data参数,可是不可能两个都存在,因此这里用了None,依次类推python
def requests_type(self,method,url,params = None,data = None,headers = None,files = None): if method =='post' or method =='POST': return self.method_post(url = url,params = params,data = data,headers = headers,files = files) elif method =='get' or method =='GET': return self.method_get(url = url,params = params,data = data,headers = headers,files = files) elif method =='put' or method =='PUT': return requests.put(url = url,params = params,data = data,headers = headers,files = files) elif method =='delete' or method =='DELETE': return requests.delete(url = url,params = params,data = data,headers = headers,files = files)
也能够对须要拿到cookie的接口进行封装方法保存:面试
def Get_Login_cookie(self,data): res = self.method_post(url = "请求网址",data = data) return {"userId":str(res.json()['result']['userId']),"sessionId":res.json()['result']['sessionId']}
以后咱们要将base页验证的这些代码作清除,不然的话永远都是调的这些接口json
这里我添加了一个data包,用于存放xlrd表,以及html报告存放路径、log日志存放路径api
log_path = r'D:\PycharmProjects\自动化接口\自动化接口测试\report\logs' report_html = r'D:\PycharmProjects\自动化接口\自动化接口测试\report\html' read_xlrd = r'D:\PycharmProjects\自动化接口\自动化接口测试\data' class Common(): #封装日志方法 def get_logs(self,path = log_path): import logging,time logs = logging.getLogger() logs.setLevel(logging.DEBUG) path = path+'/' + time.strftime('%Y-%m-%d-%H-%M-%S') + '.log' write_file = logging.FileHandler(path,'a+',encoding='utf-8') write_file.setLevel(logging.DEBUG) set_logs = logging.Formatter('%(asctime)s - %(filename)s - %(funcName)s - %(levelname)s - %(message)s') write_file.setFormatter(set_logs) pycharm_text = logging.StreamHandler() pycharm_text.setFormatter(set_logs) logs.addHandler(write_file) logs.addHandler(pycharm_text) return logs
# 读取Excel表方法,方便后续读取接口用例数据 def ReadExcelTypeDict(self,file_name,path = read_xlrd): path = path+'/' + file_name import xlrd work_book = xlrd.open_workbook(path) # 打开Excel表 sheets = work_book.sheet_names() # 获取全部的sheets页 DatasList = [] for sheet in sheets: sheets = work_book.sheet_by_name(sheet) nrows = sheets.nrows for i in range(0,nrows): values = sheets.row_values(i) DatasList.append(values) title_list = DatasList[0] content_list = DatasList[1:] new_list = [] for content in content_list: dic = {} for i in range(len(content)): dic[title_list[i]] = content[i] new_list.append(dic) return new_list #最终返回为字典形式 有键和值
为何要转换格式呢?
这里就涉及到了怎么设计一个自动化接口用例浏览器
用例的参数值要用json格式写入,不要有空格
预期结果的出参也要用json格式写入
不要有' '值都要用" "包起来cookie
# 封装一个HTML报告方法 def GetHtmlResult(self,suite,title,path = report_html): import HTMLTestReportCN,time path = path + '/' + time.strftime('%Y-%m-%d-%H-%M-%S') + '.html' with open(path,'wb+') as f: run = HTMLTestReportCN.HTMLTestRunner(stream=f,description='用户相关接口测试报告',tester='小白',title = title) run.run(suite)
其他还有须要补充的能够继续添加,我这里三个基本够用session
import unittest import ddt import 自动化接口测试.common.commons as common from 自动化接口测试.base.Base_Page import Base
import unittest import ddt import 自动化接口测试.common.commons as common from 自动化接口测试.base.Base_Page import Base r = common.Common().ReadExcelTypeDict('cezxhi .xlsx') # 拿到具体的Excel表数据 @ddt.ddt #导入ddt模块 class TestLogin(unittest.TestCase): @classmethod def setUpClass(cls) -> None: # setupclass类方法 所有用例开始前执行一次 cls.logs = common.Common().get_logs() # 导入日志方法 cls.logs.debug('开始写入接口自动化测试用例') @classmethod def tearDownClass(cls) -> None: cls.logs.debug('自动化接口用例结束') def setUp(self) -> None: self.logs.debug('开始本条接口用例') def tearDown(self) -> None: self.logs.debug('结束本条用例') @ddt.data(*r) # 引入ddt模块,读取拿到的数据 def test_logins(self,pars): # 用例方法名开头必须已test pars参数为接收的表数据值 import json #导入json模块 dic = json.loads(pars['body参数值']) # 将Excel数据中的参数值转变为json格式 url = pars['接口地址'] # 拿到请求url yuqi = pars['预期结果'] # 拿到预期结果 fs = pars['请求方式'] # 拿到请求方式 result = Base().requests_type(method = fs,url = url,data = dic) # 填充base页的请求api self.assertEqual(result.text,yuqi) # 进行断言 看用例是否经过
if __name__ == '__main__': load = unittest.TestLoader().loadTestsFromTestCase(TestLogin) #使用loader加载方式 来找寻全部已test开头的用例 suite = unittest.TestSuite([load,]) common.Common().GetHtmlResult(suite,'登陆测试用例')
若是对软件测试、接口测试、自动化测试、面试经验交流。感兴趣能够加软件测试交流:1085991341,还会有同行一块儿技术交流。app
最后咱们run一下框架
控制台是这样的
为何会有400呢?由于有一些接口是异常的,好比url错误的,少传入参数、空参,因此会出错,常理之中
在pycharm中是这样的
而后咱们copy下他的路径到浏览器中查看
根据我追踪的信息,第一条失败是由于sessionId是能够变的,每一次的值都是不同,在这里也但愿你们可以找到BUG,并妥善处理好每个问题。
以上内容但愿对你有帮助,有被帮助到的朋友欢迎点赞,评论。