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/1skZGPgL 最近学习使用canvas做动画效果,主要原理就是创建一个小球对象,然后小球对象有一个moveball方法,每次让小球沿着随机路 ...
- 机器学习ML策略
1.为什么是ML策略 例如:识别cat分类器的识别率是90%,怎么进一步提高识别率呢? 想法: (1)收集更多数据 (2)收集更多的多样性训练样本 (3)使用梯度下降训练更长时间 (4)尝试Adam代 ...
- SPL之Iterator(迭代器)接口
前言:SPL是用于解决典型问题(standard problems)的一组接口与类的集合. <?php /** * Class MyIterator * 在 PHP 中,通常情况下遍历数组使用 ...
- Linux中计划任务、周期性任务设置
Linux中计划任务.周期性任务设置 计划任务:指在未来的特定时间里,执行一次某一特定任务.当然,如果同一任务需要在不同时间点执行执行两次.三次或多次,可以视为多个一次看待. 周期性任务:指某一任务需 ...
- const constptr 和引用的盲点(未解决)
#include<iostream> //const 和 引用的值必须初始化 //等号左侧是const或者const和引用,右侧可以是数字,普通变量-等号左侧是const和指针,右侧必须是 ...
- MySQL 分支和循环结构
1.if else分支 mysql:用elseif Oracle:用elsif 可以用select直接查看获取的值或者一个变量. create procedure pd_t ...
- Beta阶段——第5篇 Scrum 冲刺博客
Beta阶段--第5篇 Scrum 冲刺博客 标签:软件工程 一.站立式会议照片 二.每个人的工作 (有work item 的ID) 昨日已完成的工作 人员 工作 林羽晴 完成了邮箱发送功能的测试,测 ...
- 二十三、Spring框架的相关知识点总结
1.Spring的优点: 1.1.Spring在大小和透明性方面是轻量级的,Spring框架大约只有2MB大小. 1.2.控制反转(IOC):使用控制反转技术实现了低耦合,依赖注入(DI)到对象,而不 ...
- 牛客网第一场E题 Removal
链接:https://www.nowcoder.com/acm/contest/139/E 来源:牛客网 Bobo has a sequence of integers s1, s2, ..., sn ...
- asm ftp utilty and usage
Oracle 11g ASM supports ASM FTP, by which operations on ASM files and directories can be performed s ...