问题描述:
搭建接口测试框架,执行用例请求多个不同请求方式的接口

实现步骤:

① 创建配置文件config.ini,写入部分公用参数,如接口的基本url、测试报告文件路径、测试数据文件路径等配置项

 [DATABASE]
data_address = ./data/data.xlsx
report_address = ./report/
driver = ./drivers/chromedriver.exe [HTTP]
base_url = https://***.***.cn//

② 从配置文件中读取并返回文件中内容,或写入配置文件的方法,文件命名 readConfig.py

 import os
import configparser # 获取当前py文件地址
proDir = os.path.split(os.path.realpath(__file__))[0]
# 组合config文件地址
configPath = os.path.join(proDir,"config.ini") class ReadConfig:
def __init__(self):
# 获取当前路径下的配置文件
self.cf = configparser.ConfigParser()
self.cf.read(configPath) def get_config(self,field,key):
# 获取配置文件中的key值
result = self.cf.get(field,key)
return result def set_config(self,field,key,value):
# 向配置文件中写入配置信息
fb = open(configPath,'w')
self.cf.set(field,key,value)
self.cf.write(fb)

③ 从配置文件中获取到接口的基本url后,根据不同的接口请求方式读取请求体或其他参数信息,参数信息从excel中读取,因此文件readExcel.py用于读取并返回excel文件中内容,或写入Excel的方法

 import xlrd
import xlutils.copy
from Base.readConfig import ReadConfig
import time class ReadExcel: def __init__(self,section,field,sheet):
# 打开工作表,并定位到sheet
data_address = ReadConfig().get_config(section,field)
workbook = xlrd.open_workbook(data_address)
self.table = workbook.sheets()[sheet] def get_rows(self):
# 获取excel行数
rows = self.table.nrows
return rows def get_cell(self,row,col):
# 获取单元格数据
cell_data = self.table.cell(row,col).value
return cell_data def get_col(self,col):
# 获取整列数据
col_data = self.table.col_value(col)
return col_data class WriteExcel:
def __init__(self,section,field,sheet):
# 打开工作表
self.address = ReadConfig().get_config(section,field)
self.workbook = xlrd.open_workbook(self.address)
self.wf = xlutils.copy.copy(self.workbook)
self.ws = self.wf.get_sheet(sheet) def set_cell(self,row,col,value):
#设置单元格数据
self.ws.write(row,col,value) def save_excel(self,filename,format):
#获取当前时间
self.time = time.strftime("%Y%m%d%H%M%S", time.localtime())
#生成文件的文件名及格式
self.report = filename + '_' +self.time + format
#保存文件
self.wf.save(self.report)

④ 将获取接口的url、请求头、参数等方法封装成类并写入base.py中,用于测试框架中测试集的直接调取

 from Base.readConfig import ReadConfig
from Base.readExcel import ReadExcel # 实例化
readexcel = ReadExcel('DATABASE','data_address',0) class BasePage(object):
def __init__(self, selenium_driver):
self.driver = selenium_driver def get_api(self, row, col):
# 获取url
self.base_url = ReadConfig().get_config('HTTP', 'base_url') # 获取excel中的接口地址,与url进行拼接
self.url = self.base_url + readexcel.get_cell(row, col)
print(self.url)
return self.url def get_cell(self, row, col):
# 获取excel单元格数据,获取接口请求的参数
self.cell = readexcel.get_cell(row, col)
return self.cell

⑤ 从base.py文件获取到请求地址后,需要组合不同类型的请求方式,如get请求直接将参数与地址进行拼接,或post请求以json数据格式等为请求体请求接口,然后再获取接口对象,得到接口返回的数据,此过程涉及的方法封装到request_way.py(注:该实例get请求返回数据格式为jsonp,因此需要jsonp格式数据转换为json格式的方法)

 from Base.readExcel import ReadExcel
