Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pytest: pass one fixture to another

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!

like image 204
duhaime Avatar asked Sep 29 '18 13:09

duhaime


People also ask

Can pytest fixture call another fixture?

A fixture can use multiple other fixtures. Just like a test method can take multiple fixtures as arguments, a fixture can take multiple other fixtures as arguments and use them to create the fixture value that it returns.

Can you parameterize a fixture in pytest?

pytest enables test parametrization at several levels: pytest. fixture() allows one to parametrize fixture functions.

What is pytest Autouse?

“Autouse” fixtures are a convenient way to make all tests automatically request them. This can cut out a lot of redundant requests, and can even provide more advanced fixture usage (more on that further down).

How do you call pytest fixtures?

To access the fixture function, the tests have to mention the fixture name as input parameter. Pytest while the test is getting executed, will see the fixture name as input parameter. It then executes the fixture function and the returned value is stored to the input parameter, which can be used by the test.


1 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.

like image 149
duhaime Avatar answered Oct 18 '22 07:10

duhaime