try easy pytest 1tep介绍
『 tep is a testing tool to help you write pytest more easily. Try Easy Pytest! 』
tep前身
tep的前身是接口自动化测试框架pyface,一款面向对象设计的测试框架,我写过一篇博客介绍。
测试框架 / 测试工具
tep的定位是 a testing tool
,不是 a testing framework
。
框架/工具,是有区别的。最大的区别,就是我自认为是没有足够的能力去自主开发一套“框架”!工具的能力,还是妥妥的!
自研的框架意味着不稳定,要花很多精力来踩坑填坑,别人不敢随便用的。工具只是站在巨人的肩膀上,出了问题,这个锅我不背!
tep是 try easy pytest
的首字母缩写,tep的目的是帮助你更简单地写pytest,比如用pytest+requests写接口自动化。
pytest是python的测试框架,很成熟。tep是pytest的测试工具,很简单。
pytest和tep都是开源项目。
设计理念
很大程度上借鉴了HttpRunner(优秀的框架)。不同的是,tep更着重写python,而不是写YAML文件。
- 简单是更好的
- 每个人都能用python写自动化
这就是tep的设计理念。
项目结构
tests
__init__.py
.gitignore
conftest.py
tep提供了快速创建项目的能力,也就是脚手架。执行 tep startproject project_name
,就可以创建项目结构,如,这里创建一个demo,
$ tep startproject demo
2020-07-28 14:34:57.649 | INFO | tep.scaffold:create_scaffold:40 - Create new project: demo
Project root dir: \PycharmProjects\demo
Created folder: demo
Created folder: demo\tests
Created file: demo\tests\__init__.py
Created file: demo\conftest.py
Created file: demo\.gitignore
tests是一个package,用于存放测试脚本,脚本文件以test_开头或_test结尾,pytest才能识别到。个人喜欢以_test结尾。
conftest.py是一个全局文件,定义全局变量,也可以定义fixture、hook、plugin等,
import os
import pytest
@pytest.fixture(scope="session", autouse=True)
def project_cache(request):
request.config.cache.set("project_dir", os.path.dirname(os.path.abspath(__file__)))
class Dev:
test_url = 'https://dev.com'
class Qa:
test_url = 'https://qa.com'
class Release:
test_url = 'https://release.com'
# choose environment
env = Qa
# you can define your variables and functions and so on
1 定义了一个fixture,把项目路径保存到pytest缓存中。
2 定义了环境的class,多环境切换,不需要修改测试脚本。
3 自定义内容,比如用户登录token等。
专注于写脚本
项目结构很清晰。在conftest.py
进行一些初始化/参数化/清理工作,在tests/
写测试脚本。
不像pyface那样面向对象的封装,tep更注重平铺写脚本的方式,这样就离“每个人都能用python写自动化”更近一步。毕竟封装之后看着容易晕,我也晕。
去除掉框架的约束,给每个人写python的自由,在测试脚本里你可以尽情发挥你的代码风格,代码能力,千人千面。代价呢,就是代码质量参差不齐。
这又怎么样呢,用过各种开源/自主研发的测试平台,还不是每个人都在写着自己风格的自动化case!
大胆写,能写,写出来,跑通,就已经是在写自动化,就已经是在创造价值了!
tep默认是不会创建 reports
文件夹的, 原因有二。
其一,如果你是本地执行的话,可以使用 --tep-reports
自定义命令行参数,来生成测试报告。
$ pytest --tep-reports
测试结束后会在 project_dir/reports
生成 report-2020-07-28
的allure测试报告。
其二,如果你是持续集成的话,如Jenkins,已经提供了allure report的插件,配置一下就可以自动生成测试报告,百度“jenkins allure”。
附上allure常用命令,
pytest --alluredir=result # 报告目录,会生成一堆数据文件
allure generate result -o html # 生成html报告
allure serve html # 启动服务
allure open html # 打开报告(直接执行自动启动服务) PyCharm可以右键index.html选择Open in Browser
allure下载地址,下载解压后,把bin绝对路径添加到系统环境变量Path中。allure需要安装jdk。
轻封装
tep尊重原生用法。
requests的封装只通过装饰器做了2个封装,一是记录接口请求响应耗时,二是打印日志。只需要 from tep.client import request
,就可以和 requests.request
一样使用了,没有做任何其他的冗余修改。
#!/usr/bin/python
# encoding=utf-8
"""
@Author : Don
@Date : 7/25/2020 2:02 PM
@Desc :
"""
import decimal
import json
import time
import requests
import urllib3
from loguru import logger
from requests import sessions
from tep.funcs import NpEncoder
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
def request_encapsulate(req):
def send(*args, **kwargs):
# elapsed
start = time.process_time()
response = req(*args, **kwargs)
end = time.process_time()
elapsed = str(decimal.Decimal("%.3f" % float(end - start))) + "s"
# log
try:
log4a = {"method": args[0]}
for k, v in kwargs.items():
# if not json, str()
try:
json.dumps(v)
except TypeError:
v = str(v)
log4a.setdefault(k, v)
log4a.setdefault("status", response.status_code)
log4a.setdefault("response", response.text)
log4a.setdefault("elapsed", elapsed)
logger.info(json.dumps(log4a, ensure_ascii=False, cls=NpEncoder))
except AttributeError:
logger.error("request failed")
except TypeError:
logger.warning(log4a)
return response
return send
@request_encapsulate
def request(method, url, **kwargs):
"""此处省略1万行代码,没做任何修改,从源码copy过来,只加了个装饰器"""
1 使用 time.process_time()
,记录了耗时。
2 打印日志,把请求响应的method、url、headers、参数、响应状态码、响应体、耗时等数据保存到json中,输出控制台。
日志选择用loguru取代logging,from loguru import logger
直接用,不用再管handler了。
- faker,造数据工具
- jmespath,json解析工具
- deepdiff,json比较工具
- pandas、numpy,数据处理工具
安装tep,自动就把这些开源利器安装上了,无需单独安装。未来会集成更多实用工具到tep中。
tep本身是很轻的。
tep可持续发展
我是2014年参加工作的,2018年才开始接触接口测试(汗!),现在有2年多的接口测试经验,其中包括一整年的纯后端接口测试经验。
接口自动化第一次写了接口自动化框架AIM(基于unittest),后来又有pyface,以及中间改造过的各种临时版本。也用过一些开源框架如RobotFramwork、HttpRunner,使用过自研工具,如基于JMeter封装的平台。还有一些网上开源的“web接口自动化平台”,这个我是打个大大的问号的。实用性很差,功能很鸡肋,报错还多。接口自动化测试框架的轮子,造也造不完。
tep“测试工具”的定位完美的避开了所有这些框架的弊端。工具不会定义你如何写自动化脚本,工具只会帮你更好地写自动化脚本。
有理由相信,tep会成长为一款实用的测试工具。
源码
https://github.com/dongfanger/tep
这里安利一波pytest官网教程,阅读英文文档,才能真正理解作者的意思。不过,我也会通过"try easy pytest"一系列的文章,把pytest的知识点提炼出来,供你学习。学python,写pytest,用tep。测试更专业!
专注测试,坚持原创,只做精品。欢迎关注公众号『东方er』
版权申明:本文为博主原创文章,转载请保留原文链接及作者。
try easy pytest 1tep介绍的更多相关文章
- Pytest框架介绍
Pytest框架介绍.安装 pytest是python测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,功能更强大 pytest特征 1:断言提示信 ...
- pytest一:pytest 框架介绍
pytest 是 python 的一种单元测试框架,与python 自带的 unittest测试框架类似,但是比 unittest 框架使用起来更简洁,效率更高.根据pytest 的官方网站介绍,它具 ...
- pytest框架-介绍、Mark(打标签)、命令运行用例、用例执行顺序、
1.pytest介绍:基于unittest 之上的单元测试框架 1.1.自动发现测试模块和测试用例: unitest 需要添加用例,(泰斯特楼贷)加载器加载测试用例 pytest 只需要一条代码就可以 ...
- Pytest - 使用介绍
1. 概述 pytest是一个非常成熟的全功能的Python测试框架,主要特点有以下几点: 1.简单灵活,容易上手,文档丰富: 2.支持参数化,可以细粒度地控制要测试的测试用例: 3.能够支持简单的单 ...
- 一、pytest的介绍和安装
需要针对一个项目系统开发一套UI自动化测试脚本,自己结合着学习,采用了pytest去实现,这里留下记录. 什么是pytest pytest 是一个非常成熟的全功能的Python测试框架 可以胜任uni ...
- Pytest安装介绍--使用(html报告)
Pytes是 一个单元测试框架,可以生成html报告. #卸载# pip uninstall pytest#安装# pip install -U pytest# 查看# pytest --versio ...
- pytest封神之路第一步 tep介绍
『 tep is a testing tool to help you write pytest more easily. Try Easy Pytest! 』 tep前身 tep的前身是接口自动化测 ...
- pytest单侧模块_入门汇总
Pytest简单介绍 (pytest是python的一个测试框架,主要是用来进行一些小的测试) 安装:pip install -U pytest 查看是否安装成功:pytest --version 运 ...
- [Python]使用pytest进行单元测试
安装pytest pipenv install pytest 验证安装的版本: pytest --version This , imported /site-packages/pytest.py 接下 ...
随机推荐
- 面试题五十四:二叉搜索树的第K大节点
方法:搜索二叉树的特点就是左树小于节点,节点小于右树,所以采用中序遍历法就可以得到排序序列 BinaryTreeNode KthNode(BinaryTreeNode pNode ,int k){ i ...
- Lun4R-CyBRICSCTF wp
WEB Hunt (Web, Baby, 50 pts) 打断点,然后就一个一个被抓住了... 接着F12就出现了.(这个flag是白色的,藏在下面....)... RE Baby Rev 题目给了个 ...
- JavaScript基础内容
javascript:是个脚本语言,需要有宿主文件,他的宿主文件是html文件.用来交互的 Javascript基础 写法分类: 1.内联(行内):写在标签里面,以事件属性表现 属性名就是事件属性名 ...
- c语言大小写转化函数(包括字母和字符串)
本憨憨忘了好几次了,这次一定记住他们! 首先大小写相差32.转换的话自己写函数也是可以写出来的. 1.字母 如果是字母转的话,用toupper(),tolower() 头文件是<ctype.h& ...
- PHP timezone_offset_get() 函数
------------恢复内容开始------------ 实例 返回相对于 GMT 的时区偏移: <?php$tz=timezone_open("Asia/Taipei" ...
- c# Dictionary的使用
创建: Dictionary<string, OverCaseData> dataDic = new Dictionary<string, OverCaseData>() ...
- 从零写一个Asp.net core手脚架(模型验证)
一个asp.net core项目,一定包含了各种的实体,在RESTful api里面,有很多的参数传递,不建立实体则大量的参数需要自定验证正确性,并且Action上面会写的密密麻麻的参数 在asp.n ...
- 每日一道 LeetCode (6):有效的括号
每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...
- 仅需1秒!搞定100万行数据:超强Python数据分析利器
前言 使用Python进行大数据分析变得越来越流行.这一切都要从NumPy开始,它也是今天我们在推文介绍工具背后支持的模块之一. 2 Vaex Vaex是 一种更快.更安全.总体上更方便的方法,可以使 ...
- 用 Python 制作关不掉的端午安康弹窗
端午节又称端阳节.龙舟节.重午节.龙节.正阳节.天中节等,端午节源自天象崇拜,由上古时代祭龙演变而来,因传说战国时期的楚国诗人屈原在五月五日跳汨罗江自尽,后来人们亦将端午节作为纪念屈原的节日,在端午节 ...