python+requests+excel 接口自动化框架
一、项目框架如图:
1、common :这个包都是一些公共的方法,如:手机号加解密,get/post接口请求的方法封装,接口鉴权,发邮件,读写excel文件方法等等
2、result:存放每次运行的log和测试报告
3、testcase:这个包放test开头的测试用例
4、testFile:这个包放接口上传的图片(如注册需要上传头像),excel管理的接口参数
5、caselist.txt:需要运行的用例
6、config.ini :放一些配置信息,如发邮件的房间账户,接口需要使用的固定参数和版本,发送邮件的开关,以及动态的数据,如动态更改了就将最新的写在这个配置里面,其他地方需要用的就从配置文件里面取最新生成的。
7、readConfig.py :操作配置文件的一些方法,获取数据,修改数据等
8、runAll.py:运行所有用例

2、excel表里面的参数:
后面这个code和msg是预期结果,用例里面会获取实际结果,然后跟这个预期结果比较判断接口是否成功。

3、接口的写法
接口是采用参数化实现的,传入不用的参数对比不同的结果
aes = aesCryter.AesCrypter()
authen= authentication.getAuthentication()
login_xls = commons.get_xls("userCase.xlsx", "login")
localReadConfig = readConfig.ReadConfig()
configHttp = ConfigHttp.ConfigHttp()
info = {} @paramunittest.parametrized(*login_xls)
class Login(unittest.TestCase):
def setParameters(self, case_name,url, method, token, par, code, msg):
self.case_name = str(case_name)
self.url = str(url)
self.method = str(method)
self.token = str(token)
self.par = eval(str(par))
self.code = str(code)
self.msg = str(msg)
self.return_json = None
self.info = None def setUp(self):
self.log = Log.MyLog.get_log()
self.logger = self.log.get_logger()
print(self.case_name+"测试开始前准备") def testLogin(self):
get_url = authen.get_Url("userCase.xlsx", "login",0,1)
ydtoken = authen.get_ydtoken(url = get_url) #获取ydtoken
new_url =localReadConfig.get_http('url')+get_url+"&ydtoken="+ydtoken #拼接接口的请求链接
configHttp.set_url(new_url)
print("第一步:设置url "+new_url) # get visitor token
if self.token == '':
token_v = None
elif self.token == '':
businessCommon.set_visitor_token_to_config()
token_v = localReadConfig.get_headers('token_v')
header = {"cookie": "SSO=%s" % str(token_v)}
configHttp.set_headers(header)
print("第二步:设置header(token等)") # set params
data =self.par
data['mobile'] = aes.encrypt(str(data['mobile'])) #对手机号和密码继续加密
data['password'] = aes.encrypt(str(data['password']))
data["token"] = str(token_v)
configHttp.set_data(data)
print("第三步:设置发送请求的参数") # test interface
self.return_json = configHttp.post()
print(self.return_json)
print("第四步:发送请求方法") # check result
self.checkResult()
print("第五步:检查结果") def tearDown(self):
""" :return:
"""
self.log.build_case_line(self.case_name, actualcode, actualmsg)
print("测试结束,输出log完结\n\n") def checkResult(self):
"""
check test result
:return:
"""
global actualcode,actualmsg
actualcode = commons.get_value_from_return_json(self.return_json, 'code')
print('实际code:%s'%actualcode)
actualmsg = commons.get_value_from_return_json(self.return_json, 'msg')
print('实际msg:%s'%actualmsg)
self.assertEqual(actualcode, self.code)
self.assertEqual(actualmsg, self.msg) if __name__ == '__main__':
unittest.main
4、接口关联,
接口和接口之间有这依赖关系,必须上一个接口请求完成,后面这个接口才能才能,所以在common公共包里面写了一个通用的方法,如果涉及到有依赖关系的,就调用这个接口,把需要先请求的接口先完成了,再请求要测试的接口
比如:接下来这个忘记密码接口,更改密码,必须先请求发送验证码接口,再请求验证已验证接口,最后才能请求更改密码接口
import unittest
import paramunittest
import readConfig as readConfig
from common import Log as Log
from common import commons
from common import configHttp as ConfigHttp
from common import businessCommon
from common import get_Authentication as authentication authen= authentication.getAuthentication()
forgotcheck = commons.get_xls("userCase.xlsx", "forgotcheck")
localReadConfig = readConfig.ReadConfig()
configHttp = ConfigHttp.ConfigHttp()
info = {} @paramunittest.parametrized(*forgotcheck)
class ForgotCheck(unittest.TestCase):
def setParameters(self, case_name, url,method, token, par, code, msg):
self.case_name = str(case_name)
self.url = str(url)
self.method = str(method)
self.token = str(token)
self.par = eval(str(par))
self.code = str(code)
self.msg = str(msg)
self.return_json = None
self.info = None def setUp(self):
self.log = Log.MyLog.get_log()
self.logger = self.log.get_logger()
print(self.case_name+"测试开始前准备") def testforgotcheck(self):
# set url
get_url = authen.get_Url("userCase.xlsx", "forgotcheck", 0, 1)
ydtoken = authen.get_ydtoken(url=get_url) # 获取ydtoken
new_url = localReadConfig.get_http('url') + get_url + "&ydtoken=" + ydtoken # 拼接鉴权的请求链接
configHttp.set_url(new_url)
print("第一步:设置url " + new_url) # get visitor token
if self.token == '':
token_v = None
elif self.token == '':
businessCommon.set_visitor_token_to_config()
token_v = localReadConfig.get_headers('token_v')
header = {"cookie": "SSO=%s" % str(token_v)}
configHttp.set_headers(header)
print("第二步:设置header(token等)") # set params
data = self.par
data["token"] = str(token_v)
configHttp.set_data(data)
print("第三步:设置发送请求的参数") # test interface
self.return_json = configHttp.post()
print("第四步:发送请求方法") # check result
self.checkResult()
print("第五步:检查结果") def tearDown(self):
""" :return:
"""
self.log.build_case_line(self.case_name, actualcode, actualmsg)
print("测试结束,输出log完结\n\n") def checkResult(self):
"""
check test result
:return:
"""
global actualcode,actualmsg
actualcode = commons.get_value_from_return_json(self.return_json, 'code')
print('实际code:%s'%actualcode)
actualmsg = commons.get_value_from_return_json(self.return_json, 'msg')
print('实际msg:%s'%actualmsg)
self.assertEqual(actualcode, self.code)
self.assertEqual(actualmsg.strip(), self.msg)
5、控制接口是否需要运行 ,每次新增用例把用例名字写在这个 caselist.txt ,不需要运行就注释即可。
#reqSer/test_001_getRequst
#reqSer/test_002_addRequst
#reqSer/test_003_userRadar
user/test_001_Login
#user/test_002_Sign_sms
#user/test_003_Forgotsms
#user/test_004_Forgotcheck
#user/test_005_forgotpass
#user/test_006_NoParameterization
6、运行所有用例 runAll.py
import os
import unittest
from common.Log import MyLog as Log
import readConfig as readConfig
from common import HTMLTestRunner
from common.configEmail import MyEmail localReadConfig = readConfig.ReadConfig() class AllTest:
def __init__(self):
global log, logger, resultPath, on_off
log = Log.get_log()
logger = log.get_logger()
resultPath = log.get_report_path()
print(resultPath)
on_off = localReadConfig.get_email("on_off")
self.caseListFile = os.path.join(readConfig.proDir, "caselist.txt")
self.caseFile = os.path.join(readConfig.proDir, "testCase")
# self.caseFile = None
self.caseList = []
self.email = MyEmail.get_email() def set_case_list(self):
"""
set case list
:return:
"""
fb = open(self.caseListFile)
for value in fb.readlines():
data = str(value)
if data != '' and not data.startswith("#"):
self.caseList.append(data.replace("\n", ""))
fb.close() def set_case_suite(self):
"""
set case suite
:return:
"""
self.set_case_list()
test_suite = unittest.TestSuite()
suite_module = [] for case in self.caseList:
case_name = case.split("/")[-1]
print(case_name+".py")
discover = unittest.defaultTestLoader.discover(self.caseFile, pattern=case_name + '.py', top_level_dir=None)
suite_module.append(discover) if len(suite_module) > 0: for suite in suite_module:
for test_name in suite:
test_suite.addTest(test_name)
else:
return None
return test_suite def run(self):
"""
run test
:return:
"""
try:
suit = self.set_case_suite()
if suit is not None:
logger.info("********TEST START********")
fps = open(resultPath, 'wb')
runner = HTMLTestRunner.HTMLTestRunner(stream=fps, title='Test Report', description='Test Description')
runner.run(suit)
else:
logger.info("Have no case to test.")
except Exception as ex:
logger.error(str(ex))
logger.info("*********TEST END*********")
fps.close()
# send test report by email
if on_off == 'on':
self.email.send_email()
elif on_off == 'off':
logger.info("Doesn't send report email to developer.")
else:
logger.info("Unknow state.") if __name__ == '__main__':
obj = AllTest()
obj.run()
6、生成的报告:

