西安高端网站建设首选,淘宝如何提升关键词排名,网站建设与管理期末,网站邮箱后台子域名tep是一款测试工具#xff0c;在pytest测试框架基础上集成了第三方包#xff0c;提供项目脚手架#xff0c;帮助以写Python代码方式#xff0c;快速实现自动化项目落地。
在tep项目中#xff0c;自动化测试用例都是放到tests目录下的#xff0c;每个.py文件相互独立在pytest测试框架基础上集成了第三方包提供项目脚手架帮助以写Python代码方式快速实现自动化项目落地。
在tep项目中自动化测试用例都是放到tests目录下的每个.py文件相互独立没有依赖1个文件即1条用例彼此分离。
虽然用例也能相互引用但是除非万不得已一般不建议这么做牵一发动全身后期维护困难。
用例的代码编写思路是从上往下的和pytest/unittest/script常规写法无异不会有学习成本一般也不会有问题。有成本有问题的可能是环境变量和fixtures因为tep做了封装提供了依赖注入的共享方式fixture又是pytest较难理解的知识点所以有必要通过本文来讲讲tep环境变量、fixtures、用例三者之间的关系帮助理解以便更灵活顺手的借助tep实现pytest自动化项目。
假如不用环境变量和fixtures
假如不用环境变量和fixtures是完全可以的比如在tests下新建脚本login_test.py
from tep.client import requestdef test():response request(post,urlhttps://qa.com/api/users/login,headers{Content-Type: application/json},json{username: admin,password: 123456,})assert response.status_code 400
请求接口https://qa.com/api/users/login断言响应状态码小于400。问题来了url固定假如需要切换两个环境qa和release该怎么办
参数化
无论是做自动化测试还是性能测试都会接触到参数化这个词。它是指把代码中的固定数据硬编码定义成变量让每次运行时数据不一样固定数据变为动态数据。动态数据的来源是变量、数据库、外部文件等。动态数据的类型一般是常量的字符串也可以是函数比如JMeter的函数助手也可以是依赖注入比如pytest的fixture。
依赖注入的fixture
“依赖注入是控制反转IoC Inversion of Control的一种技术形式”这句话出自维基百科我也不知道什么意思画个图简单表达下 意思是给client一个injectorclient不需要做什么就能用到service。
pytest的fixture实现了依赖注入允许我们在不修改测试代码的情况下引入fixture来额外添加一些东东。
对于url来说域名是需要做参数化的不同环境域名不同所以tep把它做成了fixture通过函数参数引入
from tep.client import request
from tep.fixture import *def test(url): # 引入fixtureresponse request(post,urlurl(/api/users/login),headers{Content-Type: application/json},json{username: admin,password: 123456,})assert response.status_code 400
tep.fixture.url定义如下
pytest.fixture(scopesession)
def url(env_vars):def domain_and_uri(uri):if not uri.startswith(/):uri / urireturn env_vars.domain urireturn domain_and_uri
如果一眼就看懂了恭喜你如果一眼就看懵了没关系。我会花功夫把它讲明白它很关键
把fixture当变量看
虽然从定义上看fixture是用def关键字定义的函数但是理解上把它看做变量就可以了。比如
import pytestpytest.fixture
def name():return dongfanger
一般函数的用法是函数名加小括号通过name()才能得到dongfanger。fixture不一样以上定义可以理解为
name dongfanger
把dongfanger赋值给namefixture名 return值。通过变量name就得到dongfanger了。
既然是变量那么就能随便赋值str、function、class、object都行。比如在fixture内部定义个函数
import pytestpytest.fixture
def who():def get_name():return dongfangerreturn get_name
理解为把函数名get_name赋值给fixture名变量
who get_name
get_name是个函数名需要加小括号get_name()才能得到dongfanger。who也必须通过who()才能得到dongfanger。再看tep.fixture.url是不是清楚些了
pytest.fixture(scopesession)
def url(env_vars):def domain_and_uri(uri):if not uri.startswith(/):uri / urireturn env_vars.domain urireturn domain_and_uri
理解为把函数名domain_and_uri赋值给fixture名变量
url domain_and_uri
使用时通过url(/api)得到域名和uri拼接后的结果。
第2行的def url(env_vars):也有一个参数env_vars接下来继续解释。
fixture参数是其他fixture
fixture的参数只能是其他fixture。比如
import pytestpytest.fixture
def chinese_name():return 东方erpytest.fixture
def english_name(chinese_name):return dongfanger
调用english_namepytest会先执行参数里的其他fixture chinese_name然后执行自己english_name。
如果把tep.fixture.url拆成两步来看就很清晰了第一步
pytest.fixture(scopesession)
def url(env_vars):func Nonereturn func
第二步
pytest.fixture(scopesession)
def url(env_vars):func Nonedef domain_and_uri(uri):if not uri.startswith(/):uri / urireturn env_vars.domain urifunc domain_and_urireturn func
环境变量
tep.fixture.url的参数是另外一个fixture env_vars 环境变量它的定义如下
from tep.fixture import *pytest.fixture(scopesession)
def env_vars(config):class Clazz(TepVars):env config[env]Variables define start# Environment and variablesmapping {qa: {domain: https://qa.com,},release: {domain: https://release.com,}# Add your environment and variables}# Define properties for auto displaydomain mapping[env][domain]Variables define endreturn Clazz()
只看中间注释Variables define start到Variables define end部分即可。url参数化的域名就在这里mapping字典建立了环境和变量之间的映射根据不同的环境key获取不同的变量value。
config fixture的作用是读取conf.yaml文件里面的配置。
参数化的方式很多JMeter提供了4种参数化方式tep的fixture env_vars借鉴了JMeter的用户自定义变量 env_vars.put()和env_vars.get()借鉴了JMeter BeanShell的vars.put()和vars.get()。 实例测试多个网址
讲到最后形成了思路通过实际的例子看看环境变量、fixtures、用例是怎么用起来的加深下印象。假如qa环境有2个网址学校端和机构端脚本都需要用到。
第一步修改env_vars编辑fixture_env_vars.py Variables define start# Environment and variablesmapping {qa: {domain: https://qa.com,domain_school: https://school.qa.com, # 新增domain_org: https://org.qa.com # 新增},release: {domain: https://release.com,domain_school: https://school.release.com # 新增domain_org: https://org.release.com # 新增}# Add your environment and variables}# Define properties for auto displaydomain mapping[env][domain]domain_school mapping[env][domain_school] # 新增domain_org mapping[env][domain_org] # 新增Variables define end
添加了6行代码定义了env_vars.domain_school和env_vars.domain_org。
第二步定义fixtures新建fixture_url.py
pytest.fixture(scopesession)
def url_school(env_vars):def domain_and_uri(uri):if not uri.startswith(/):uri / urireturn env_vars.domain_school urireturn domain_and_uripytest.fixture(scopesession)
def url_org(env_vars):def domain_and_uri(uri):if not uri.startswith(/):uri / urireturn env_vars.domain_org urireturn domain_and_uri
参照tep.fixture.url修改env_vars.domain为env_vars.domain_school和env_vars.domain_org新增了2个fixture url_school和url_org。
更进一步也许会定义fixture login_school和login_org灵活选择。
小结 本文循序渐进的讲解了tep环境变量、fixtures和用例之间的关系重点对tep.fixture.url进行了解释只要理解了它整体关系就很清楚了。之所以要用fixture原因一是多人协作共享我们需要用别人写好的函数复用返回值有些同学习惯定义函数参数参数不变还好万一哪天改了别人引用的用例会全部报错fixture很好的限制了这一点它默认是不能传参的虽然可以通过定义内部函数来实现传参但是并不推荐这么做宁愿增加冗余代码定义多个fixture也比代码耦合度高好一些。原因二是import的问题pytest会自动查找conftest.py里的fixturetep会进一步自动查找fixtures下的fixture导入到conftest.py不需要import就能使用减少了import代码避免了可能会出现的循环导入问题。
最后感谢每一个认真阅读我文章的人礼尚往来总是要有的虽然不是什么很值钱的东西如果你用得到的话可以直接拿走 软件测试面试小程序
被百万人刷爆的软件测试题库谁用谁知道全网最全面试刷题小程序手机就可以刷题地铁上公交上卷起来
涵盖以下这些面试题板块 1、软件测试基础理论 2、web,app接口功能测试 3、网络 4、数据库 5、linux 6、web,app接口自动化 7、性能测试 8、编程基础9、hr面试题 10、开放性测试题11、安全测试12、计算机基础 这些资料对于【软件测试】的朋友来说应该是最全面最完整的备战仓库这个仓库也陪伴上万个测试工程师们走过最艰难的路程希望也能帮助到你