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"

          

posted @ 2022-09-12 17:04  嘿豆粒  阅读(141)  评论(0编辑  收藏  举报