• pytest框架 里 fixture 参数化的方法


    另外一篇例子:

          懂得UI自动化测试的人,应该都比较清楚ddt的模块,在一个测试场景中,如果是同样的测试步骤,那么使用ddt,就可以使用一个单个测试解决多个测试场景的使用。本文章主要总结pytest测试框架的参数化的应用。

         还是通过一个具体的案例来说明这部分的案例应用,比如写一个两个数相加之和来,那么它的测试场景就很多的,如果编写测试点也是很多的,我们就按传统的方式来测试它,见案例代码和测试代码:

    #!/usr/bin/python3
    #coding:utf-8
    def add(a,b):
    return a+b

    def test_001():
    assert add(1,2)==3
    def test_002():
    assert add(2,2)==4
    def test_003():
    assert add('hi',' wuya')=='hi wuya'

    见如上的测试代码,首先不考虑它的测试点是否设计合理,就单纯的来说,一个函数的测试需要写很多的测试代码,相对而言不是一个好的选择,写了很多的垃圾代码,但是在pytest的参数化而言,可以很轻松的来解决这个问题,见实现的代码:

    #!/usr/bin/python3
    #coding:utf-8
    import pytest

    def add(a,b):
    return a+b

    @pytest.mark.parametrize('a,b,result',[
    (1,2,3),
    (2,2,4),
    ('hi',' wuya','hi wuya')
    ])
    def test_add(a,b,result):
    assert add(a,b)==result

    执行如上的代码,见执行结果的输出:

    ============================= test session starts ==============================
    platform darwin -- Python 3.7.4, pytest-4.0.2, py-1.8.0, pluggy-0.12.0 -- /usr/local/bin/python3.7
    cachedir: .pytest_cache
    metadata: {'Python': '3.7.4', 'Platform': 'Darwin-18.7.0-x86_64-i386-64bit', 'Packages': {'pytest': '4.0.2', 'py': '1.8.0', 'pluggy': '0.12.0'}, 'Plugins': {'xdist': '1.29.0', 'forked': '1.0.2', 'sugar': '0.9.2', 'html': '1.22.0', 'cov': '2.7.1', 'allure-adaptor': '1.7.10', 'metadata': '1.8.0'}, 'JAVA_HOME': '/Library/Java/JavaVirtualMachines/jdk-12.0.2.jdk/Contents/Home'}
    rootdir: /Applications/code/stack/pyUnit, inifile:
    plugins: xdist-1.29.0, forked-1.0.2, sugar-0.9.2, html-1.22.0, cov-2.7.1, allure-adaptor-1.7.10, metadata-1.8.0
    collecting ... collected 3 items

    f1.py::test_add[1-2-3] PASSED [ 33%]
    f1.py::test_add[2-2-4] PASSED [ 66%]
    f1.py::test_add[hi- wuya-hi wuya] PASSED [100%]

    =========================== 3 passed in 0.03 seconds ===========================

    依据执行结果可以看到,刚才说的几个测试点都包含到了,而且只使用了一个测试的函数,这样来说更加高效和方便。当然代码还可以更加简单,也就是对测试的数据可以分离,见修改后的代码:

    #!/usr/bin/python3
    #coding:utf-8
    import pytest

    def add(a,b):
    return a+b

    addList1=[
    (1,2,3),
    (2,2,4),
    ('hi',' wuya','hi wuya')
    ]

    @pytest.mark.parametrize('a,b,result',addList1)
    def test_add(a,b,result):
    assert add(a,b)==result


     当然测试数据可以分离到文件中,这地方就不详细的再介绍了。

         固件参数化会使用到pytest中内置的固件request,并通过request.param来获取参数。还是以上面的案例来修改,见修改后的测试代码:

    #!/usr/bin/python3
    #coding:utf-8
    import pytest

    def add(a,b):
    return a+b

    addList1=[
    (1,2,3),
    (2,2,4),
    ('hi',' wuya','hi wuya')
    ]

    @pytest.mark.parametrize('a,b,result',addList1)
    def test_add(a,b,result):
    assert add(a,b)==result


    dict1=[
    {'a':1,'b':2,'result':3},
    {'a':2,'b':2,'result':4}
    ]

    @pytest.fixture(params=dict1)
    def param(request):
    return request.param

    def test_add_param(param):
    add(param['a'],param['b']==param['result'])


    固件函数使用于另外一个测试的场景,我们需要连接很多好几个数据库来操作不同的业务场景,那么可以使用固件参数来很好的解决该问题,测试代码如下:

    #!/usr/bin/python3
    #coding:utf-8
    import pytest

    @pytest.fixture(params=[
    ('MySQL:','root','123456'),
    ('Oracle','wuya','123456')
    ])
    def param(request):
    return request.param

    @pytest.fixture(autouse=True)
    def connDb(param):
    print('连接数据库%s,账户:%s,密码:%s'%param)
    yield
    print('关闭数据库%s,账户:%s,密码:%s' % param)

    def test_database():
    assert 1==1

    来源: https://mp.weixin.qq.com/s/eDRwcqHXiPff4L2Abs_J3w
  • 相关阅读:
    重构机房收费系统总结1之配置文件+反射+抽象工厂
    win7 下jenkins配置与使用
    ant-jmeter批量脚本
    ant批量运行Jmeter脚本遇到 Content is not allowed in prolog.问题及解决方案
    JMeter学习笔记--JMeter前置处理器
    JMeter学习笔记--详解JMeter定时器
    JMeter学习笔记--详解JMeter配置元件
    JMeter学习笔记--详解JMeter逻辑控制器
    JMeter学习笔记--JMeter监听器
    JMeter学习笔记--创建数据库测试计划
  • 原文地址:https://www.cnblogs.com/kaibindirver/p/9915008.html
Copyright © 2020-2023  润新知