tep是一款测试工具,在pytest测试框架基础上集成了第三方包,提供项目脚手架,帮助以写Python代码方式,快速实现自动化项目落地。fixture是pytest核心技术,本文聊聊如何使用fixture完成变量、接口、用例3个级别复用。

技术原理

fixture是一种特殊函数,实现了依赖注入,pytest规定,只要在conftest.py模块中定义了fixture,作为参数传给测试函数test(fixture_name)就可以使用,无需import。tep在conftest.py上封装了一层fixtures,类似于Django初始化数据加载的fixtures,定义了env_vars环境变量,预置了登录接口等。整体思路如下图所示:

  • 实线:表示fixture流转,从tep.fixture预置fixture,到fixtures,到conftest.py,到tests
  • 虚线:表示动态变量流转,参考JMeter vars.put()vars.get(),实现用例级别复用。
  • 蓝色线:表示静态变量流转,参考JMeter自定义用户变量,实现变量级别复用。

tep.fixture

tep.fixture第一块内容是预置fixture的实现代码,如urlfaker_ch等,对使用者隐藏。第二块内容是类TepVar,预置了1个Python字典vars_和2个存取方法put()get(),划分了一块key-value形式存储区域。

fixtures

fixtures是一个包,里面包括多个fixture_*.py格式的Python模块,定义的全部都是fixture,只对外提供fixture,不提供function

自动注册

conftest.py是pytest的特殊文件,文件名固定,tep在其中实现了自动注册功能,它会自动查找fixtures目录下,所有以fixture_开头,以.py结尾的Python模块进行导入,无需手动添加。注册后,tests才能够找到fixtures中定义的fixture,否则报错fixture not found

tests

tests存放所有测试用例,tep建议每个Python模块中只定义1个test()函数,用例分离,独立运行。

参考了HttpRunner每个yaml文件1条用例的做法。复杂场景可以定义多个测试test()函数或Test类,pytest都支持。

使用示例

变量级别复用

函数局部变量

  1. import jmespath
  2. from loguru import logger
  3. from tep.client import request
  4. def test_post(faker_ch, url, login):
  5. # description
  6. logger.info("test post")
  7. # data
  8. fake = faker_ch
  9. # request
  10. response = request(
  11. "post",
  12. url=url("/api/users"),
  13. headers=login.jwt_headers,
  14. json={
  15. "name": fake.name()
  16. }
  17. )
  18. # assert
  19. assert response.status_code < 400
  20. # extract
  21. user_id = jmespath.search("id", response.json())

函数内部变量,作用域是整条测试用例,可以在多个接口之间进行复用,比如参数化和关联:

全局环境变量

  1. #!/usr/bin/python
  2. # encoding=utf-8
  3. """ Can only be modified by the administrator. Only fixtures are provided.
  4. """
  5. from tep.dao import mysql_engine
  6. from tep.fixture import *
  7. @pytest.fixture(scope="session")
  8. def env_vars(config):
  9. class Clazz(TepVars):
  10. env = config["env"]
  11. """Variables define start"""
  12. # Environment and variables
  13. mapping = {
  14. "qa": {
  15. "domain": "https://qa.com",
  16. "mysql_engine": mysql_engine("127.0.0.1", # host
  17. "2306", # port
  18. "root", # username
  19. "123456", # password
  20. "qa"), # db_name
  21. },
  22. "release": {
  23. "domain": "https://release.com",
  24. "mysql_engine": mysql_engine("127.0.0.1",
  25. "2306",
  26. "root",
  27. "123456",
  28. "release"),
  29. }
  30. # Add your environment and variables
  31. }
  32. # Define properties for auto display
  33. domain = mapping[env]["domain"]
  34. mysql_engine = mapping[env]["mysql_engine"]
  35. """Variables define end"""
  36. return Clazz()
  37. @pytest.fixture
  38. def project_level():
  39. pass

使用:

  1. def test(env_vars, env_vars_your_name):
  2. print(env_vars.common_var)
  3. print(env_vars_your_name.my_var)

全局环境变量由fixtures提供:

核心数据是env_vars.Clazz类里面的mappingdomainmysql_engine等属性:

