当前位置: 首页 > 科技观察

Tep0.6.0Update说说Pytest变量接口用例的3层复用

时间:2023-03-15 23:05:19 科技观察

转载本文请联系PythonMind公众号。tep是一款基于pytest测试框架集成第三方包的测试工具,提供项目脚手架,帮助通过编写Python代码快速实现自动化项目的实现。Fixture是pytest的核心技术。本文从三个层面讲如何使用fixture来完成变量、接口和用例的复用。技术原理Fixture是一个实现依赖注入的特殊函数。pytest规定只要在conftest.py模块中定义了fixture,就可以作为参数传递给测试函数test(fixture_name),无需import。tep在conftest.py上封装了一层fixture,类似于Django用来初始化数据加载的fixture,定义了env_vars环境变量,预设了登录界面。整体思路如下图所示:实线:表示fixture循环,从tep.fixture到presetfixture,到fixtures,到conftest.py,到tests。虚线:表示动态变量流,参考JMetervars.put()和vars.get()实现用例级复用。蓝线:表示静态变量流,参考JMeter自定义用户变量实现变量级复用。第一段tep.fixturetep.fixture是预置fixture的实现代码,比如url,faker_ch等,对用户是隐藏的。第二块内容是类TepVar,预置了一个Python字典vars_和两个访问方法put()和get(),以key-value的形式划分了一个存储区域。fixturesfixtures是一个包含多个Python模块的包,格式为fixture_*.py。所有的定义都是fixture。对外只提供fixture,不提供function。自动注册conftest.py是pytest的一个特殊文件,文件名是固定的,tep在里面实现了自动注册功能,它会自动找到fixtures目录下所有以fixture_开头,以.py结尾的Python模块导入,无需手动添加。注册后,测试才能找到fixtures中定义的fixture,否则会报错fixturenotfound。teststests存放所有的测试用例,tep建议在每个Python模块中只定义一个test()函数,测试用例分开独立运行。参考HttpRunneruseoneusecaseperyamlfile的做法。复杂场景可以定义多个测试test()函数或者Test类,pytest都支持。使用示例变量级别重用函数局部变量importjmespathfromloguruiimportloggerfromtep.clientiportrequestdeftest_post(faker_ch,url,login):#descriptionlogger.info("testpost")#datafake=faker_ch#requestresponse=request("post",url=url("/api/users"),headers=login.jwt_headers,json={"name":fake.name()})#assertassertresponse.status_code<400#extractuser_id=jmespath.search("id",response.json())函数内部变量,scope是整个测试用例,可以在多个接口之间复用,比如参数化和关联:全局环境变量"""Canonlybemodifiedbytheadministrator.Onlyfixturesareprovided."""fromtep.daoimportmysql_enginefromtep.fixtureimport*@pytest.fixture(scope="session")defenv_vars(config):classClazz(TepVars):env=config["env"]"""Variablesdefinestart"""#Environmentandvariablesmapping={"qa":{"domain":"https://qa.com","mysql_engine":mysql_engine("127.0.0.1",#host"2306",#port"root",#username"123456",#password"qa"),#db_name},"release":{"domain":"https://release.com","mysql_engine":mysql_engine("127.0.0.1","2306","root","123456","re??lease"),}#Addyourenvironmentandvariables}#Definepropertiesforautodisplaydomain=mapping[env]["domain"]mysql_engine=mapping[env]["mysql_engine"]"""Variablesdefineend"""returnClazz()@pytest.fixturedefproject_level():passuse:deftest(env_vars,env_vars_your_name):print(env_vars.common_var)print(env_vars_your_name.my_var)全局环境变量由fixtures提供:核心数据在env_vars里面.Clazzclassmapping,domain,mysql_engine等属性:这个的作用是在PyCharm中敲代码,输入.后可以自动带出来,提高编码效率。fixture_admin.py建议管理员维护项目-级别的公共变量。团队成员定义自己的环境变量以避免冲突。他们之间的另一个区别是fixt的env_varsure_admin.py继承tep.fixture.TepVar,支持env_vars.put()和env_vars.get()。变量由固定装置提供。接口级复用tep预设的登录接口fixture_login.py已经实现了接口级复用,其他接口可参考:fromtep.clientimportrequestfromtep.fixtureimport*def_jwt_headers(token):return{"Content-Type":"application/json","authorization":f"Bearer{token}"}@pytest.fixture(scope="session")deflogin(url):#Codeyourloginlogger.info("Administratorlogin")response=request("post",url=url("/api/users/login"),headers={"Content-Type":"application/json"},json={"username":"admin","password":"123456",})assertresponse.status_code<400response_token=jmespath.search("token",response.json())classClazz:token=response_tokenjwt_headers=_jwt_headers(response_token)returnClazz使用:fromloguruiimportloggerdeftest_login(login):logger.info(login.token)用例级别重用a_,定义一个测试用例test_a(),使用faker_ch生成一个随机名称,通过env_vars.put()方法写入TepVar.vars_:deftest_a(faker_ch,env_vars):name=faker_ch.name()env_vars.put("name",name)reuse_a_test.py,再定义一个测试用例test(),导入test_a然后手动调用执行,从TepVar.vars_中读取name:fromtests.sample.case_reuse.a_testimporttest_adeftest(faker_ch,env_vars):test_a(faker_ch,env_vars)print(env_vars.get("name"))注意test_a()函数参数引用的所有fixture都需要在test()函数参数中重新声明,如例子中(faker_ch,env_vars)tep是通过conftest.py和fixture对类变量完成的,参考了JMeterBeanShell的vars。Redis也可以外接。tep0.6.0更新tep用户手册基于0.5.3版本编写,现已更新0.6.0版本。一是支持本文提到的三个层次的复用,fixtures已经做了微调。另外就是尽量把项目脚手架代码封装在tep中,减少后续升级的成本。涉及四个文件:conftest.py、fixture_admin.py、fixture_login.py、fixture_your_name.py。更新teppiinstalltep==0.6.0如果你还没有使用过tep,使用这个命令安装后,执行tepstartprojectproject_name来创建一个0.6.0版本的项目脚手架,包括预设的代码结构和样例测试用例。如果已经安装了tep,还需要执行该命令升级0.6.0版本。老项目升级(可选)老项目升级也很简单,先在项目根目录下执行命令:tep-U,会自动替换conftest.py,考虑到老项目fixtures已经有了真实数据,这里是版本0。6.0文件包,执行命令后在项目根目录生成:提取旧项目真实数据,手动替换:总结本文介绍如何使用pytest测试框架实现三个层次的复用变量、接口和用例。给出了在tep中的使用示例,然后给出了tep0.6.0的安装升级方法。这套思路借鉴了JMeter和HttpRunner的一些设计思路,以及我使用过的接口测试平台的经验,在pytest上进行了实践。tep只是一个测试工具,本质上是在写pytest。如果您有兴趣,可以尝试一下。参考资料:源码https://github.com/dongfanger/tep