Tep0.6.0更新聊聊Pytest变量接口用例3个级别复用

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

[[374238]]

本文转载自微信公众号「PythonMind」,作者dongfanger。转载本文请联系PythonMind公众号。   

 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的实现代码,如url、faker_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.  
  4. from tep.client import request 
  5.  
  6.  
  7. def test_post(faker_ch, url, login): 
  8.     # description 
  9.     logger.info("test post"
  10.     # data 
  11.     fake = faker_ch 
  12.     # request 
  13.     response = request( 
  14.         "post"
  15.         url=url("/api/users"), 
  16.         headers=login.jwt_headers, 
  17.         json={ 
  18.             "name": fake.name() 
  19.         } 
  20.     ) 
  21.     # assert 
  22.     assert response.status_code < 400 
  23.     # extract 
  24.     user_id = jmespath.search("id", response.json()) 

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

全局环境变量

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

这么做的目的是为了在PyCharm中敲代码,输入.后能自动带出来,提高编码效率。fixture_admin.py建议由管理员维护项目级别的公共变量,fixture_your_name.py由团队成员定义自己的环境变量,避免冲突。它们还有一个区别是fixture_admin.py的env_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.  
  4.  
  5. def _jwt_headers(token): 
  6.     return {"Content-Type""application/json""authorization": f"Bearer {token}"
  7.  
  8.  
  9. @pytest.fixture(scope="session"
  10. def login(url): 
  11.     # Code your login 
  12.     logger.info("Administrator login"
  13.     response = request( 
  14.         "post"
  15.         url=url("/api/users/login"), 
  16.         headers={"Content-Type""application/json"}, 
  17.         json={ 
  18.             "username""admin"
  19.             "password""123456"
  20.         } 
  21.     ) 
  22.     assert response.status_code < 400 
  23.     response_token = jmespath.search("token", response.json()) 
  24.  
  25.     class Clazz: 
  26.         token = response_token 
  27.         jwt_headers = _jwt_headers(response_token) 
  28.  
  29.     return Clazz 

使用:

  1. from loguru import logger 
  2.  
  3.  
  4. def test_login(login): 
  5.     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.  
  3.  
  4. def test(faker_ch, env_vars): 
  5.     test_a(faker_ch, env_vars) 
  6.     print(env_vars.get("name")) 

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

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

也可以外接redis。

tep0.6.0更新

tep用户手册是根据0.5.3版本写的,现在更新了0.6.0版本,一是支持本文提到的3个级别复用,微调了fixtures,二是把项目脚手架代码尽量封装到tep中,减少后续升级成本。涉及到4个文件:conftest.py、fixture_admin.py、fixture_login.py、fixture_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的方法。这套思路借鉴了JMeter和HttpRunner的部分设计思想,以及我使用过的接口测试平台经验,在pytest上实践了一下。tep只是测试工具,本质上还是写pytest,感兴趣可以试一下哦。

参考资料:源码 https://github.com/dongfanger/tep

 

责任编辑:武晓燕 来源: PythonMind
相关推荐

2011-06-08 17:30:18

用例级别缺陷等级

2011-05-16 15:18:18

测试用例

2017-11-08 12:51:12

2019-10-31 14:10:35

大数据人工智能工具

2021-11-18 08:20:22

接口索引SQL

2022-06-10 13:03:44

接口重试while

2021-02-07 23:58:10

单例模式对象

2018-08-21 05:03:04

NV overlay网络虚拟化网络

2022-11-15 10:01:27

2023-02-08 10:28:55

物联网智慧农业

2023-10-11 08:09:53

事务隔离级别

2020-11-25 18:15:10

AI

2021-05-25 07:46:43

CSSCSS 变量Web应用

2021-01-14 10:00:57

Restful接口

2022-09-12 06:33:15

Select多路复用

2022-04-21 15:35:24

工业物联网数据泄露能源

2019-07-03 09:46:31

物联网传感器机器学习

2010-06-09 18:38:28

UML用例图

2022-04-04 21:26:05

物联网汽车

2022-04-13 21:07:30

Vue 3函数重载
点赞
收藏

51CTO技术栈公众号