函数传参
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当成一个函数去执行,而不是一个参数