Apakah ini penggunaan conftest.py yang benar?
Ya itu. Perlengkapan adalah potensi dan penggunaan umum conftest.py
. Perlengkapan yang akan Anda tetapkan akan dibagikan di antara semua tes di ruang tes Anda. Namun, mendefinisikan fixture di root conftest.py
mungkin tidak berguna dan itu akan memperlambat pengujian jika fixture tersebut tidak digunakan oleh semua tes.
Apakah ada kegunaan lain?
Ya itu.
Jadwal : Menentukan perlengkapan untuk data statis yang digunakan oleh tes. Data ini dapat diakses oleh semua tes di suite kecuali ditentukan lain. Ini bisa berupa data serta bantuan modul yang akan diteruskan ke semua tes.
Pemuatan plugin eksternal : conftest.py
digunakan untuk mengimpor plugin atau modul eksternal. Dengan mendefinisikan variabel global berikut, pytest akan memuat modul dan membuatnya tersedia untuk pengujian. Plugin umumnya file yang ditentukan dalam proyek Anda atau modul lain yang mungkin diperlukan dalam pengujian Anda. Anda juga dapat memuat satu set plugin yang telah ditentukan seperti dijelaskan di sini .
pytest_plugins = "someapp.someplugin"
Kait : Anda dapat menentukan kait seperti metode pengaturan dan teardown dan banyak lagi untuk meningkatkan tes Anda. Untuk satu set kait yang tersedia, baca di sini . Contoh:
def pytest_runtest_setup(item):
""" called before ``pytest_runtest_call(item). """
#do some stuff`
Test root path : Ini adalah fitur tersembunyi. Dengan mendefinisikan conftest.py
path root Anda, Anda akan pytest
mengenali modul aplikasi Anda tanpa menentukan PYTHONPATH
. Di latar belakang, py.test memodifikasi Anda sys.path
dengan memasukkan semua submodul yang ditemukan dari path root.
Bisakah saya memiliki lebih dari satu file conftest.py?
Ya, Anda bisa dan sangat disarankan jika struktur pengujian Anda agak rumit. conftest.py
file memiliki cakupan direktori. Oleh karena itu, menciptakan perlengkapan dan penolong yang ditargetkan adalah praktik yang baik.
Kapan saya ingin melakukan itu? Contoh akan dihargai.
Beberapa kasus dapat ditampung:
Membuat seperangkat alat atau pengait untuk kelompok pengujian tertentu.
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"
Memuat satu set perlengkapan untuk beberapa tes tetapi tidak untuk yang lain.
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)
Akan mencetak "beberapa hal lain".
Override kait diwarisi dari akar 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
Dengan menjalankan tes apa pun di dalam root/mod
, hanya "Saya mod" yang dicetak.
Anda dapat membaca lebih lanjut tentang di conftest.py
sini .
EDIT:
Bagaimana jika saya membutuhkan fungsi helper lama yang dipanggil dari sejumlah tes dalam modul yang berbeda - akankah mereka tersedia bagi saya jika saya meletakkannya di conftest.py? Atau haruskah saya memasukkannya ke dalam modul helpers.py dan mengimpor dan menggunakannya dalam modul pengujian saya?
Anda dapat menggunakan conftest.py
untuk menentukan pembantu Anda. Namun, Anda harus mengikuti praktik umum. Pembantu dapat digunakan sebagai perlengkapan setidaknya di pytest
. Sebagai contoh dalam tes saya, saya memiliki pembantu redis mock yang saya menyuntikkan ke tes saya dengan cara ini.
root / helper / redis / redis.py
@pytest.fixture
def mock_redis():
return MockRedis()
root / test / stuff / conftest.py
pytest_plugin="helper.redis.redis"
root / test / stuff / test.py
def test(mock_redis):
print(mock_redis.get('stuff'))
Ini akan menjadi modul tes yang dapat Anda impor secara bebas dalam tes Anda. CATATAN bahwa Anda berpotensi memberi nama redis.py
seolah- conftest.py
olah modul Anda redis
berisi lebih banyak tes. Namun, praktik itu tidak dianjurkan karena ambiguitas.
Jika Anda ingin menggunakannya conftest.py
, Anda bisa memasukkan pembantu itu ke root conftest.py
dan menyuntikkannya saat diperlukan.
root / tes / conftest.py
@pytest.fixture
def mock_redis():
return MockRedis()
root / test / stuff / test.py
def test(mock_redis):
print(mock_redis.get(stuff))
Hal lain yang dapat Anda lakukan adalah menulis plugin yang dapat diinstal. Dalam hal ini, pembantu Anda dapat ditulis di mana saja tetapi perlu menentukan titik masuk untuk dipasang di kerangka kerja Anda dan potensi pengujian lainnya. Lihat ini .
Jika Anda tidak ingin menggunakan perlengkapan, tentu saja Anda dapat menentukan pembantu sederhana dan cukup menggunakan impor lama polos di mana pun itu diperlukan.
root / tes / helper / redis.py
class MockRedis():
# stuff
root / test / stuff / test.py
from helper.redis import MockRedis
def test():
print(MockRedis().get(stuff))
Namun, di sini Anda mungkin memiliki masalah dengan jalur karena modul tidak ada dalam folder anak tes. Anda harus dapat mengatasi ini (tidak diuji) dengan menambahkan sebuah __init__.py
ke pembantu Anda
root / test / helper / __ init__.py
from .redis import MockRedis
Atau cukup menambahkan modul pembantu ke PYTHONPATH
.
It seems great. However, I feel the documentation could be better.