python执行接口测试case_由浅入深----python+requests+unittest执行自动化接口测试

本文介绍如何使用Python的requests库和unittest框架执行自动化接口测试。首先讲解安装requests、xlrd、json和unittest库,接着阐述Page Object Model设计理念,创建Base类封装请求方法。然后在Common类中封装日志、读取Excel表和生成HTML报告的方法。最后通过ddt数据驱动创建测试用例,执行测试并生成测试报告。
摘要由CSDN通过智能技术生成

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

<1>pip 命令安装:

pip install requests

pip install xlrd

pip install json

pip install unittest

<2> pycharm里安装

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

812bd8c38694ad5d29b5db6fcd7c5b8f.png

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

13bcb77042ca8eaa0d3e1b160a6c16cc.png

<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> 将几种请求做简单调试,调试通了,那么我们就可以进行下一项

d65e6a6464740d1418058cdd379de681.png

也可以对需要拿到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类下创建commons.py文件,并创建common类

0ec35587ba116c20b9026ec0cdb01081.png

<1> 封装日志方法

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

import os

base_path = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))

log_path = base_path + '\\' + 'report' + '\\' + 'logs'

report_html = base_path + '\\' + 'html'

read_xlrd = base_path + '\\' + '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 #最终返回为字典形式 有键和值

为什么要转换格式呢?

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

a4d93799cd5442ad1c9c18ce13bdbe87.png

用例的参数值要用json格式写入,不要有空格

预期结果的出参也要用json格式写入

不要有’’ 值都要用""包起来

x

<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、在case包下创test用例,并调用我们在base页封装好的请求api以及common中的读取Excel数据表联合使用

<1>创建test_login.py

8eaaef3ef7050c4563236a9926b7b877.png

<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里

20cef0a6758ec3e33a67d1a655c016ad.png

76eff9ddc19fefb92d87f36f8c0617bd.png

a29e41103a1b0f1a99e16a3288304f43.png

56cf879ffdb5f466fc27bf782d018347.png

最后我们run一下

9be16baa1479a2f8b0261e39e4f4e874.png

控制台是这样的

70f8b483e5cc99c659b61435f9aa08be.png

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

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

在pycharm中是这样的

1a950005d33731fb8c6db7a12968ccf6.png

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

592602624dda30ec9b3dcb79b594d11d.png

07a773e265f7a81c5c7c7c872ff6266a.png

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

祝大家生活愉快

有问题博客下方留言

小友定会尽全力回答

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值