from base import BasePage
import requests
import urllib.parse
import json
import re # 实例化
readexcel = ReadExcel('DATABASE','data_address',0) # jsonp格式数据转换为json格式
def jsonp_to_json(_jsonp):
# 解析jsonp数据格式为json
try:
return json.loads(re.match(".*?({.*}).*", _jsonp, re.S).group(1))
except:
raise ValueError('Invalid Input') class RequestPage(BasePage):
# post方式请求,json格式为请求体
def post_requests(self, url, i):
# 定义请求数据,获取excel中参数信息赋值给data,以json格式拼接好数据
data_1_json = json.dumps(BasePage(self.driver).get_cell(i, 4))
data_2_json = json.dumps(BasePage(self.driver).get_cell(i + 1, 4))
data = "{" + data_1_json + ":" + data_2_json + "}"
print(data)
# 打开请求,获取对象
response = requests.post(url, data)
# 打印状态码
print(response)
return response # get方式请求
def get_request(self, url, j):
# 定义请求数据,获取excel中参数信息赋值给values
#values = {}
values = BasePage(self.driver).get_cell(j, 4)
# 如果参数不止一个则对请求数据进行编码拼接'&'
#data = urllib.parse.urlencode(values)
# 将数据与url进行拼接
req = url + '?' + values
print(req)
# 打开请求,获取对象
response = urllib.request.urlopen(req)
# 打印Http状态码
print(response.status)
# 读取服务器返回的数据,对HTTPResponse类型数据进行读取操作,bytes格式数据编译成中文编码
the_page = response.read().decode("unicode_escape")
# 将返回的bytes格式数据先转换成str,再将返回的jsonp格式数据转换成json格式
the_page = jsonp_to_json(str(the_page))
return the_page

⑥ 得到接口实际返回结果后,需要与预期结果做比对,判断用例执行结果,所以封装校验类到check.py文件。校验方式其一是校验json数组内每个数值是否一致,其二是直接简单校验数组中的status值和message是否返回正确

 from base import BasePage
from Base.readExcel import WriteExcel # 实例化
writeexcel = WriteExcel('DATABASE','data_address',0) class CheckPage(BasePage):
# 校验json数组内每个值是否一致
def check_value(self, i, actualresult, expectresult):
# 遍历字典的值value,并将value赋值给实际接口数据的值
for value in actualresult.values():
actualresult_value = value
# 遍历字典的值value,并将value赋值给excel中预期数据的值
for value in expectresult.values():
expectresult_value = value
# 如果实际接口返回的每个键值与excel中预期返回的数据的每个键值一样,则接口测试用例执行通过,如果不是则打印预期结果和实际结果,可比较差异
if actualresult_value == expectresult_value:
writeexcel.set_cell(i, 8, 'SUCCESS')
print("接口用例执行结果通过")
else:
writeexcel.set_cell(i, 8, 'FAILURE')
writeexcel.set_cell(i, 7, str(actualresult))
print('第', i + 1, '行用例执行失败:预期结果是', expectresult, '实际结果是', actualresult) # 保存测试报告
writeexcel.save_excel('testreport', '.xls') # 校验json数组中的status值和message是否返回成功
def easy_check_value(self, i, actualresult,expectresult):
# 判断实际接口值是否状态码和消息返回成功
if actualresult['status'] == 1 and actualresult['message'] == '完成':
writeexcel.set_cell(i, 8, 'SUCCESS')
print('第', i+1, '行用例执行结果正确,用例通过')
else:
writeexcel.set_cell(i, 8, 'FAILURE')
writeexcel.set_cell(i, 7, str(actualresult))
print('第', i + 1, '行用例执行失败:预期结果是', expectresult, '实际结果是', actualresult) # 保存测试报告
writeexcel.save_excel('testreport', '.xls')

⑦ 最后编写测试集 testcase.py,其中用例包含有执行post和get方式的请求,增加用例可直接在该文件继续添加编写

 import unittest
