Pytest的参数化(四)

       懂得UI自动化测试的人,应该都比较清楚ddt的模块,关于该模块在自动化测试的应用,应该我是国内使用最早的,

在2015年的文章体系中就有介绍,以及案例的应用实战,后来很多人也是根据我的文章系列,然后逐步的应用。它确实

很强大的,在一个测试场景中,如果是同样的测试步骤,那么使用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 -- /Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7
cachedir: .pytest_cache
rootdir: /Applications/code/stack/study/xunit/fixtureTest, inifile:
plugins: allure-adaptor-1.7.10
collected 3 items                                                                                               

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

=========================================== 3 passed in 0.04 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

 

见执行后的结果信息:

Testing started at 21:36 ...
/usr/local/bin/python3.7 /Applications/PyCharm.app/Contents/helpers/pycharm/_jb_pytest_runner.py --path /Applications/code/stack/study/xunit/fixtureTest/test_login_params.py
Launching pytest with arguments /Applications/code/stack/study/xunit/fixtureTest/test_login_params.py in /Applications/code/stack/study/xunit/fixtureTest

============================= 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
rootdir: /Applications/code/stack/study/xunit/fixtureTest, inifile:
plugins: allure-adaptor-1.7.10
collecting ... collected 2 items

test_login_params.py::test_database[param0] 连接数据库MySQL:,账户:root,密码:123456
PASSED                       [ 50%]关闭数据库MySQL:,账户:root,密码:123456

test_login_params.py::test_database[param1] 连接数据库Oracle,账户:wuya,密码:123456
PASSED                       [100%]关闭数据库Oracle,账户:wuya,密码:123456


=========================== 2 passed in 0.02 seconds ===========================

Process finished with exit code 0

 

posted @ 2019-08-31 19:49  无涯(WuYa)  阅读(599)  评论(0编辑  收藏  举报