Use of fixture Transmission Parameter request in pytest Interface Test
- 2021-11-24 02:03:51
- OfStack
Preface
Some test cases need to rely on some specific case before they can be executed. For example, login obtains token, and subsequent requests need to be brought with them. In order to ensure that the same user must bring cookies obtained at login.
Most use cases will log in first, so it is necessary to draw out the login separately and write a function. All other use cases will call this login function, but the logged-in account can't be written dead.
1. Function parameter transmission
Write a login function separately, pass two parameters user and password, call the login function when writing use cases, and input several groups of user and password parameterization. Need to use the decorator $pytest. mark. parametrize, which writes two parameters
The first parameter is a string, and multiple parameters are separated by commas
The second parameter is list, and the tuple type is used for multiple arrays
import pytest
def login(user, password):
''' Login function '''
print(' User name: %s' % user)
print(' Password: %s' % password)
return 'hello'
login_data = [('admin', '123456'), ('admin','')]
# Decorator
@pytest.mark.parametrize('user, password', login_data)
def test_login(user, password):
''' Login test case '''
result = login(user, password)
assert result == 'hello'
if __name__ == '__main__':
pytest.main('-s', 'day0110_fixture.py')
'''
Running result
============================= test session starts =============================
platform win32 -- Python 3.6.6, pytest-4.5.0, py-1.8.0, pluggy-0.13.1
rootdir: F:\python work\youyou_class\study_pytestcollected 2 items
day0110_fixture.py . User name: admin
Password: 123456
. User name: admin
Password:
[100%]
========================== 2 passed in 0.02 seconds ===========================
'''
request parameter
request is what I need to accept parameters. With the @ pytest. fixture decorator, the default request parameters are used for passing parameters. user = request. param is to receive the incoming parameters.
import pytest
# Test account data
test_data = ["admin1", "admin2"]
@pytest.fixture(scope="function")
def login(request):
user = request.param
print(" Login account: %s"%user)
return user
@pytest.mark.parametrize("login", test_data, indirect=True)
def test_login(login):
""" Login use case """
a = login
print(" In test cases login Return value of :%s" % a)
assert a != ""
The indirect=True parameter is used to execute login as a function, not as a parameter
request passes two parameters
If @ pytest. fixture is used, and two parameters are used in it, multiple parameters can be stored in one dictionary, so that only one parameter is passed in the end.
Just take the corresponding key value from the dictionary for different parameters, such as: user = request. param ["user"]
#_*_coding:utf-8_*_
# Author : Administrator
# Creation time : 2020/1/1018:18
# Documents : day0110_fixture.py
import pytest
@pytest.fixture(scope='function')
def login(request):
''' Login function '''
user = request.param['user']
password = request.param['password']
print(' User name: %s' % user)
print(' Password: %s' % password)
return 'hello'
login_data = [{'user': 'admin', 'password': '123456'}, {'user': 'admin', 'password': '1'}]
# Decorator
@pytest.mark.parametrize('login', login_data, indirect=True)
def test_login(login):
''' Login test case '''
result = login
assert result == 'hello'
if __name__ == '__main__':
pytest.main('-s', 'day0110_fixture.py')
'''
Run results:
============================= test session starts =============================
platform win32 -- Python 3.6.6, pytest-4.5.0, py-1.8.0, pluggy-0.13.1
rootdir: F:\python work\youyou_class\study_pytestcollected 2 items
day0110_fixture.py User name: admin
Password: 123456
. User name: admin
Password: 1
. [100%]
========================== 2 passed in 0.02 seconds ===========================
'''