2014-11-21 13 views
10

Ho un file di grandi dimensioni conftest.py che desidero dividere in parti più piccole, per due motivi:suddividere un file in più parti conftest.py conftest-come piccoli

  1. Il file è molto grande (~ 1000 linee, compresa la documentazione)
  2. Alcune delle attrezzature dipendere da altri dispositivi, e non ho motivo di esporre questi altri dispositivi come parte del conftest "API" quando gli utenti cercano infissi rilevanti

Non sono a conoscenza di alcun meccanismo fornito da pytest per risolvere i file conftest in mul posizioni tiple all'interno della stessa cartella, così riuscii uno, qui di seguito:

import sys 
import os 


sys.path.append(os.path.dirname(__file__)) 


from _conftest_private_part_1 import * 
from _conftest_private_part_2 import * 
from _conftest_private_part_3 import * 


@pytest.fixture 
def a_fixture_that_is_part_of_the_public_conftest_api(): 
    pass 

Questo funziona per le mie esigenze, ma mi chiedo se c'è un modo migliore.

risposta

12

Si può mettere la tua roba in altri moduli e fare riferimento a loro utilizzando una variabile pytest_plugins nel conftest.py:

pytest_plugins = ['module1', 'module2'] 

Questo funzionerà anche se il conftest.py ha hooks su di loro.

+0

Questo è molto elegante. Grazie! – alkalinity

3

Non dovresti avere bisogno di magie di fantasia per questo. py.test aggiunge automaticamente il percorso del file di test corrente a sys.path, così come a tutti i percorsi principali fino alla directory a cui è stato indirizzato.

Per questo motivo, non è nemmeno necessario inserire il codice condiviso in un conftest.py. Si può semplicemente mettere in semplici moduli o pacchetti e quindi importarlo (se si desidera condividere i dispositivi, questi devono essere in un conftest.py).

Inoltre, c'è questa nota su importazione da conftest.py nel documentation:

Se si dispone di file conftest.py che non risiedono in una directory pacchetto python (cioè quella che contiene un __init__.py) allora “ import conftest " può essere ambiguo perché potrebbero esserci altri file conftest.py come su PYTHONPATH o sys.path. Pertanto, per i progetti è buona norma mettere conftest.py nell'ambito di un pacchetto o non importare mai uno da un file conftest.py.

+1

Avrei voluto essere in grado di utilizzare gli apparecchi senza che fossero nel file "main" conftest.py. Sono contento di sapere sul percorso però. – alkalinity

0

Questo funziona per me e sembra più facile/più chiaro:

test di primo livello/conftest.py (esempio di ri-utilizzabile di debug stampa requests.Response):

import pytest 
import requests 
from requests_toolbelt.utils import dump 


@pytest.fixture(scope="session") 
def print_response(response: requests.Response): 
    data = dump.dump_all(response) 
    print("========================") 
    print(data.decode('utf-8')) 
    print("========================") 

    print("response.url = {}".format(response.url)) 
    print("response.request = {}".format(response.request)) 
    print("response.status_code = {}".format(response.status_code)) 
    print("response.headers['content-type'] = {}".format(response.headers['content-type'])) 
    print("response.encoding = {}".format(response.encoding)) 
    try: 
     print("response.json = {}".format(response.json())) 
    except Exception: 
     print("response.text = {}".format(response.text)) 
    print("response.end") 

Dal livello più basso conftest importare il livello di codice conftest più elevato - ad esempio, i test/package1/conftest.py:

from tests.conftest import * 

Poi, nei test di livello più basso all'interno di test/package1/test_ *.py, è sufficiente importare tramite:

from tests.package1 import conftest 

E allora si ha la configtests uniti da un conftest disponibili. Ripeti questo schema per gli altri file conftest.py dettagliati/modulari di livello inferiore nella gerarchia dei test.

Problemi correlati