这么做的目的是为了在PyCharm中敲代码,输入.后能自动带出来,提高编码效率。

fixture_admin.py建议由管理员维护项目级别的公共变量,fixture_your_name.py由团队成员定义自己的环境变量,避免冲突。它们还有一个区别是fixture_admin.pyenv_vars继承了tep.fixture.TepVar,支持env_vars.put()env_vars.get()

变量都由fixture提供。

接口级别复用

tep预置登录接口fixture_login.py已经实现了接口级别复用,其他接口可以参照实现:

  1. from tep.client import request
  2. from tep.fixture import *
  3. def _jwt_headers(token):
  4. return {"Content-Type": "application/json", "authorization": f"Bearer {token}"}
  5. @pytest.fixture(scope="session")
  6. def login(url):
  7. # Code your login
  8. logger.info("Administrator login")
  9. response = request(
  10. "post",
  11. url=url("/api/users/login"),
  12. headers={"Content-Type": "application/json"},
  13. json={
  14. "username": "admin",
  15. "password": "123456",
  16. }
  17. )
  18. assert response.status_code < 400
  19. response_token = jmespath.search("token", response.json())
  20. class Clazz:
  21. token = response_token
  22. jwt_headers = _jwt_headers(response_token)
  23. return Clazz

使用:

  1. from loguru import logger
  2. def test_login(login):
  3. logger.info(login.token)

用例级别复用

a_test.py,定义1条测试用例test_a(),使用faker_ch生成随机name,通过env_vars.put()方法写入TepVar.vars_中:

  1. def test_a(faker_ch, env_vars):
  2. name = faker_ch.name()
  3. env_vars.put("name", name)

reuse_a_test.py,定义另外1条测试用例test()import test_a后手动调用执行,从TepVar.vars_中读取name

  1. from tests.sample.case_reuse.a_test import test_a
  2. def test(faker_ch, env_vars):
  3. test_a(faker_ch, env_vars)
  4. print(env_vars.get("name"))

注意test_a()函数参数引用的所有fixture,需要在test()函数参数中重新申明一遍,比如示例中的(faker_ch, env_vars)

tep是借助conftest.pyfixture,用类变量来做的,参考了JMeter BeanShell的vars

也可以外接redis

tep0.6.0更新

tep用户手册是根据0.5.3版本写的,现在更新了0.6.0版本,一是支持本文提到的3个级别复用,微调了fixtures,二是把项目脚手架代码尽量封装到tep中,减少后续升级成本。涉及到4个文件:conftest.pyfixture_admin.pyfixture_login.pyfixture_your_name.py

更新tep

  1. pip install tep==0.6.0
  • 如果还没有用过tep,使用这条命令安装后,执行tep startproject project_name就可以创建0.6.0版本的项目脚手架,包含了预置代码结构和sample测试用例。
  • 如果已经安装了tep,也需要执行这条命令升级0.6.0版本。

老项目升级(可选)

老项目升级也很简单,先在项目根目录执行命令:

  1. tep -U

它会自动替换conftest.py,考虑到老项目fixtures已经有真实数据了,这里给出了version0.6.0文件包,命令执行后在项目根目录生成:

把老项目的真实数据提取出来,手动替换一下就可以了:

小结

本文介绍了如何使用pytest测试框架实现变量、接口、用例3个级别复用,给出了在tep中的使用示例,然后提供了安装升级tep0.6.0的方法。这套思路借鉴了JMeterHttpRunner的部分设计思想,以及我使用过的接口测试平台经验,在pytest上实践了一下。tep只是测试工具,本质上还是写pytest,感兴趣可以试一下哦。

参考资料:

源码 https://github.com/dongfanger/tep

