pytest装饰器:mark
一、mark 是给测试用例使用,可以改变一些行为
--- 不执行用例: skip, skipif
使用方法: @pytest.mark.skipif(condition,reason="xxxx")
condition:跳过条件,必传参数
reason: 标注原因,必传参数
---不通过,预期失败的函数: xfail
使用方法: @pytest.mark.xfail(condition,reason="xxxx")
condition:预期失败的条件,必传参数
reason: 失败的原因,必传参数
--- 使用fixture,自动执行fixture: usefixtures
使用方法:@pytest.mark.usefixtures(“工厂函数名”)
被标记的方法,会执行fixture
二、函数数据参数化mark.parametrize
规范:parametrize(argnames,argvalues,indirect=False,ids=None,scope=None)
argnames :参数名
argvalues:参数对应值,类型必须为list
a .单个参数:@pytest.mark.parametrize(‘参数名’,参数值)
注意:
参数值:[值1,值2,….]
有多少个参数值方法会运行多少次
b. 多个参数:@pytest.mark.parametrize(‘参数1,参数2,....’,参数值)
注意:
1.多个参数需要逗号分隔
2.参数值:[(参数1的值,参数2的值,..),()…]
3.参数值可以通过函数返回值使用:@pytest.mark.parametrize(‘参数1,参数2,....’,函数返回值)
4.测试函数的参数必须等于parametrize表示参数
例如:
class Test_ABC:
@pytest.mark.parametrize(“li”,['123','456']) #单个参数
def test_a(self,li):
assert li==234
class Test_ABC:
#多个参数
@pytest.mark.parametrize(“li”,"wang",[('123','456'),('789','910')])
def test_a(self,li,wang): #wang即使不调用,也要传入
assert li==234
def re_data_list():
retrun [('123','456'),('789','910')] #直接返回
class Test_ABC:
@pytest.mark.parametrize(“li”,"wang",re_data_list()) #读取函数
def test_a(self,li,wang):
assert li==234
def re_data_list():
with open('./data.txt','r') as f: #a=('123','456'),b=('789','910') 把数据放在一个txt文件中
for i in f.readlines():
list.data.append(eval(i,split("=")[-1]))
return list.data
class Test_ABC:
@pytest.mark.parametrize(“li”,"wang",re_data_list()) #传入函数调用
def test_a(self,li,wang):
assert li ==234
问题:
基于fixture的参数化 和mark.parametrize的参数化有什么区别?
--基于fixture的参数化 ,可以应用于多个用例
--基于mark.parametrize的参数化,可用于单个测试用例的
三、自定义标记效果:对用例进行标记分类
mark要先注册,再使用:pytest.ini 配置文件中定义:markes ,
比如:pytest.ini文件中:
markes=
bf = 被罚,
zs = 张三,
ls = 李四
test_ui.py文件中:
@pytest.mark.bf
def test_01():
pass
@pytest.mark.zs
def test_02():
pass
使用:选择某个分类,比如bf
--- 执行:pytest -m bf
不选择某个分类,比如zs
-- 执行:pytest -m "not zs"