from selenium import webdriver
from Base.readConfig import ReadConfig
from base import BasePage
from requests_way import RequestPage
from check import CheckPage
from packages.HTMLTestRunner import HTMLTestRunner driver = webdriver.Chrome(ReadConfig().get_config('DATABASE', 'driver')) class SmokeTest(unittest.TestCase):
#初始化
def setUp(self):
self.driver = driver def test_case_10(self):
"""以json格式数据为请求体的post方式接口请求"""
# 获取url
self.url = BasePage(self.driver).get_api(1,1) # 将接口实际返回数据转换为json可序列化,使用json.dumps()时需要对象相应的类型是json可序列化的
i = 3
actualresult = RequestPage(self.driver).post_requests(self.url, i).json() # 获取excel中的预期结果
expectresult = eval(BasePage(self.driver).get_cell(i, 6)) # 校验实际接口返回结果和用例预期结果是否一致(校验json数组内每个值是否一致)
CheckPage(self.driver).check_value(i, actualresult, expectresult) def test_case_11(self):
"""get方式接口请求"""
# 获取url
self.url = BasePage(self.driver).get_api(8, 1) # 获取接口实际返回值与excel中的预期结果
j = 8
actualresult = RequestPage(self.driver).get_request(self.url, j)
expectresult = eval(BasePage(self.driver).get_cell(j, 6)) # 校验实际接口返回结果和用例预期结果是否一致(校验json数组中的status值和message是否返回成功)
CheckPage(self.driver).easy_check_value(j, actualresult, expectresult) # 释放资源
def test_case_12(self):
self.driver.quit() if __name__ == '__main__':
#构造测试集合
suite = unittest.TestSuite()
suite.addTest(SmokeTest('test_case_10'))
suite.addTest(SmokeTest('test_case_11'))
suite.addTest(SmokeTest('test_case_12')) #创建html文件
filename = ReadConfig().get_config('DATABASE', 'report_address') + 'testreport.html'
fp = open(filename, 'wb') #执行测试并生成html测试报告
runner = HTMLTestRunner(stream=fp, description='接口用例执行情况:', title='接口自动化测试报告')
runner.run(suite) #关闭文件
fp.close()

⑧ 其中涉及HTMLTestRunner.py原生HTML测试报告库,是用于生成测试报告testreport.html,模块下载后直接集成到该项目

模块下载地址:http://tungwaiyip.info/software/HTMLTestRunner.html

⑨ 以python文件模式执行脚本才能生成测试报告

参考:https://www.cnblogs.com/kristin/p/10332815.html

以上,整体框架如下图

执行方式正确得到以下两种类型测试报告,excel表和html测试报告

python+unittest+requests+HTMLRunner编写接口自动化测试集的更多相关文章

  1. 接口自动化-python unittest+requests+HTMLrunner

    从2015年毕业入行软件测试,快满4年了,之前技术分享都在百度贴吧上面,现在正式开始在博客中记录工作技术,努力成长,加油 接口测试的步骤1.组装好该接口需要的参数数据2.使用get或post附带参数数 ...

  2. Python+Unittest+Requests+PyMysql+HTMLReport 接口自动化框架

    整体框架使用的是:Python+Unittest+Requests+PyMysql+HTMLReport  多线程并发模式 主要依赖模块 Unittest.Requests.PyMysql.HTMLR ...

  3. appium+python+unittest+HTMLRunner编写UI自动化测试集

    简介 获取AppPackage和AppActivity 定位UI控件的工具 脚本结构 PageObject分层管理 HTMLTestRunner生成测试报告 启动appium server服务 以py ...

  4. python+unittest+ddt数据驱动进行接口自动化测试

    所谓数据驱动测试,简单的理解为数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变.通过使用数据驱动测试的方法,可以在需要验证多组数据测试场景中,使用外部数据源实现对输入输出与期望值的参数化,避 ...

  5. 使用python requests库写接口自动化测试--记录学习过程中遇到的坑(1)

    一直听说python requests库对于接口自动化测试特别合适,但由于自身代码基础薄弱,一直没有实践: 这次赶上公司项目需要,同事小伙伴们一起学习写接口自动化脚本,听起来特别给力,赶紧实践一把: ...

  6. Python+Unittest+Requests+PyMysql+HTMLReport 多线程并发接口化框架

    整体框架使用的是:Python+Unittest+Requests+PyMysql+HTMLReport 多线程并发模式 主要依赖模块 Unittest.Requests.PyMysql.HTMLRe ...

  7. 基于python+Testlink+Jenkins实现的接口自动化测试框架V3.0

    基于python+Testlink+Jenkins实现的接口自动化测试框架V3.0 目录 1. 开发环境2. 主要功能逻辑介绍3. 框架功能简介 4. 数据库的创建 5. 框架模块详细介绍6. Tes ...

  8. 接口自动化 [授客]基于python+Testlink+Jenkins实现的接口自动化测试框架V3.0

    基于python+Testlink+Jenkins实现的接口自动化测试框架V3.0   by:授客 QQ:1033553122     博客:http://blog.sina.com.cn/ishou ...

  9. 接口自动化 基于python+Testlink+Jenkins实现的接口自动化测试框架[V2.0改进版]

    基于python+Testlink+Jenkins实现的接口自动化测试框架[V2.0改进版]   by:授客 QQ:1033553122 由于篇幅问题,,暂且采用网盘分享的形式: 下载地址: [授客] ...

