接口自动化框架pyface详细介绍
版权说明
本框架系本人结合一些实践经验和开源框架设计思想,在家基于兴趣爱好独立完成的代码开发。
源码只保存在私人电脑,办公电脑上无。github开源与公司无关,先把关系撇清,不涉及侵权。
嘘。
框架定位
首先最重要的就是学习交流,无商业用途。其次本框架有一定实用价值,可作为工作辅助工具,解决现有技术无法处理的问题。最后可以优化改造投入生产实用(若有更好的idea请务必告诉我,求知若渴)。
设计思想
技术栈
说明文字为本框架中用途。
python:脚本语言。
requests:http请求库。
allure:测试报告
numpy:数据格式兼容。
pandas:mysql返回数据处理。
PyMySQL:连接mysql。
SQLAlchemy:mysql连接引擎,支持ORM。
texttable:日志打印sql查询结果表格。
目录结构
用例组织方式
模板代码使用code_auto.py自动生成。
self.api_dir = os.path.join(os.path.join(self.base_dir, 'api'), 'bu') # 1
self.case_dir = os.path.join(os.path.join(self.base_dir, 'case'), 'sprint') # 2
self.uri = '/api/post' # 3
self.description = 'Demo auto code' # 4
# 5
self.body = """{}
"""
1 输入api子目录名称。接口是按业务部门来区分的,子目录名称建议按业务部门(bu==Business Unit)来设置。
2 输入测试用例子目录名称。现在流行敏捷开发,建议按迭代sprint或独立功能模块命名。
3 接口uri。需要注意的是,开头要有1个斜杠/
。
4 接口描述。如名称、作用。
5 请求体。
执行后在api和case目录生成测试初始化代码。
域名、Headers/Cookie涉及到环境变量,在data/env设置。
class _GldExp:
x = 1
headers = {"Content-Type": "application/json"}
dao_x = Dao('host:port',
'username',
'password')
test_url = 'https://x'
class _Gld:
x = 2
headers = {"Content-Type": "application/json"}
dao_x = Dao('host:port',
"username",
"password")
test_url = 'https://x'
def uuid_list(n):
"""Uuid list
@param n: Number
@return: A uuid list
"""
return [str(uuid.uuid4()).replace('-', '') for i in range(n)]
# Set environment name
vars_ = _GldExp
2个内部类_GldExp
和_Gld
,定义参数化环境变量。
在env文件中可以定义一些业务相关函数。公共函数需要放到common/func,建议不要轻易把框架无关的函数放到公共函数里面。
import env
后,使用vars_
引用来调用具体的环境变量,如vars_.test_url
。
测试代码编写方式
api/bu目录下,每个接口==1个py文件。
class ApiPost(Api):
def __init__(self):
super().__init__()
self.url = vars_.test_url + "/api/post"
def load(self):
self.body = {}
return self
def send(self):
self.res = self.req.post(url=self.url, headers=vars_.headers, json=self.body)
self.set_content()
return self.res
api继承了基类Api。根据不同环境初始化vars_.test_url
,load()
方法用于加载参数,send()
方法用于发送请求(视不同method修改对应的请求方法&参数,如get
,可以在common/request.py
中找到相关定义)。
测试代码完全面向对象。
def test_default():
x = ApiPost()
x.load().send()
这样能很方便的在接口之间传递参数,以及做参数化的工作。
比如,在接口.py中,需要参数化body的name:
def load(self):
self.body = {
"name": self.name
}
PyCharm会提示此属性未定义,忽略它。
在测试代码中写参数化就很简单:
x.name = 'dongfanger'
x.load().send()
JMeter参数化方式
本框架参数化借鉴了JMeter的参数化方式。也就是,在接口发请求后,对参数赋值;在接口收到相应后,提取参数。这也是测试代码要完全面向对象的原因。
面向对象能较好的组织测试代码,使代码逻辑清晰,阅读易于理解。
比如,先定义2个接口,苹果树和商店:
class AppleTree(Api):
def __init__(self):
super().__init__()
self.url = vars_.test_url + "/api/post/apple/tree"
def load(self):
self.body = {}
return self
def send(self):
self.res = self.req.post(url=self.url, headers=vars_.headers, json=self.body)
self.set_content()
return self.res
class ShopSale(Api):
def __init__(self):
super().__init__()
self.url = vars_.test_url + "/api/post/shop/sale"
def load(self):
self.body = {
"apple": self.apple
}
return self
def send(self):
self.res = self.req.post(url=self.url, headers=vars_.headers, json=self.body)
self.set_content()
return self.res
测试代码编写,苹果树先生产苹果,再运输到商店,商店卖苹果:
def test_apple_to_shop():
apple_tree = AppleTree()
apple_tree.load().send() # 生产苹果
good_apple = apple_tree.content['good_apple'] # content在Api基类中定义
shop_sale = ShopSale()
shop_sale.apple = good_apple # 传递参数
shop_sale.load().send()
print(shop_sale.content)
content在Api基类中定义:
def set_content(self):
"""After request, assert status and set content
"""
status_ok(self.res)
res_json = self.res.json()
assert 1000 == res_json.get('status')
try:
self.content = res_json['content']
except KeyError:
logger.info(f"{'*' * 26}\n"
f"Response no content\n"
f"{'*' * 26}\n")
先断言返回状态ok,再取响应json里面key为content的value。不同公司json规范不一样,需要做调整。
批量执行用例生成测试报告
pytest_allure.py批量执行测试用例。
# Input the directory to run pytest
run_dir = os.path.join(base_dir, 'case')
默认执行case目录下test_
开头或结尾的文件(pytest规则)。测试方法需要以test_
开头。
可以指定目录,如:
# Input the directory to run pytest
run_dir = os.path.join(os.path.join(base_dir, 'case'), 'sprint0001')
本框架借助pytest_sessionfinish
hook函数实现了生成测试报告并自动打开浏览器。
def pytest_sessionfinish(session):
allure_report_dir_test = session.config.getoption('allure_report_dir')
if allure_report_dir_test:
html_dir = os.path.join(allure_report_dir_test, 'html')
os.system(f'mkdir {html_dir}')
os.system(f"allure generate {allure_report_dir_test} -o {html_dir}")
os.system(f"allure open {html_dir}")
mysql支持
mysql主要用于:一提供参数化赋值;二数据库比对断言。
commons/dao.py实现了相关功能。在data/env.py中根据环境定义好连接后,通过vars_
使用。
dao_x = Dao('host:port',
'username',
'password')
sql_result = vars_.dao_x.select('select id, name from new_table;')
dao实现采用了pandas+sqlalchemy,对返回结果取值就可以按dataframe来,如sql_result['name'][0]
。
借助texttable会打印表格日志,观察数据。
[2020-03-22 18:14:13]Running sql
select id, name from new_table;
[2020-03-22 18:14:14]Sql result:
+----+------+
| id | name |
+====+======+
| 1 | w |
+----+------+
| 2 | g |
+----+------+
值得说明的是,为了数据校验方便,默认会把无小数的float转换为int,如5.0
->5
。
@staticmethod
def _convert(x):
"""Convert logic code
@param x: Single cell data
@return: Converted single cell data
"""
# float to int
if isinstance(x, float) and x % 1 == 0:
return int(x)
return x
结语
开源使我快乐。
分享才能收获更多。
我在github等你。
https://github.com/dongfanger/pyface
版权申明:本文为博主原创文章,转载请保留原文链接及作者。
接口自动化框架pyface详细介绍的更多相关文章
- 转载:python + requests实现的接口自动化框架详细教程
转自https://my.oschina.net/u/3041656/blog/820023 摘要: python + requests实现的接口自动化框架详细教程 前段时间由于公司测试方向的转型,由 ...
- python + requests实现的接口自动化框架详细教程
前段时间由于公司测试方向的转型,由原来的web页面功能测试转变成接口测试,之前大多都是手工进行,利用postman和jmeter进行的接口测试,后来,组内有人讲原先web自动化的测试框架移驾成接口的自 ...
- 接口自动化框架(Pytest+request+Allure)
前言: 接口自动化是指模拟程序接口层面的自动化,由于接口不易变更,维护成本更小,所以深受各大公司的喜爱. 接口自动化包含2个部分,功能性的接口自动化测试和并发接口自动化测试. 本次文章着重介绍第一种, ...
- Jmeter+Ant+Jenkins接口自动化框架
最近应公司要求,搭建一套接口自动化环境.看到通知邮件,没有多想就确定了Jmeter路线.可能有些人会 说,为啥不用python,相对而言高大上一些.因为公司内部现在项目有用到Jmeter,正好可以结合 ...
- 接口自动化框架2-升级版(Pytest+request+Allure)
前言: 接口自动化是指模拟程序接口层面的自动化,由于接口不易变更,维护成本更小,所以深受各大公司的喜爱. 第一版入口:接口自动化框架(Pytest+request+Allure) 本次版本做了一些升级 ...
- Jmeter+ant+Jenkins接口自动化框架搭建
摘自:https://testerhome.com/topics/13389 一.背景 上一篇讲了Jmeter 接口自动化-脚本数据分离实例,我们知道怎么利用Jmeter去编写接口自动化脚本,但是接 ...
- ThinkPHP框架视图详细介绍 View 视图--模板(九)
原文:ThinkPHP框架视图详细介绍 View 视图--模板(九) 视图也是ThinkPHP使用的核心部分: 一.模板的使用 a.规则 模板文件夹下[TPL]/[分组文件夹/][模板主题文件夹/]和 ...
- python+request接口自动化框架
python+request接口自动化框架搭建 1.数据准备2.用python获取Excel文件中测试用例数据3.通过requests测试接口4.根据接口返回的code值和Excel对比 但本章只讲整 ...
- struts2 + spring + mybatis 框架整合详细介绍
struts2 + spring + mybatis 框架整合详细介绍 参考地址: https://blog.csdn.net/qq_22028771/article/details/5149898 ...
随机推荐
- AQS总结
前言 AQS(Abstract Queued Synchronizer)是JUC并发包中的核心基础组件,作者是大名鼎鼎的Doug Lea.通过AQS可以实现大部分的同步需求. 宏观架构 AQS包括一个 ...
- 刷金币全自动脚本 | 让Python每天帮你薅一个早餐钱(送源码)
刷金币全自动脚本 | 让Python每天帮你薅一个早餐钱(送源码) 测试开发社区 6天前 文章转载自公众号 AirPython , 作者 星安果 阅读文本大概需要 12 分钟. 1 目 标 场 景 ...
- HTC新机A9足以取代iPhone 你相信吗?
你相信吗?" title="HTC新机A9足以取代iPhone 你相信吗?"> 自信和嘴硬之间,往往就是成功与失败的分水岭.乔老爷子当年推出iPhone.iPad等 ...
- vue项目实战
本篇文章主要介绍了vue的环境配置,vue项目的目录结构以及在开发vue项目中问题的一些解决方案. 环境配置及目录结构 1.安装node.js(http://www.runoob.com/nodejs ...
- redis实现二级缓存
缓存的作用就是降低数据库的使用率,来减轻数据库的负担.我们平常的操作一般都是查>改,所以数据库的有些查操作是重复的,如果一直使用数据库就会有负担.Mybatis也会做缓存,也会有一级缓存和二级缓 ...
- android应用程序源码结构分析
工程; 1. src文件夹存放源码. 2. gen下有跟src中一样的包文件,内部有一个名为R.java类,它是自动生成的一个类:该目录不用我们开发人员维护, 但又非常重要的目录 . 该目录用来存放由 ...
- Ubuntu 14.04 下NFS安装配置
1.执行命令:sudo apt-get install nfs-kernel-server; 2.执行命令:mkdir /home/jack/nfs-share 建立一个nfs服务的专有的文件夹; 3 ...
- Python——3条件判断和循环
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- IP 转发分组的流程
IP 转发分组的流程 数据路由:路由器在不同网段转发数据包: 网络畅通的条件:数据包能去能回: 从源网络发出时,沿途的每一个路由器必须知道到目标网络下一跳给哪个接口: 从目标网络返回时,沿途的每一个路 ...
- USB小白学习之路(12) Cy7c68013A固件之Slave FIFO(转)
Cy7c68013固件之Slave FIFO 转自:http://blog.csdn.net/zengshaoqing/article/details/53053539 选择SlaveFIFO传输方式 ...