目录
1, 开发环境
2, 用到的模块
3, 框架设计
3.1, 流程
3.2, 项目结构
5, 日志打印
6, 接口请求类封装
接口开发请参考: 使用 Django 开发简单接口: 文章增删改查
1, 开发环境
操作系统: Ubuntu18
开发工具: IDEA+PyCharm 插件
Python 版本: 3.6
2, 用到的模块
requests: 用于发送请求
xlrd: 操作 Excel, 组织测试用例
smtplib,email: 发送测试报告
logging: 日志追踪
JSON: 数据格式化
Django: 接口开发
configparser: 读取配置文件
3, 框架设计
3.1, 流程
接口用例是通过 Excel 来组织的, 定义了 URL,Request Body 等列. 执行流程如下:
使用 xlrd 工具读取 Excel 中的信息, 拼接成一个个完整的请求.
接口请求类拿到一个个完整的请求的去执行, 这个过程需要记录日志, 每一次执行情况都要有迹可循.
回填测试结果, 发送邮件, 归档每次的运行结果. 更好一点的做法是把历史运行情况做个报表, 更直观.
优点:
用例通过 Excel 来组织, 不需要编写代码, 上手难度小.
在用例个数不是很多的情况, 开发速度快.
缺点:
用例依赖是痛点.
只能支持接口自动化用例.
Excel 中用例无法预先检查正确性, 只有跑一把才能知道.
无法很好地管理大量用例, 且不支持团队协同作业, 个人用来回归测试或上线后的冒烟测试会是一个不错的选择.
通过优缺点的对比, 可以明显发现这个框架的硬伤其实很多了. 所以无论是业界开源的自动化测试框架或企业自研的还没有见过用 Excel 来组织用例的. 值得一提的是个别企业自研的自动化框架非常难用, 抑或是把一堆工具简单组合到一起. 根本无法提高团队的生产力. 不过好的产品也不是一蹴而就的, 需要一个持续优化的过程. 所以上面用 Excel 组织用例的框架还是值的玩一玩的, 暂且命名为 apitest 吧. 目前比较好的自动化测试框架有 unittest,testng,pytest 等.
3.2, 项目结构
testcase: 存放测试用例或请求的 JSON 文件.
config: 配置文件.
report: 测试报告和日志文件及其归档.
untils: 工具集, send_request 用来发送请求, email_tool 用来发送邮件, excel_tool 用来读取 Excel 中的数据, check_result 用来校验结果, run_main 用例执行入口, log_trace 用来追踪日志.
5, 日志打印
采用内置 logging 模块才记录运行日志, 设置日志级别.
- log_trace.log:
- import logging
- filename = "../report/test_case_run.log"
- logging.basicConfig(level=logging.INFO,
- format='%(asctime)s %(levelname)s1 %(filename)s [line:%(lineno)d] %(message)s',
- datefmt='%a, %d %b %Y %H:%M:%S',
- filename=filename,
- filemode='w')
6, 接口请求类封装
安装第三方模块 requests
pip install requests
定义函数 send_request, 根据传入的方法类型分别去调用 request 的 get,post,delete,put 等方法去发送请求. send_request.py:
- import requests
- from untils. log_trace import *
- # 发送 get 请求
- def get_request(url,data=None,headers=None):
- res = requests.get(url=url,data=data,headers=headers)
- return res
- # 发送 post 请求
- def post_request(url,data,headers=None):
- res = requests.post(url=url,data=data,headers=headers)
- return res
- # 发送 delete 请求
- def del_request(url,data=None,headers=None):
- res = requests.delete(url,data=data)
- return res
- # 发送 put 请求
- def put_request(url,data,headers=None):
- pass
- def send_request(method,url,data=None,headers=None):
- try:
- logging.info(headers)
- if headers:
- if method == "GET":
- return get_request(url,data,headers=headers)
- if method == "POST":
- return post_request(url,data=data,headers=headers)
- if method == "DELETE":
- return del_request(url,data=data,headers=headers)
- #put 使用频率低, 暂时不写
- if method == "PUT":
- return put_request(url,data=data,headers=headers)
- else:
- logging.info("Header is null")
- except Exception as e:
- logging.info("send request fail:%s"%e)
在 untils_test.py 中编写代码测试 send_request 方法, 代码如下:
- #coding:utf-8
- from untils.send_request import send_request
- def test_send_request():
- url="http://127.0.0.1:9000/articles/"
- headers = {
- "X-Token":"0a6db4e59c7fff2b2b94a297e2e5632e"
- }
- res = send_request("GET",url,headers=headers)
- print(res.JSON())
- if __name__ == "__main__":
- test_send_request()
运行结果:
- /usr/bin/python3.6 /home/stephen/IdeaProjects/apitest/untils/untils_test.py
- {
- 'status': 'BS.200', 'all_titles': {
- 'amy1': 'alive', 'modifytest': 'alive', 'addTest': 'alive'
- }, 'msg': 'query articles sucess.'
- }
- Process finished with exit code 0
来源: https://www.cnblogs.com/webDepOfQWS/p/10834873.html