网络编程
位置:首页>> 网络编程>> Python编程>> Python+requests+unittest执行接口自动化测试详情

Python+requests+unittest执行接口自动化测试详情

作者:程序员威子  发布时间:2023-07-30 15:08:37 

标签:Python,requests,unittest

1、安装requests、xlrd、json、unittest库

<1>pip 命令安装:

pip install requests
pip install xlrd
pip install json
pip install unittest

2、创建六类Python Package

利用Page Object Model 设计理念创建六类Python Package(也可根据项目要求具体实施)

Python+requests+unittest执行接口自动化测试详情

3、创建一个Base_Page.py

先在base包里创建一个Base_Page.py

Python+requests+unittest执行接口自动化测试详情

<1>导入模块,并创建Base类,封装各类请求方法

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,依次类推

<2>适配于接口用例执行,读取Excel表时,将各类请求做判断,当符合哪一种时,就去执行哪一种

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)

<3> 将几种请求做简单调试,调试通了,那么我们就可以进行下一项

Python+requests+unittest执行接口自动化测试详情

也可以对需要拿到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页验证的这些代码做清除,否则的话永远都是调的这些接口

4、创建common类

再common类下创建commons.py文件,并创建common类

Python+requests+unittest执行接口自动化测试详情

<1> 封装日志方法

这里我添加了一个data包,用于存放xlrd表,以及html报告存放路径、log日志存放路径

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

<2> 封装读取Excel表方法,把他转换成字典形式,方便json格式读取

# 读取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   #最终返回为字典形式 有键和值

为什么要转换格式呢?

这里就涉及到了怎么设计一个自动化接口用例

Python+requests+unittest执行接口自动化测试详情

用例的参数值要用json格式写入,不要有空格
预期结果的出参也要用json格式写入
不要有' '值都要用" "包起来

<3>封装一个生成HTML报告方法

# 封装一个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)

其余还有需要补充的可以继续添加,我这里三个基本够用

5、读取Excel数据表联合使用

在case包下创test用例,并调用我们在base页封装好的请求api以及common中的读取Excel数据表联合使用

<1>创建test_login.py

Python+requests+unittest执行接口自动化测试详情

<2> 导入unittest、common类下的commons类、ddt数据驱动、Base下的base_page页

import unittest
import ddt
import 自动化接口测试.common.commons as common
from 自动化接口测试.base.Base_Page import Base

<3> 搭建unittest框架内部,并填充方法

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)  # 进行断言 看用例是否通过

<4> 执行用例后生成测试报告:

if __name__ == '__main__':
   load = unittest.TestLoader().loadTestsFromTestCase(TestLogin)  #使用loader加载方式 来找寻所有已test开头的用例
   suite = unittest.TestSuite([load,])
   common.Common().GetHtmlResult(suite,'登录测试用例')

<5> copy当前要执行的脚本路径,添加到运行方式为python里

Python+requests+unittest执行接口自动化测试详情

Python+requests+unittest执行接口自动化测试详情

Python+requests+unittest执行接口自动化测试详情

Python+requests+unittest执行接口自动化测试详情

最后我们run一下

Python+requests+unittest执行接口自动化测试详情

控制台是这样的

Python+requests+unittest执行接口自动化测试详情

为什么会有400呢?因为有一些接口是异常的,比如url错误的,少传入参数、空参,所以会出错,常理之中

<6> 看下生成的测试报告

在pycharm中是这样的

Python+requests+unittest执行接口自动化测试详情

然后我们copy下他的路径到浏览器中查看

Python+requests+unittest执行接口自动化测试详情

Python+requests+unittest执行接口自动化测试详情

根据我追踪的信息,第一条失败是因为sessionId是可以变的,每一次的值都是不一样,在这里也希望大家能够找到BUG,并妥善处理好每一个问题。

来源:https://blog.csdn.net/okcross0/article/details/126752070

0
投稿

猜你喜欢

  • 1. 用Dreamweaver 4.0制作闪动的Flash按钮选择菜单Insert→Interactive Images→Flash But
  • 程序代码: '关键字的搜索 str="select * from tableNam
  • 这段时间写了很多页面代码,除了一些知识重复以外,也学到css的一些新东西,或许是旧东西,但是还是希望能对大家有用。其实在css里面有很多对a
  • 如下所示:function makeAcquire($nUsers,$nAwards)    { &
  • 在用ThinkPHP做tags标签的时候,出现了一个问题,就是能获取到参数,但是查不出相应的结果。查看数据库发现数据是存在的。问题出在哪了呢
  • 本文实例讲述了python实现从字典中删除元素的方法。分享给大家供大家参考。具体分析如下:python的字典可以通过del方法进行元素删除,
  • CONVERT将某种数据类型的表达式显式转换为另一种数据类型。由于某些需求经常用到取日期格式的不同.现以下可在SQL Server中将日期格
  • 本文实例讲述了PHP队列用法。分享给大家供大家参考。具体分析如下:什么是队列,是先进先出的线性表,在具体应用中通常用链表或者数组来实现,队列
  • 当来自应用程序的第一个连接控制锁而第二个连接需要相冲突的锁类型时,将发生阻塞。其结果是强制第二个连接等待,而在第一个连接上阻塞。不管是来自同
  • 这篇博客其实就是这个集合整理后一部分的公开亮相。如果你已经是个python大牛,那么基本上你应该知道这里面的大多数用法了,但我想你应该也能发
  • 年前接到QCon的邀请,颇感意外。在我的印象里,QCon大会是后端开发工程师和架构师的技术大会。后来去QCon大会的官网搜索了下,发现原来Q
  • 工作闲余,除抱有浓厚兴趣领域,我很不喜欢看些晦涩难懂的文字,于是想像茶余饭后的闲聊,随谈点话题。一次和一朋友吃饭聊天,随便聊到了他最近做的一
  • 因为要用到过滤一组中重复的数据,使之变成没有重复的一组数据的功能,百度了一下,居然有朋友乱写,而且比较多,都没有认真测试过,只对字符可以,但
  • mysql安装目录使用MySQL AB's Linux RPM分发进行安装后,将在以下系统目录产生文件目录目录内容/usr/bin客
  • 我们平常用 IE 打开一个普通的本地 xml 文件,其形式通常都是如下图: 默认样式看得多了就不觉得有什么特别。但对于少接触 xml 的人来
  • hao123的成功引领了一批的网址站,然而辉煌却是很难复制的,复制了模式却复制不了成功,市场一旦被垄断就很难再超越。网址站的成功也在一定程度
  • phpMyAdmin 是一套可以通过WEB来管理 MySQL-server 以及单一数据库的 PHP
  • phpMyAdmin错误 缺少 mysqli 扩展。请检查 PHP 配置 的解决方案phpMyAdmin 缺少 mysqli 扩展。请检查
  • ASP错误大全 Microsoft VBScript语法错误(0x800A03E9)-->内存不足 Microsoft VBScript语法
  • 今天有业务需要制作用户头像的需求,在网上找了个可以裁剪大图制作自己希望大小的图片的方法(基于Struts2)。特此记录一下。不废话,具体的步
手机版 网络编程 asp之家 www.aspxhome.com