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接口自动化框架 一.接口基础 接口测试是对系统和组件之间的接口进行测试,主要是效验数据的交换,传递和控制管理过程,以及相互逻辑依赖关系. ...
随机推荐
- linux中用户和用户组
一.用户和组原理 一个用户可以属于多个组,一个组有多个用户 在Linux中操作系统必须依赖组和用户进行管理 二.与用户和组相关的配置文件 1.组相关配置文件 1)/etc/group :管理用户组信息 ...
- Pudding Monsters CodeForces - 526F (分治, 双指针)
大意: n*n棋盘, n个点有怪兽, 求有多少边长为k的正方形内恰好有k只怪兽, 输出k=1,...,n时的答案和. 等价于给定n排列, 对于任意一个长为$k$的区间, 若最大值最小值的差恰好为k, ...
- 118. Pascal's Triangle (java)
问题描述: Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5 ...
- spring boot(二)web综合开发
上篇文章介绍了Spring boot初级教程:spring boot(一):入门,方便大家快速入门.了解实践Spring boot特性:本篇文章接着上篇内容继续为大家介绍spring boot的其它特 ...
- python 小练习 7
有一楼梯共n级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第n级,共有多少种走法? 这其实是fibonacci数列,记走法为f(n),在n-1和n-2时你都可以直接跨上去.因此 f(n) = ...
- UI基础一:简单的BOL查询
利用标准的BOL编辑工具,添加BOL对象,重写查询方法,实现简答的BOL查询 1.SE11创建查询对象结构: 2.SE11创建查询结果对象: 3.SE24新建处理类: 重写查询结果方法: METHOD ...
- WDA基础二:界面,元素介绍
1.ELEMENTS: BUTTON 按钮 CAPTION 标题 DROPDOWN_BY_IDX 带序号的下拉 DROPDOWN_BY_KEY 带键值的下拉 FILE_UPLOAD ...
- python中几种循环体
条件判断与循环 1.条件判断 if <条件判断1>: <执行1> elif <条件判断2>: <执行2> elif <条件判断3>: < ...
- suffix array后缀数组
倍增算法 基本定义子串:字符串 S 的子串 r[i..j],i≤j,表示 r 串中从 i 到 j 这一段也就是顺次排列 r[i],r[i+1],...,r[j]形成的字符串. 后缀:后缀是指从某个位置 ...
- 连续三月涨势明显,PostgreSQL 将崛起?
33 分享 10 DB-Engines 是全球最流行的数据库排行榜之一,在近几个月的排行榜中,PostgreSQL 都保持着非常好的势头,从最稳(10月)到一路高涨(11月),再到稳步上升(12月 ...