2014-11-21 7 views
10

Mam duży plik conftest.py że pragnę podzielić na mniejsze części, z dwóch powodów:Dzielenie plików conftest.py na kilka mniejszych części conftest podobny

  1. pliku jest bardzo duża (~ 1000 linii, łącznie z dokumentacją)
  2. Niektóre z lamp zależy od innych urządzeń, a nie mam żadnego powodu, by narażać tych innych urządzeń w ramach conftest „API”, gdy użytkownicy szukają odpowiednich opraw

Nie jestem świadomy żadnego mechanizmu dostarczonego przez pytest do rozwiązywania plików conftest w mul tiple miejscach w tym samym folderze, więc wymyślił jeden poniżej:

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 

Działa to dla moich potrzeb, ale zastanawiam się, czy istnieje lepszy sposób.

Odpowiedz

12

można umieścić swoje rzeczy w innych modułach i odniesienie ich użyciu zmiennej pytest_plugins w swojej conftest.py:

pytest_plugins = ['module1', 'module2'] 

ta będzie również działać, jeśli conftest.py ma hooks na nich.

+0

To jest bardzo eleganckie. Dziękuję Ci! – alkalinity

3

Nie powinieneś potrzebować żadnej ozdobnej magii. py.test automatycznie dodaje ścieżkę bieżącego pliku testowego do sys.path, a także wszystkich ścieżek nadrzędnych do katalogu, na który był kierowany.

Z tego powodu nie trzeba nawet umieszczać tego wspólnego kodu w postaci conftest.py. Możesz po prostu umieścić w zwykłych modułach lub pakietach, a następnie zaimportować (jeśli chcesz udostępnić urządzenia, muszą one być w conftest.py).

Ponadto, jest to uwaga o imporcie z conftest.py w documentation:

Jeśli masz conftest.py pliki, które nie znajdują się w katalogu pakietu python (czyli jeden zawierający __init__.py), a następnie „ import conftest "może być niejednoznaczny, ponieważ mogą być inne pliki conftest.py jako również na Twoim PYTHONPATH lub sys.path. Dobrą praktyką w przypadku projektów jest umieszczanie conftest.py w zakresie pakietu lub nigdy nie importować niczego z pliku conftest.py.

+1

Chciałem móc korzystać z urządzeń, nie będąc w "głównym" pliku conftest.py. Cieszę się, że wiem o ścieżce. – alkalinity

0

Działa to dla mnie i wydaje się łatwiejsze/jaśniejszy:

Testy Top level/conftest.py (przykład re-użytkowej druku debugowania 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") 

Od niższym poziomie conftest importować wyższym poziomie conftest kod - np tests/package1/conftest.py:

from tests.conftest import * 

Następnie w badaniach dolnych poziomie w testach/package1/test_ *.py, po prostu zaimportuj przez:

from tests.package1 import conftest 

A potem masz połączone testy konfiguracyjne z jednego konftestu dostępnego. Powtórz ten wzorzec dla innych szczegółowych/modułowych plików conftest.py na niższym poziomie w hierarchii testów.

Powiązane problemy