随机推荐

  1. asp.net mvc 简单实现一个账号只能在一个地方登录

    原理:  假设用户在机器A登陆后,  这时用户再次在机器B登陆,会以当前会话的SessionID作为键,用户id作为值,插入dictionary集合中,集合再保存在application(保存在服务器 ...

  2. git:当本地分支中的代码和develop分支上有很多冲突,希望删掉本地分支,重新建立新的分支,怎么解决?

    git:当本地分支中的代码和develop分支上有很多冲突,希望删掉本地分支,重新建立新的分支,但是git中说你需要先解决当前的冲突,这种情况怎么解决 这种情况可以在代码编辑器中点击commit,然后 ...

  3. nginx配置虚拟主机vhost的方法详解

    Nginx vhost配置,可实现基于ip.端口号.servername的虚拟主机,同时可避免直接修改主配置文件.在nginx下配置虚拟主机vhost非常方便.这篇文章主要介绍了nginx配置虚拟主机 ...

  4. Linux下安装whl文件

    直接使用pip安装: [root@mycentos ~]# pip install *.whl

  5. 家庭记账本之微信小程序(四)

    json的学习 JSON:JavaScript 对象表示法(JavaScript Object Notation). JSON 是存储和交换文本信息的语法.类似 XML. JSON 比 XML 更小. ...

  6. C#设计模式(8)——桥接模式(Bridge Pattern)(转)

    一.引言 这里以电视遥控器的一个例子来引出桥接模式解决的问题,首先,我们每个牌子的电视机都有一个遥控器,此时我们能想到的一个设计是——把遥控器做为一个抽象类,抽象类中提供遥控器的所有实现,其他具体电视 ...

  7. 第四章 DOM节点操作

    1.什么是DOM:DOM(document object model)文档对象模型,把每一个元素看做是一个节点,然后对节点进行增删改查的操作 2.DOM的分类:(1)Core Dom:可以对html, ...

  8. [ Build Tools ] Repositories

    仓库介绍 http://hao.jobbole.com/central-repository/ https://my.oschina.net/pingjiangyetan/blog/423380 ht ...

  9. eclipse启动时自动多一个javaw.exe的进程解决办法

    问题描述:(My)Eclipse软件打开时,通过任务管理器发现有一个javaw.exe的进程自动启动. 并且关闭此进程时,(My)Eclipse会随之报错终止运行. 原因:启动(My)Eclipse的 ...

  10. Java课程总结

    预备作业一 简要内容:我期望的师生关系 预备作业二 简要内容:学习基础和C语言基础调查 预备作业三 简要内容:Linux安装及学习 第一周作业 简要内容:Java入门 第二周作业 简要内容:学习基本数 ...