Pytest: pass one fixture to another

Question:

Is it possible to pass one fixture object to another in Pytest? For example, suppose I want to have two fixture objects: one that’s a numpy array, and another that’s some model of that array:

import pytest
import numpy as np

@pytest.fixture()
def arr():
  np.random.seed(141)
  return np.random.seed(141)

@pytest.fixture()
def model(arr):
  return arr * 2

def test_multiplication(arr, model):
  assert model == arr * 2

Here arr is type function but arr() is NoneType inside model, which confuseth me.

The use case for this is a case where some tests need access to the raw arr itself, while others need access to the models.

To make this work, however, one needs to pass one fixture to another (so we can build the model using the array). Is this possible? Any help others can offer would be greatly appreciated!

Asked By: duhaime

||

Answers:

Whoops, my sample arr() function wasn’t defining an array! You can share fixtures in the way approached above:

import pytest
import numpy as np

@pytest.fixture()
def arr():
  np.random.seed(141)
  return np.random.rand(100,2)

@pytest.fixture()
def model(arr):
  return arr * 2

def test_multiplication(arr, model):
  assert np.all(model == arr * 2)

One can also create a class with various class methods, then return that from a fixture. Then tests can call individual class methods or access class attributes to get access to a larger chunk of shared state. Very nice.

Answered By: duhaime
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.