When you want to run tests against multiple test parameters, but you have to use other pytest.fixture
objects,
you can use pytest.mark.parametrize
with indirect parameter to target a fixture for extracting request.param
from parametrize list.
# -*- coding: utf-8 -*-
import os
import pytest
import requests
@pytest.fixture(scope='function')
def parameter(request):
"""
A common fixture to handle pytest.mark.parametrize decorator.
Attribute `param` from `request` fixture is used for indirect.
It is important to keep the scope limited to `function`.
"""
return request.param
@pytest.mark.parametrize('parameter', [
'jack fruit', 'mango', 'banana', 'coconut',
], indirect=['parameter'])
def test_method_1(monkeypatch, parameter):
"""
Example test method 1
Fixure `parameter` is given to indirect parameter.
Each item in the list is a string.
"""
monkeypatch.setenv('FRUIT', parameter)
assert os.getenv('FRUIT') == parameter
@pytest.mark.parametrize('parameter', [
('sky', 'blue'), ('rose', 'red'), ('snow', 'white'),
], indirect=['parameter'])
def test_method_2(monkeypatch, parameter):
"""
Example test method 2
Fixure `parameter` is given to indirect parameter.
Each item in the list is a tuple.
"""
def mock_get(*args, **kwargs):
return {parameter[0]: parameter[1]}
monkeypatch.setattr(requests, 'get', mock_get)
result = requests.get('http://testurl.com')
assert result.get(parameter[0]) == parameter[1]