Bu doğru conftest.py kullanımı mı?
Evet öyle. Armatürler potansiyel ve ortak bir kullanımdır conftest.py
. Tanımlayacağınız fikstürler test takımınızdaki tüm testler arasında paylaşılacaktır. Bununla birlikte, kökteki demirbaşları tanımlamak conftest.py
işe yaramaz olabilir ve bu demirbaşlar tüm testler tarafından kullanılmazsa testi yavaşlatır.
Başka kullanımları var mı?
Evet öyle.
Armatürler : Testler tarafından kullanılan statik veriler için armatürleri tanımlayın. Bu verilere, aksi belirtilmedikçe paketteki tüm testlerden erişilebilir. Bu, tüm testlere aktarılacak olan modüllerin yanı sıra veriler olabilir.
Harici eklenti yükleme : conftest.py
harici eklentileri veya modülleri içe aktarmak için kullanılır. Aşağıdaki global değişkeni tanımlayarak, pytest modülü yükleyecek ve test için kullanılabilir hale getirecektir. Eklentiler genellikle projenizde tanımlanan veya testlerinizde ihtiyaç duyulabilecek diğer modüllerdir. Ayrıca burada açıklandığı gibi bir dizi önceden tanımlanmış eklenti yükleyebilirsiniz .
pytest_plugins = "someapp.someplugin"
Kancalar : Testlerinizi geliştirmek için kurulum ve sökme yöntemleri ve çok daha fazlası gibi kancaları belirleyebilirsiniz. Mevcut kanca seti için burayı okuyun . Misal:
def pytest_runtest_setup(item):
""" called before ``pytest_runtest_call(item). """
#do some stuff`
Test kökü yolu : Bu biraz gizli bir özelliktir. conftest.py
Kök yolunuzda tanımlayarak pytest
, uygulama modüllerinizi belirtmeden tanımanız gerekir PYTHONPATH
. Arka planda, py.test sys.path
kök yolunda bulunan tüm alt modülleri ekleyerek değiştirir .
Birden fazla conftest.py dosyasına sahip olabilir miyim?
Evet yapabilirsiniz ve test yapınızın biraz karmaşık olması şiddetle önerilir. conftest.py
dosyalarının dizin kapsamı vardır. Bu nedenle, hedeflenmiş demirbaşlar ve yardımcılar oluşturmak iyi bir uygulamadır.
Bunu ne zaman yapmak isterdim? Örnekler takdir edilecektir.
Birkaç vaka sığabilir:
Belirli bir test grubu için bir takım alet veya kancalar oluşturma.
Kök / 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"
Bazı testler için bir dizi fikstür yüklemek , ancak diğerleri için değil.
Kök / mod / conftest.py
@pytest.fixture()
def fixture():
return "some stuff"
Kök / mod2 / conftest.py
@pytest.fixture()
def fixture():
return "some other stuff"
Kök / mod2 / test.py
def test(fixture):
print(fixture)
"Başka şeyler" yazdıracak.
Kökten miras alınan geçersiz kılma kancaları conftest.py
.
Kök / mod / conftest.py
def pytest_runtest_setup(item):
print("I am mod")
#do some stuff
Kök / conftest.py
def pytest_runtest_setup(item):
print("I am root")
#do some stuff
İçeride herhangi bir test çalıştırıldığında root/mod
, sadece "Ben modum" yazdırılır.
conftest.py
Burada daha fazla bilgi edinebilirsiniz .
DÜZENLE:
Farklı modüllerdeki bir dizi testten düz eski yardımcı işlevlere çağrılacak olursam ne olur? Onları bir conftest.py'ye koyarsam bunlar kullanılabilir mi? Yoksa bunları bir helpers.py modülüne koymalı ve test modüllerime aktarmalı ve kullanmalı mıyım?
conftest.py
Yardımcılarınızı tanımlamak için kullanabilirsiniz . Ancak, ortak uygulamayı takip etmelisiniz. Yardımcılar en az içinde fikstür olarak kullanılabilir pytest
. Örneğin testlerimde, testlerime bu şekilde enjekte ettiğim sahte bir redis yardımcısı var.
Kök / yardımcı / Redis / redis.py
@pytest.fixture
def mock_redis():
return MockRedis()
Kök / testler / malzeme / conftest.py
pytest_plugin="helper.redis.redis"
Kök / testler / malzeme / test.py
def test(mock_redis):
print(mock_redis.get('stuff'))
Bu, testlerinize serbestçe aktarabileceğiniz bir test modülü olacaktır. NOT potansiyel isim verebilecek redis.py
şekilde conftest.py
sizin modül eğer redis
daha fazla test içerir. Ancak, bu uygulama belirsizlik nedeniyle önerilmez.
Kullanmak istiyorsanız conftest.py
, o yardımcıyı kökünüze koyabilir conftest.py
ve gerektiğinde enjekte edebilirsiniz.
Kök / test / conftest.py
@pytest.fixture
def mock_redis():
return MockRedis()
Kök / testler / malzeme / test.py
def test(mock_redis):
print(mock_redis.get(stuff))
Yapabileceğiniz başka bir şey, yüklenebilir bir eklenti yazmaktır. Bu durumda yardımcınız herhangi bir yere yazılabilir ancak sizin ve diğer potansiyel test çerçevelerinize kurulacak bir giriş noktası tanımlaması gerekir. Bkz bu .
Fikstür kullanmak istemiyorsanız, elbette basit bir yardımcı tanımlayabilir ve sadece ihtiyaç duyduğunuz her yerde eski eski içe aktarmayı kullanabilirsiniz.
Kök / test / yardımcı / redis.py
class MockRedis():
# stuff
Kök / testler / malzeme / test.py
from helper.redis import MockRedis
def test():
print(MockRedis().get(stuff))
Ancak, modül testin alt klasöründe olmadığından burada yolla ilgili sorunlarınız olabilir. __init__.py
Yardımcınıza bir ekleyerek bunun (test edilmemiş) üstesinden gelebilmelisiniz
Kök / test / yardımcı / __ init__.py
from .redis import MockRedis
Veya sadece yardımcı modülü bilgisayarınıza ekleyerek PYTHONPATH
.
It seems great. However, I feel the documentation could be better.