7、发送邮件,邮件附件是report和log,所以压缩了一下。

python+requests+excel 接口自动化框架的更多相关文章
- 基于Python+requests搭建的自动化框架-实现流程化的接口串联
框架产生目的:公司走的是敏捷开发模式,编写这种框架是为了能够满足当前这种发展模式,用于前后端联调之前(后端开发完接口,前端还没有将业务处理完毕的时候)以及日后回归阶段,方便为自己腾出学(mo)习(yu ...
- python+requests实现接口自动化
1. 前言 今年2月调去支持项目接口测试,测试过程中使用过postman.jmeter工具,基本能满足使用,但是部分情况下使用较为麻烦.比如:部分字段存在唯一性校验或字段间有业务性校验,每次请求均需手 ...
- python requests简单接口自动化
get方法 url:显而易见,就是接口的地址url啦 headers:定制请求头(headers),例如:content-type = application/x-www-form-urlencode ...
- 纯python自研接口自动化脚本更新版本,让小白也能实现0到1万+的接口自动化用例
查看完整文章点击原文链接:纯python自研接口自动化脚本更新版本,让小白也能实现0到1万+的接口自动化用例 你是否还在用postman\jmeter做接口自动化吗?用python的开源框架[unit ...
- 转载:python + requests实现的接口自动化框架详细教程
转自https://my.oschina.net/u/3041656/blog/820023 摘要: python + requests实现的接口自动化框架详细教程 前段时间由于公司测试方向的转型,由 ...
- python + requests实现的接口自动化框架详细教程
前段时间由于公司测试方向的转型,由原来的web页面功能测试转变成接口测试,之前大多都是手工进行,利用postman和jmeter进行的接口测试,后来,组内有人讲原先web自动化的测试框架移驾成接口的自 ...
- python+requests接口自动化框架
为什么要做接口自动化框架 1.业务与配置的分离 2.数据与程序的分离:数据的变更不影响程序 3.有日志功能,实现无人值守 4.自动发送测试报告 5.不懂编程的测试人员也可以进行测试 正常接口测试的流程 ...
- python+request接口自动化框架
python+request接口自动化框架搭建 1.数据准备2.用python获取Excel文件中测试用例数据3.通过requests测试接口4.根据接口返回的code值和Excel对比 但本章只讲整 ...
- Python+Pytest+Allure+Git+Jenkins接口自动化框架
Python+Pytest+Allure+Git+Jenkins接口自动化框架 一.接口基础 接口测试是对系统和组件之间的接口进行测试,主要是效验数据的交换,传递和控制管理过程,以及相互逻辑依赖关系. ...
随机推荐
- canvas学习之柱状图
项目地址:http://pan.baidu.com/s/1nvhWrwP 因为最近项目中使用到了图表,而且个人一直希望研究canvas,所以最近几天花时间对canvas好好研究了一下,并写了一个dem ...
- android ------- TCP/IP
TCP/IP 是针对因特网的通信协议. 什么是 TCP/IP? TCP/IP 是供已连接因特网的计算机进行通信的通信协议. TCP/IP 指传输控制协议/网际协议 (Transmission Cont ...
- Confluence 6 配置边栏
如果你具有空间的管理员权限,你可以对空间的变量进行自定义,让你的空间具有自己的空间标识(logo),修改显示的继承关系和在空间中添加快捷方式以帮助用户在空间中进行快速导航. 希望开始配置空间边栏,选择 ...
- php求取时间范围并传入数据库,页面上显示几天几月几年
$startTime = $_GPC['h_time']['start']; $endTime = $_GPC['h_time']['end']; echo $startTime.'<hr> ...
- Sums of Digits CodeForces - 509C (贪心,模拟)
大意: 一个未知严格递增数组$a$, 给定每个数的数位和, 求$a[n]$最小的数组$a$ #include <iostream> #include <algorithm> # ...
- 【JS】【4】字符串数字比较大小
两个转换函数: parseInt():把值转换成整数 parseFloat():把值转换成浮点数 也有其他方法,详情请看参考博客,但个人认为转换函数是最好的方法 参考文档: 1,js.jquery字符 ...
- oracle数据库备份任务
备份脚本如下: 1.0 expdp1.1导出某些schema #!/bin/bash ORACLE_BASE=/oracle/productexport ORACLE_BASEORACLE_HOME= ...
- CO15批次确定,标准的太蛋疼了
1.批次确定的配置,之前有转过,自己也动手配过,可以是可以,但是蛋疼,用户不愿意去弹出的界面选批次...2.因为这边的批次全部是按年月日+流水生成的,所以在批次确定这里就需要按照批次的号来排序选择了 ...
- Oracle 11.2.0.4下载地址
Linux x86: https://updates.oracle.com/Orion/Services/download/p13390677_112040_LINUX_1of7.zip?aru=16 ...
- Python面向对象编程-类的封装,继承、多态
面向对象是一种程序设计思想,对象作为程序基本单元,包含了数据和操作数据的函数. 面向对象的三大特点--数据封装.多态和继承. #类的创建,class关键字,类名大写,object表示从哪个类继承而来, ...