• pytest 全能的mark学习笔记(三)


    pytest测试函数标记

      1.用例标签tags:@pytest.mark.{marker_name}

    描述:@pytest.mark.{marker_name}自定义一个mark,然后pytest -v -m {marker_name}只运行标记了{marker_name}的函数,pytest -v -m "not {marker_name}"来运行未标记{marker_name}的。

    语法:

    ep:

    @pytest.mark.smoke

    @pytest.mark.get

    $pytest -m 'smoke'

      仅运行标记smoke的函数

    $pytest -m 'smoke and get'

      运行标记smoke和get的函数

    $pytest -m 'smoke or get'

      运行标记smoke或get的函数

    $pytest -m 'smoke and not get'

      运行标记smoke和标记不是get的函数

      2. 跳过用例:@pytest.mark.skip @pytest.mark.skipif

    描述:skip和skipif可以标记无法在某些平台上运行的测试功能,或者您希望失败的测试功能。要给跳过的测试添加理由和条件,应当使用skipif。

    语法:

     ep:

    @pytest.mark.skipif(condition)

    @pytest.mark.skipif(tasks.__version__<'0.2.0',reason = 'not supported until version 0.2.0)

      使用skip和skipif标记,测试会直接跳过,而不会被执行。

       3.标记函数参数化(测试用例方法前加测试数据):@pytest.mark.parametrize("a,b,expected", testdata)

    语法:

    • ep1 传入单个参数

    @pytest.mark.parametrize('参数名',lists)

    • ep2 传入两个参数

    @pytest.mark.parametrize('参数1','参数2',[(

                  参数1_data[0],参数2_data[0]),(

                  参数1_data[1],参数2_data[1])]

    传三个或者更多也是这样传。list的每个元素都是一个元祖,元祖里的每个元素和按参数顺序一一对应。

    实例1:传两个参数

     1 import pytest
     2 @pytest.mark.parametrize("test_input,expected",
     3                          [ ("3+5", 8),
     4                            ("2+4", 6),
     5                            ("6 * 9", 42),
     6                          ])
     7 def test_eval(test_input, expected):
     8     assert eval(test_input) == expected
     9 
    10 if __name__ == "__main__":
    11     pytest.main(["-s", "test_canshu1.py"])

    实例2:参数组合

     1 import pytest
     2 @pytest.mark.parametrize("x", [0, 1])
     3 @pytest.mark.parametrize("y", [2, 3])
     4 def test_foo(x, y):
     5     print("测试数据组合:x->%s, y->%s" % (x, y))
     6 
     7 结果:
     8 test_canshu1.py 测试数据组合:x->0, y->2 
     9 .测试数据组合:x->1, y->2 
    10 .测试数据组合:x->0, y->3 
    11 .测试数据组合:x->1, y->3 . 

    实例3:传一个参数

    1 import pytest
    2 @pytest.mark.parametrize('task', tasks_to_try)
    3 def test_add_4(task):
    4     task_id = tasks.add(task)
    5     t_from_db = tasks.get(task_id)
    6     assert equivalent(t_from_db, task)

       4.fixture参数化:@pytest.fixture(params=[{key11:value1,key12:value2} , {key21:value21,key22:value22}])

     代码实例:

    import pytest
    @pytest.fixture(params=[{'userID':'00001','username':'jack'},
                            {'userID':'00002','username':'mike'}])
    def getdata(request): #这里的request是固定参数名
        #分别打印params的字典项:{'userID': '00001', 'username': 'jack'}
        #和{'userID':'00002','username':'mike'}
        print("request.param======",request.param)
        return request.param    #这里的request.param也是固定的
    class TestCase():
        def test_case1(self, getdata):
            print("第1个用例输出:{}".format(getdata))
        def test_case2(self, getdata):
            print("第2个用例输出:{}".format(getdata))
    执行后测试报告如下: 报告中用例都执行了2次,使用了params中的两个测试数据
    备注:根据这样的例子,如果在测试中需要处理很多重复测试数据时,则这些数据就可以传入params里(可以另外写个方法读取txt/excel等文件测试数据值,以多字典列表形式返回所有测试数据),类似于unittest的DDT数据驱动方法。然后就会逐一去带入testcase里执行了

    其他mark

    1. 标记用例执行顺顺序pytest.mark.run(order=1) (需安装pytest-ordering)

    2. 标记使用指定fixture(测试准备及清理方法) @pytest.mark.usefixtures()

    3. 标记超时时间 @pytest.mark.timeout(60) (需安装pytest-timeout)
      1. 或命令$pytest --timeout=300
    4. 标记失败重跑次数@pytest.mark.flaky(reruns=5, reruns_delay=1) (需安装pytest-rerunfailures)
      1. 最多失败重跑5次 & 如果失败则延迟1秒后重跑(可以不传)
      2. 或命令$pytest --reruns 5 --reruns-delay 1
    5. 标记类中用例按定义(书写)顺序执行(某一条失败则后面的用例不会执行) @pytest.mark.incremental
      
  • 相关阅读:
    类型转换
    struts2默认拦截器
    struts2自定义拦截器
    struts2之I18N
    代理模式
    抽象类 abstract class 接口
    java基础题
    final
    内部类
    tomcat 端口占用问题解决
  • 原文地址:https://www.cnblogs.com/helloTerry1987/p/10960401.html
Copyright © 2020-2023  润新知