Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How and where does py.test find fixtures

Where and how does py.test look for fixtures? I have the same code in 2 files in the same folder. When I delete conftest.py, cmdopt cannot be found running test_conf.py (also in same folder. Why is sonoftest.py not searched?

# content of test_sample.py def test_answer(cmdopt):     if cmdopt == "type1":         print ("first")     elif cmdopt == "type2":         print ("second")     assert 0 # to see what was printed 

content of conftest.py

import pytest  def pytest_addoption(parser):     parser.addoption("--cmdopt", action="store", default="type1",         help="my option: type1 or type2")  @pytest.fixture def cmdopt(request):     return request.config.getoption("--cmdopt") 

content of sonoftest.py

import pytest  def pytest_addoption(parser):     parser.addoption("--cmdopt", action="store", default="type1",         help="my option: type1 or type2")  @pytest.fixture def cmdopt(request):     return request.config.getoption("--cmdopt") 

The docs say

http://pytest.org/latest/fixture.html#fixture-function

  1. pytest finds the test_ehlo because of the test_ prefix. The test function needs a function argument named smtp. A matching fixture function is discovered by looking for a fixture-marked function named smtp.
  2. smtp() is called to create an instance.
  3. test_ehlo() is called and fails in the last line of the test function.
like image 649
Dave Avatar asked Nov 30 '12 09:11

Dave


People also ask

How does fixture work in pytest?

pytest fixtures are functions attached to the tests which run before the test function is executed. Fixtures are a set of resources that have to be set up before and cleaned up once the Selenium test automation execution is completed.

Why fixture is used in pytest?

Fixtures are used to feed some data to the tests such as database connections, URLs to test and some sort of input data. Therefore, instead of running the same code for every test, we can attach fixture function to the tests and it will run and return the data to the test before executing each test.

Are pytest fixtures cached?

the fixture will be evaluated once per test session and the result will be cached and reused in all dependent tests.

Where does Conftest py go?

You can put fixtures into individual test files, but to share fixtures among multiple test files, you need to use a conftest.py file somewhere centrally located for all of the tests. For the Tasks project, all of the fixtures will be in tasks_proj/tests/conftest.py. From there, the fixtures can be shared by any test.


2 Answers

py.test will import conftest.py and all Python files that match the python_files pattern, by default test_*.py. If you have a test fixture, you need to include or import it from conftest.py or from the test files that depend on it:

from sonoftest import pytest_addoption, cmdopt 
like image 167
ecatmur Avatar answered Oct 06 '22 08:10

ecatmur


Here is the order and where py.test looks for fixtures (and tests) (taken from here):

py.test loads plugin modules at tool startup in the following way:

  1. by loading all builtin plugins

  2. by loading all plugins registered through setuptools entry points.

  3. by pre-scanning the command line for the -p name option and loading the specified plugin before actual command line parsing.

  4. by loading all conftest.py files as inferred by the command line invocation (test files and all of its parent directories). Note that conftest.py files from sub directories are by default not loaded at tool startup.

  5. by recursively loading all plugins specified by the pytest_plugins variable in conftest.py files

like image 43
Alex Okrushko Avatar answered Oct 06 '22 06:10

Alex Okrushko