pytest内核测试平台落地初体验
测试平台,有人说它鸡肋,有人说它有用,有人说它轮子,众说纷纭,不如从自身出发,考虑是否要做测试平台:
- 第1阶段,用Python+requests写接口自动化。
- 第2阶段,选择unitttest或pytest,更熟悉pytest选了pytest。
- 第3阶段,快速搭建pytest项目脚手架,封装tep测试工具。
- 第4阶段,通过Git管理测试脚本,多分支合并代码。
- 第5阶段,去除本地环境同步麻烦,方便团队共享脚本。
需要有个测试平台。
使用篇
环境变量
环境变量是字符串键值对,全局作用域。比如不同环境不同域名:

使用:
env_vars.name。
fixtures
fixtures即pytest的fixture,可以添加自定义函数,供测试用例使用。比如封装登录接口返回token:

tep.fixture提供了urlfixture,自动拼接环境变量env_vars.domain + uri。
测试用例
在前端网页写代码,1条用例对应1个pytest的test_name.py文件。比如调用login fixture登录:

本地编写
PyCharm写代码体验更好,正确姿势是从平台下载包含环境变量和fixtures等项目结构代码,本地编写用例,调试,跑通后,粘贴到平台上共享和维护:

本地和平台环境一致,省去前期搭建,关注
tests用例。
扩展能力
用例是Python代码,理论上所有Python能写出来的,平台都能支持,比如HTTP、WebSocket、Protobuf等协议。
原理篇
pytest内核

vue2-ace-editor作为前端代码编辑组件。- 前端把代码通过HTTP请求传给后端。
- 后端把代码存入MySQL数据库。
- 运行用例,从数据库取出代码,生成pytest文件。
- Shell命令调用
pytest -s test_name.py,执行测试。 - 后端把运行结果日志返给前端展示。
之所以要折腾数据库,是因为每次部署后docker容器里面的文件会被清掉,只能动态生成。
tep脚手架
测试平台功能是从tep项目脚手架中抽取出来的:

- 把
fixture_env_vars.py做成了环境变量功能。 - 把
fixture_login.py等做成了fixtures功能。 - 把
tests做成了测试用例功能。
运行用例
整体流程如下:

