一、项目框架如图:

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 接口自动化框架的更多相关文章

  1. 基于Python+requests搭建的自动化框架-实现流程化的接口串联

    框架产生目的:公司走的是敏捷开发模式,编写这种框架是为了能够满足当前这种发展模式,用于前后端联调之前(后端开发完接口,前端还没有将业务处理完毕的时候)以及日后回归阶段,方便为自己腾出学(mo)习(yu ...

  2. python+requests实现接口自动化

    1. 前言 今年2月调去支持项目接口测试,测试过程中使用过postman.jmeter工具,基本能满足使用,但是部分情况下使用较为麻烦.比如:部分字段存在唯一性校验或字段间有业务性校验,每次请求均需手 ...

  3. python requests简单接口自动化

    get方法 url:显而易见,就是接口的地址url啦 headers:定制请求头(headers),例如:content-type = application/x-www-form-urlencode ...

  4. 纯python自研接口自动化脚本更新版本,让小白也能实现0到1万+的接口自动化用例

    查看完整文章点击原文链接:纯python自研接口自动化脚本更新版本,让小白也能实现0到1万+的接口自动化用例 你是否还在用postman\jmeter做接口自动化吗?用python的开源框架[unit ...

  5. 转载:python + requests实现的接口自动化框架详细教程

    转自https://my.oschina.net/u/3041656/blog/820023 摘要: python + requests实现的接口自动化框架详细教程 前段时间由于公司测试方向的转型,由 ...

  6. python + requests实现的接口自动化框架详细教程

    前段时间由于公司测试方向的转型,由原来的web页面功能测试转变成接口测试,之前大多都是手工进行,利用postman和jmeter进行的接口测试,后来,组内有人讲原先web自动化的测试框架移驾成接口的自 ...

  7. python+requests接口自动化框架

    为什么要做接口自动化框架 1.业务与配置的分离 2.数据与程序的分离:数据的变更不影响程序 3.有日志功能,实现无人值守 4.自动发送测试报告 5.不懂编程的测试人员也可以进行测试 正常接口测试的流程 ...

  8. python+request接口自动化框架

    python+request接口自动化框架搭建 1.数据准备2.用python获取Excel文件中测试用例数据3.通过requests测试接口4.根据接口返回的code值和Excel对比 但本章只讲整 ...

  9. Python+Pytest+Allure+Git+Jenkins接口自动化框架

    Python+Pytest+Allure+Git+Jenkins接口自动化框架 一.接口基础 接口测试是对系统和组件之间的接口进行测试,主要是效验数据的交换,传递和控制管理过程,以及相互逻辑依赖关系. ...

随机推荐

  1. C#方式操作Cookie

    1.设置cookie public static void SetCookie(string TokenValue) { HttpCookie tokencookie = new HttpCookie ...

  2. Python遍历文件个文件夹

    在读文件的时候往往需要遍历文件夹,python的os.path包含了很多文件.文件夹操作的方法.下面列出: os.path.abspath(path) #返回绝对路径 os.path.basename ...

  3. spring boot(一)入门

    什么是spring boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员 ...

  4. mysql半同步开启

    开启半同步复制 #在有的高可用架构下,master和slave需同时启动,以便在切换后能继续使用半同步复制 /etc/my.cnf plugin-load = "rpl_semi_sync_ ...

  5. 根据userAgent判断打开网页的所在终端,以及浏览器

    function _IsIOS() { var ua = navigator.userAgent.toLowerCase(); if(ua.match(/iPhone\sOS/i) == " ...

  6. 安卓——Activity生命周期、

    在xml 设计页面添加标签 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmln ...

  7. Async:简洁优雅的异步之道

    前言 在异步处理方案中,目前最为简洁优雅的便是 async函数(以下简称A函数).经过必要的分块包装后,A函数能使多个相关的异步操作如同同步操作一样聚合起来,使其相互间的关系更为清晰.过程更为简洁.调 ...

  8. Mysql设置自增字段的方法

    #int : 字段类型 alter table 表名 modify 字段名 int auto_increment primary key

  9. 函数----基础,参数传递,返回类型和return语句

    一.函数基础1.形参和实参 实参是形参的初始值.第一个实参初始化第一个形参,第二个实参初始化第二个形参,以此类推.尽管实参与形参存在对应关系,但是并没有规定实参的求值顺序.编译器能以任意可行的顺序对实 ...

  10. linux下详解shell中>/dev/null 2>&1

    前言 相信大家经常能在shell脚本中发现>/dev/null 2>&1这样的语句.以前的我并没有去深入地理解这段命令的作用,照搬照用,直到上周我将这段命令不小心写成了2>& ...