pytest(五)

函数传参

import pytest


login_data = [('admin', '1111'), ('admin', '')]

def login(user, pwd):
    print('用户名:', user)
    print('密码:', pwd)
    if pwd:
        return True
    else:
        return False

@pytest.mark.parametrize('user, pwd', login_data)
def test_01(user, pwd):
    a = login(user, pwd)
    assert a == True, '密码为空'

if __name__ == '__main__':
    pytest.main()
chuancan.py .用户名: admin
密码: 1111
F用户名: admin
密码: 

AssertionError: 密码为空
True != False

Expected :False
Actual   :True
 <Click to see difference>

user = 'admin', pwd = ''

    @pytest.mark.parametrize('user, pwd', login_data)
    def test_01(user, pwd):
        a = login(user, pwd)
>       assert a == True, '密码为空'
E       AssertionError: 密码为空
E       assert False == True

chuancan.py:18: AssertionError
                                                           [100%]

================================== FAILURES ===================================
_______________________________ test_01[admin-] _______________________________

user = 'admin', pwd = ''

    @pytest.mark.parametrize('user, pwd', login_data)
    def test_01(user, pwd):
        a = login(user, pwd)
>       assert a == True, '密码为空'
E       AssertionError: 密码为空
E       assert False == True

chuancan.py:18: AssertionError
---------------------------- Captured stdout call -----------------------------
用户名: admin
密码: 
===================== 1 failed, 1 passed in 0.19 seconds ======================

函数传参就没什么可说的了,通过上述实例我们可以看出,两个case互不影响,即使有一个失败了,另一个也会正常运行,这里值得一提的是,我们可以自定义一个异常的名字,只需要在断言后直接加上就可以了

request参数

# conftest.py

import pytest

@pytest.fixture(scope='module')
def login(request):
    user = request.param['user']
    psw = request.param['psw']
    print('用户名:', user)
    print('密码:', psw)
    if psw:
        return True
    else:
        return False

# test_para.py

import pytest

log = [{'user': 'admin', 'psw': '11111'}, {'user': 'asd', 'psw': ''}]

@pytest.mark.parametrize('login', log, indirect=True)
def test_03(login):
    a = login
    print('login的返回值为:%s'%a)
    assert a

@pytest.mark.parametrize('login', log)
def test_04(login):
    print('参数:', login)
    print(login['user'])
============================= test session starts =============================
platform win32 -- Python 3.6.4, pytest-3.7.1, py-1.5.4, pluggy-0.7.1
rootdir: D:\PyCharmcode\untitled\pytestceshi, inifile:
plugins: metadata-1.7.0, html-1.19.0collected 4 items

test_para.py 用户名: admin
密码: 11111
.login的返回值为:True
用户名: asd
密码: 
Flogin的返回值为:False

test_para.py:15 (test_03[login1])
login = False

    @pytest.mark.parametrize('login', log, indirect=True)
    def test_03(login):
        a = login
        print('login的返回值为:%s'%a)
>       assert a
E       assert False

test_para.py:20: AssertionError
.参数: {'user': 'admin', 'psw': '11111'}
admin
.参数: {'user': 'asd', 'psw': ''}
asd
                                                        [100%]

================================== FAILURES ===================================
_______________________________ test_03[login1] _______________________________

login = False

    @pytest.mark.parametrize('login', log, indirect=True)
    def test_03(login):
        a = login
        print('login的返回值为:%s'%a)
>       assert a
E       assert False

test_para.py:20: AssertionError
---------------------------- Captured stdout setup ----------------------------
用户名: asd
密码: 
---------------------------- Captured stdout call -----------------------------
login的返回值为:False
===================== 1 failed, 3 passed in 0.20 seconds ======================

如果想把登录操作放到前置操作里,也就是用到@pytest.fixture装饰器,传参就用默认的request参数: user = request.param 这一步是接收传入的参数,如果传多个参数的话,可以把多个参数用一个字典去存储,这样最终还是只传一个参数不同的参数再从字典里面取对应key值就行,如: user = request.param[“user”]

注:添加indirect=True参数是为了把login当成一个函数去执行,而不是一个参数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值