tep startproject project_name
运行用例时,判断项目目录是否存在,如果不存在就调用tep startproject project_name创建项目脚手架。
更新conf.yaml中env
把前端传的当前运行环境更新到conf.yaml文件中:
env: qa
动态生成或更新fixture_env_vars.py文件
根据环境变量功能模块的数据,动态生成fixture_env_vars.py文件:
#!/usr/bin/python
# encoding=utf-8
from tep.dao import mysql_engine
from tep.fixture import *
@pytest.fixture(scope="session")
def env_vars(config):
class Clazz(TepVars):
env = config["env"]
"""Variables define start"""
# Environment and variables
mapping = {
"qa": {
"domain": "https://qa.com",
},
"release": {
"domain": "https://release.com",
}
# Add your environment and variables
}
# Define properties for auto display
domain = mapping[env]["domain"]
"""Variables define end"""
return Clazz()
动态生成或更新fixtures目录下所有文件
根据fixtures功能模块的数据,动态生成fixture_login.py等所有文件:
from tep.client import request
from tep.fixture import *
def _jwt_headers(token):
return {"Content-Type": "application/json", "authorization": f"Bearer {token}"}
@pytest.fixture(scope="session")
def login(url):
# Code your login
logger.info("Administrator login")
response = request(
"post",
url=url("/api/users/login"),
headers={"Content-Type": "application/json"},
json={
"username": "admin",
"password": "123456",
}
)
assert response.status_code < 400
response_token = jmespath.search("token", response.json())
class Clazz:
token = response_token
jwt_headers = _jwt_headers(response_token)
return Clazz
conftest.py会自动查找后
import,tests用例直接使用。
动态生成或更新tests某个test_文件
从数据库拿到用例代码,动态生成test_文件。
Shell执行pytest命令
从上一步拿到case_path,调用pytest -s case_path执行测试。
计划后续添加suite和marker两种批量执行用例方式。
小结
本文介绍了我第一次做的测试平台的使用和原理,技术栈为Vue+Django+Django REST Framework+JWT+MySQL+pytest+Git+BitBucket+Drone+Nginx+Docker+K8S,已在公司落地,还未大规模产出,由于服务端有较多磁盘IO读写,大量使用后不知道性能如何,目前来看问题不大,需要持续观察和优化。测试平台底层是pytest,用到了tep,那就叫teprunner。
参考资料:
pytest内核测试平台落地初体验的更多相关文章
- 学习版pytest内核测试平台开发万字长文入门篇
前言 2021年,测试平台如雨后春笋般冒了出来,我就是其中一员,写了一款pytest内核测试平台,在公司落地.分享出来后,有同学觉得挺不错,希望能开源,本着"公司代码不要传到网上去,以免引起 ...
- 自动测试工具agitarOne 初体验之-MockingBird的使用
大名鼎鼎的AgitarOne就不用解释了,在昨天的随笔中有一些解释,今天主要说说Agitar 中Mockingbird的使用. 为了提高测试代 码的Coverage,仅仅靠Agita ...
- django初体验 学习笔记
django环境搭建 1.安装Python 2.ipython sudo apt-get install ipython sudo pip instal ...
- Testin云测试平台初体验
这几天偶然接触到了一个叫做Testin的云测试平台,经过一番体验,感觉还是不错的,因为里面提供了大量的测试机型,可以针对Android手机的严重碎片化现象做出比较全面的测试,同时Testin的测试内容 ...
- Net Core平台灵活简单的日志记录框架NLog+SqlServer初体验
Net Core平台灵活简单的日志记录框架NLog+SqlServer初体验 前几天分享的"[Net Core平台灵活简单的日志记录框架NLog+Mysql组合初体验][http://www ...
- Net Core平台灵活简单的日志记录框架NLog+Mysql组合初体验
Net Core平台灵活简单的日志记录框架NLog初体验 前几天分享的"[Net Core集成Exceptionless分布式日志功能以及全局异常过滤][https://www.cnblog ...
- teprunner测试平台Django引入pytest完整源码
本文开发内容 pytest登场!本文将在Django中引入pytest,原理是先执行tep startproject命令创建pytest项目文件,然后从数据库中拉取代码写入文件,最后调用pytest命 ...
- .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...
- Linux内核驱动学习(三)字符型设备驱动之初体验
Linux字符型设备驱动之初体验 文章目录 Linux字符型设备驱动之初体验 前言 框架 字符型设备 程序实现 cdev kobj owner file_operations dev_t 设备注册过程 ...
随机推荐
- Android基本组件TextView和EditView
1.TextView 用于在屏幕上显示文本,可以显示单行文本,多行文本,和带图像的文本. 常用xml属性 (1)android:autoLink,用于指定是否将指定的文本转换为可单机的超链接形式,其属 ...
- java中变量和标识符名命名规范
变量存放的是内存地址,当定义一个变量后,我们可以通过变量名找到该内存地址,可以修改该内存区间的值. 标识符的命名规范:首字母:字母,下划线,$符号:其余部分:数字,字母,下划线,$. 标识符应该避开j ...
- Spark学习进度-实战测试
spark-shell 交互式编程 题目:该数据集包含了某大学计算机系的成绩,数据格式如下所示: Tom,DataBase,80 Tom,Algorithm,50 Tom,DataStructure ...
- 使用lua+redis解决发多张券的并发问题
前言 公司有一个发券的接口有并发安全问题,下面列出这个问题和解决这个问题的方式. 业务描述 这个接口的作用是给会员发多张券码.涉及到4张主体,分别是:用户,券,券码,用户领取记录. 下面是改造前的伪代 ...
- Termux键盘配置
通过编辑~/.termux/termux.properties配置 extra-keys = [\ ['ESC', 'CTRL', '&', '$', '!', '%', '<', '& ...
- 为什么 StringBuffer 有 toStringCache 而 StringBuilder 没有?
对于 StringBuilder 和 StringBuffer 的源码会发现,StringBuffer 中有一个叫 toStringCache 的成员变量,用来缓存 toString() 方法返回字符 ...
- Log4j配置按照文件大小和日期分割日志文件
目录 Log4j 下载地址 文件大小分割日志文件 以日期分割每天产生一个日志文件 自定义信息输出到日志文件 Log4j 下载地址 Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控 ...
- SQL Server management studio使用sa连接时报错与伺服器的连接已成功,但在登入程序是发生错误
使用Sql Server management studio的sa用户连接数据库时,报如下错误 解决方法: 1.使用windows验证登录 2.右键点击连接,点击属性,点击安全性,选择混合验证 3.重 ...
- DC-DC变换器,24v转5v稳压芯片,3A输出电流
在24V输入中,比较合适的LDO可以选择:PW6206,输出电压3V,3.3V,5V 输入电压最高40V,功耗也低4uA左右,采用SOT23-3封装. PW6206系列是一个高精度,高输入电压低静态电 ...
- javascript判断浏览器访问,刷新,返回
话不多说,直接上 if (window.performance.navigation.type === 0/* 正常访问 */) { // 你要干的事 } else if (window.perfor ...