Czy to prawidłowe użycie pliku conftest.py?
Tak to jest. Oprawy są potencjalnym i powszechnym zastosowaniem conftest.py
. Urządzenia, które zdefiniujesz, będą współużytkowane przez wszystkie testy w twoim zestawie testów. Jednak zdefiniowanie urządzeń w katalogu głównym conftest.py
może być bezużyteczne i spowolniłoby testowanie, gdyby takie urządzenia nie były używane we wszystkich testach.
Czy ma inne zastosowania?
Tak.
Urządzenia : Zdefiniuj urządzenia dla danych statycznych używanych przez testy. Dostęp do tych danych mają wszystkie testy w pakiecie, chyba że określono inaczej. Mogą to być zarówno dane, jak i moduły pomocnicze, które zostaną przekazane do wszystkich testów.
Ładowanie zewnętrznych wtyczek : conftest.py
służy do importowania zewnętrznych wtyczek lub modułów. Poprzez zdefiniowanie następującej zmiennej globalnej, pytest załaduje moduł i udostępni go do testu. Wtyczki to na ogół pliki zdefiniowane w projekcie lub inne moduły, które mogą być potrzebne w testach. Możesz również załadować zestaw predefiniowanych wtyczek, jak wyjaśniono tutaj .
pytest_plugins = "someapp.someplugin"
Haki : możesz określić haki, takie jak metody konfiguracji i porzucenia i wiele więcej, aby poprawić swoje testy. Zestaw dostępnych haczyków znajdziesz tutaj . Przykład:
def pytest_runtest_setup(item):
""" called before ``pytest_runtest_call(item). """
#do some stuff`
Testuj ścieżkę katalogu głównego : jest to trochę ukryta funkcja. Po zdefiniowaniu conftest.py
w ścieżce katalogu głównego będziesz pytest
rozpoznawał moduły aplikacji bez określania PYTHONPATH
. W tle py.test modyfikuje twoje sys.path
, włączając wszystkie podmoduły znalezione ze ścieżki root.
Czy mogę mieć więcej niż jeden plik conftest.py?
Tak, możesz i jest to zdecydowanie zalecane, jeśli twoja struktura testu jest nieco złożona. conftest.py
pliki mają zasięg katalogu. Dlatego tworzenie ukierunkowanych urządzeń i pomocników jest dobrą praktyką.
Kiedy chciałbym to zrobić? Przykłady będą mile widziane.
Kilka skrzynek może pasować:
Tworzenie zestawu narzędzi lub haków dla określonej grupy testów.
root / mod / conftest.py
def pytest_runtest_setup(item):
print("I am mod")
#do some stuff
test root/mod2/test.py will NOT produce "I am mod"
Ładowanie zestawu urządzeń dla niektórych testów, ale nie dla innych.
root / mod / conftest.py
@pytest.fixture()
def fixture():
return "some stuff"
root / mod2 / conftest.py
@pytest.fixture()
def fixture():
return "some other stuff"
root / mod2 / test.py
def test(fixture):
print(fixture)
Wydrukuje „jakieś inne rzeczy”.
Przesłanianie haków odziedziczonych z katalogu głównego conftest.py
.
root / mod / conftest.py
def pytest_runtest_setup(item):
print("I am mod")
#do some stuff
root / conftest.py
def pytest_runtest_setup(item):
print("I am root")
#do some stuff
Po uruchomieniu dowolnego testu w środku root/mod
drukowane jest tylko „Jestem modem”.
Możesz przeczytać więcej o conftest.py
tutaj .
EDYTOWAĆ:
Co się stanie, jeśli będę potrzebować zwykłych funkcji pomocniczych do wywołania z szeregu testów w różnych modułach - czy będą one dla mnie dostępne, jeśli umieszczę je w pliku conftest.py? Czy powinienem po prostu umieścić je w module helpers.py oraz zaimportować i użyć w moich modułach testowych?
Możesz użyć conftest.py
do zdefiniowania swoich pomocników. Powinieneś jednak przestrzegać powszechnej praktyki. Pomocników można używać jako urządzeń przynajmniej w pytest
. Na przykład w moich testach mam fałszywego pomocnika redis, który w ten sposób wstrzykuję do moich testów.
root / helper / redis / redis.py
@pytest.fixture
def mock_redis():
return MockRedis()
root / testy / stuff / conftest.py
pytest_plugin="helper.redis.redis"
root / testy / stuff / test.py
def test(mock_redis):
print(mock_redis.get('stuff'))
Będzie to moduł testowy, który możesz swobodnie importować w swoich testach. UWAGA: możesz potencjalnie nazwać redis.py
tak, conftest.py
jakby Twój moduł redis
zawierał więcej testów. Praktyka ta jest jednak odradzana z powodu niejasności.
Jeśli chcesz użyć conftest.py
, możesz po prostu umieścić pomocnika w swoim katalogu głównym conftest.py
i wstrzyknąć go w razie potrzeby.
root / testy / conftest.py
@pytest.fixture
def mock_redis():
return MockRedis()
root / testy / stuff / test.py
def test(mock_redis):
print(mock_redis.get(stuff))
Inną rzeczą, którą możesz zrobić, jest napisanie instalowalnej wtyczki. W takim przypadku pomocnik może zostać napisany w dowolnym miejscu, ale musi zdefiniować punkt wejścia do zainstalowania w twoim i innych potencjalnych ramach testowych. Zobacz to .
Jeśli nie chcesz używać urządzeń, możesz oczywiście zdefiniować prostego pomocnika i po prostu użyć zwykłego starego importu tam, gdzie jest to potrzebne.
root / testy / helper / redis.py
class MockRedis():
# stuff
root / testy / stuff / test.py
from helper.redis import MockRedis
def test():
print(MockRedis().get(stuff))
Jednak tutaj mogą występować problemy ze ścieżką, ponieważ moduł nie znajduje się w folderze podrzędnym testu. Powinieneś być w stanie pokonać to (nie przetestowane), dodając __init__.py
do swojego pomocnika
root / testy / pomocnik / __ init__.py
from .redis import MockRedis
Lub po prostu dodając moduł pomocnika do swojego PYTHONPATH
.
It seems great. However, I feel the documentation could be better.