web-dev-qa-db-fra.com

Comment et où pytest trouve-t-il des appareils

Où py.test cherche-t-il des luminaires? J'ai le même code dans 2 fichiers dans le même dossier. Lorsque je supprime conftest.py, il est impossible de trouver cmdopt avec Test_conf.py (également dans le même dossier. Pourquoi le fichier sonoftest.py n'est-il pas recherché?

# 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

contenu de 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")

contenu de 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")

Les docs disent

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

  1. pytest trouve le test_ehlo à cause du préfixe test_. La fonction de test nécessite un argument de fonction nommé smtp. Un appareil assorti La fonction est découverte en recherchant une fonction marquée nommée smtp.
  2. smtp () est appelé pour créer une instance.
  3. test_ehlo () est appelé et échoue dans la dernière ligne de la fonction de test.
27
Dave

py.test importera conftest.py et tous les fichiers Python correspondant au modèle python_files, par défaut test_*.py. Si vous avez un appareil de test, vous devez l'inclure ou l'importer à partir de conftest.py ou des fichiers de test qui en dépendent:

from sonoftest import pytest_addoption, cmdopt
26
ecatmur

Voici la commande et où py.test cherche des fixtures (et des tests) (pris de ici ): 

py.test charge les modules de plug-in au démarrage de l'outil de la manière suivante: 

  1. en chargeant tous les plugins internes

  2. en chargeant tous les plugins enregistrés via les points d’entrée setuptools. 

  3. en analysant à l'avance la ligne de commande pour l'option -p name et en chargeant le plug-in spécifié avant l'analyse en ligne de commande. 

  4. en chargeant tous les fichiers conftest.py comme induit par l'appel de la ligne de commande (fichiers de test et tous ses répertoires parents). Notez que Les fichiers conftest.py des sous-répertoires ne sont pas chargés par défaut à démarrage de l'outil. 

  5. en chargeant récursivement tous les plugins spécifiés par la variable pytest_plugins dans les fichiers conftest.py

18
Alex Okrushko

J'avais le même problème et j'ai passé beaucoup de temps à trouver une solution simple. Cet exemple est destiné aux autres personnes confrontées à la même situation que moi.

  • conftest.py:
import pytest

pytest_plugins = [
 "some_package.sonoftest"
]

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")
  • some_package/sonoftest.py:
import pytest

@pytest.fixture
def sono_cmdopt(request):
  return request.config.getoption("--cmdopt")
  • some_package/test_sample.py
def test_answer1(cmdopt):
  if cmdopt == "type1":
      print ("first")
  Elif cmdopt == "type2":
      print ("second")
  assert 0 # to see what was printed

def test_answer2(sono_cmdopt):
  if sono_cmdopt == "type1":
      print ("first")
  Elif sono_cmdopt == "type2":
      print ("second")
  assert 0 # to see what was printed

Vous pouvez trouver un exemple similaire ici: https://github.com/pytest-dev/pytest/issues/3039#issuecomment-464489204 And other ici https://stackoverflow.com/a/54736376/6655459

Description de la documentation officielle de pytest: https://docs.pytest.org/fr/latest/reference.html?highlight=pytest_plugins#pytest-plugins

Notez que les répertoires respectifs mentionnés dans some_package.test_sample" besoin d'avoir des fichiers __init__.py pour que les plugins soient chargés par pytest

1
rafalkasa