tep0.6.0更新聊聊pytest变量接口用例3个级别复用的更多相关文章

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

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

  2. jmeter3.0+ant1.10+jenkins实现接口自动化并发送邮件

    有很多关于接口自动化的文章,此篇仅用于记录自己的学习用.使用jmeter3.0+ant1.10+jenkins2.实现接口自动化并发送邮件,本篇是用的编写build文件来实现发送邮件,也可以用jenk ...

  3. 浅谈Android Studio3.0更新之路(遇坑必入)

    >可以参考官网设置-> 1 2 >> Fantasy_Lin_网友评论原文地址是:简书24K纯帅豆写的我也更新一下出处[删除]Fa 转自脚本之家 浅谈Android Studi ...

  4. 开源低代码开发平台entfrm2.1.0更新

    开源低代码开发平台entfrm2.1.0更新 新功能 代码生成支持主子表,支持预览: 新增多应用顶部菜单与左侧菜单联动: element-ui升级到2.15.1: 新增表单管理,集成avue-from ...

  5. 4.修改更新源sources.list,提高软件下载安装速度(提供Kali 2.0 更新源)

    1.切换到root用户(如果已经是root用户就直接看第二步) dnt@HackerKali:~$ su 密码: 2.用文本编辑器打开sources.list,手动添加下面的更新源 root@Hack ...

  6. V4.0到来了,css雪碧图生成工具4.0更新啦

    V3.0介绍 http://www.cnblogs.com/wang4517/p/4476758.html V4.0更新内容 V4.0下载地址:http://download.csdn.net/det ...

  7. 修改更新源sources.list,提高软件下载安装速度(提供Kali 2.0 更新源)

    1.切换到root用户(如果已经是root用户就直接看第二步) dnt@HackerKali:~$ su 密码: 2.用文本编辑器打开sources.list,手动添加下面的更新源 root@Hack ...

  8. Maven3.0.3的环境变量配置

    Maven3.0.3的环境变量配置 //该配置经过实际验证已经可以使用.验证的环境maven3.0.3(官网的目前最新版)1 windows maven3的安装 标签: #maven |  发布时间: ...

  9. Android 8.0+ 更新安装apk失败的问题

    最近做项目发现Android 8.0+ 更新安装apk时 出现安装失败的情况  总结原因是 缺少安装的权限 Android 8.0 (Android O)为了针对一些流氓软件引导用户安装其他无关应用. ...

随机推荐

  1. PyQt+moviepy音视频剪辑实战2:实现一个剪裁视频文件精华内容留存工具

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 PyQt+moviepy音视频剪辑实战 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.引言 ...

  2. 转:解析HTTP协议六种请求方法,get,head,put,delete,post有什么区别

    解析HTTP协议六种请求方法,get,head,put,delete,post有什么区别 标准Http协议支持六种请求方法,即: 1.GET 2.POST 3.PUT 4.Delete 5.HEAD ...

  3. 第11.24节 Python 中re模块的其他函数

    一. re.compile函数 正则表达式编译函数,在后面章节专门介绍. 二. re.escape(pattern) re.escape是一个工具函数,用于对字符串pattern中所有可能被视为正则表 ...

  4. PyQt(Python+Qt)学习随笔:Qt Designer中Action的信号

    Action与菜单和工具栏挂接后,只是实现了相关的关联关系,但并不能执行响应操作,真正的响应操作是通过Action的信号与对应槽函数连接实现的. Action提供了4种信号: changed()信号: ...

  5. 分别使用python和java练习冒泡排序

    冒泡排序算法的运作如下:(从小到大)   比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针 ...

  6. 二分查找——没有想象中的容易(详解各种变式,超深度理解,c++)

    int binarySearch(int[] nums, int target) { int left = 0; int right = nums.length - 1; // 注意 while(le ...

  7. pandas 删除列

    ddf = pd.DataFrame({"id":[1,2,3], "name":[4,5,6],"age":[7,8,9]})ddf = ...

  8. 【笔记】「pj复习」深搜——简单剪枝

    深搜--简单剪枝 说在最前面: 因为马上要 NOIP2020 了,所以菜鸡开始了复习qwq. pj 组 T1 ,T2 肯定要拿到满分的,然后 T3 , T4 拿部分分, T3 拿部分分最常见的做法就是 ...

  9. maven打包package时出现错误

    Some problems were encountered while building the effective model for com.ecjtu:adopt:war:1.0-SNAPSH ...

  10. sql注入之文件写入into outfile

    sql注入中写入webshell的几种方式 sql注入中写入webshell的几种方式 secure_file_priv="c:/-"被注释掉或者是web路径 php.ini中的g ...