Saya baru-baru ini menemukan pytest
. Sepertinya bagus. Namun, saya merasa dokumentasinya bisa lebih baik.
Saya mencoba memahami untuk apa conftest.py
file-file itu digunakan.
Dalam suite tes saya (saat ini kecil) saya punya satu conftest.py
file di root proyek. Saya menggunakannya untuk menentukan perlengkapan yang saya injeksi ke dalam tes saya.
Saya punya dua pertanyaan:
- Apakah ini penggunaan yang benar
conftest.py
? Apakah ada kegunaan lain? - Bisakah saya memiliki lebih dari satu
conftest.py
file? Kapan saya ingin melakukan itu? Contoh akan dihargai.
Secara lebih umum, bagaimana Anda mendefinisikan tujuan dan penggunaan conftest.py
file yang benar dalam test suite py.test?
It seems great. However, I feel the documentation could be better.
conftest.py
dan meskipun ada banyak referensi untuk melakukan hal ini atau melakukan hal itu dengan file conftest, tidak ada dalam dokumentasi yang pernah menunjukkan bahwa ketika pytest melakukan penemuan tes, semua file conftest.py ditemukan (di dalam direktori strucutre di mana penemuan tes sedang dilakukan) akan dijalankan selama fase pengumpulan tes (sebelum tes dijalankan). Harus mencari tahu sendiri melalui eksperimen.Jawaban:
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 rootconftest.py
mungkin tidak berguna dan itu akan memperlambat pengujian jika fixture tersebut tidak digunakan oleh semua tes.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:
Test root path : Ini adalah fitur tersembunyi. Dengan mendefinisikan
conftest.py
path root Anda, Anda akanpytest
mengenali modul aplikasi Anda tanpa menentukanPYTHONPATH
. Di latar belakang, py.test memodifikasi Andasys.path
dengan memasukkan semua submodul yang ditemukan dari path root.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.Beberapa kasus dapat ditampung:
Membuat seperangkat alat atau pengait untuk kelompok pengujian tertentu.
root / mod / conftest.py
Memuat satu set perlengkapan untuk beberapa tes tetapi tidak untuk yang lain.
root / mod / conftest.py
root / mod2 / conftest.py
root / mod2 / test.py
Akan mencetak "beberapa hal lain".
Override kait diwarisi dari akar
conftest.py
.root / mod / conftest.py
root / conftest.py
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:
Anda dapat menggunakan
conftest.py
untuk menentukan pembantu Anda. Namun, Anda harus mengikuti praktik umum. Pembantu dapat digunakan sebagai perlengkapan setidaknya dipytest
. Sebagai contoh dalam tes saya, saya memiliki pembantu redis mock yang saya menyuntikkan ke tes saya dengan cara ini.root / helper / redis / redis.py
root / test / stuff / conftest.py
root / test / stuff / test.py
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 Andaredis
berisi lebih banyak tes. Namun, praktik itu tidak dianjurkan karena ambiguitas.Jika Anda ingin menggunakannya
conftest.py
, Anda bisa memasukkan pembantu itu ke rootconftest.py
dan menyuntikkannya saat diperlukan.root / tes / conftest.py
root / test / stuff / test.py
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
root / test / stuff / test.py
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 Andaroot / test / helper / __ init__.py
Atau cukup menambahkan modul pembantu ke
PYTHONPATH
.sumber
test_aaaaa.py
sebenarnya mencoba untuk berjalan sebelum pengaturan fixture selesaiconftest.py
. Adakah pemikiran mengapa hal ini dapat terjadi?Dalam arti luas conftest.py adalah plugin per-direktori lokal. Di sini Anda menentukan kait dan perlengkapan khusus direktori. Dalam kasus saya memiliki direktori root yang berisi direktori tes khusus proyek. Beberapa sihir umum ditempatkan di 'root' conftest.py. Khusus proyek - dalam proyek mereka sendiri. Tidak dapat melihat sesuatu yang buruk dalam menyimpan fixture di conftest.py kecuali mereka tidak digunakan secara luas (Dalam hal ini saya lebih suka mendefinisikannya dalam file tes secara langsung)
sumber
Ya , fixture biasanya digunakan untuk mendapatkan data yang siap untuk beberapa tes.
Ya , fixture adalah fungsi yang dijalankan
pytest
sebelum, dan kadang-kadang setelah, fungsi tes yang sebenarnya. Kode dalam fixture dapat melakukan apa pun yang Anda inginkan. Misalnya, fixture dapat digunakan untuk mendapatkan set data agar tes dapat dikerjakan, atau fixture juga dapat digunakan untuk membuat sistem menjadi kondisi yang diketahui sebelum menjalankan tes.Pertama, dimungkinkan untuk menempatkan perlengkapan ke dalam file uji individual. Namun, untuk berbagi perlengkapan di antara beberapa file pengujian, Anda perlu menggunakan
conftest.py
file di suatu tempat yang terletak terpusat untuk semua tes. Jadwal dapat dibagi dengan tes apa pun. Mereka dapat dimasukkan ke dalam file tes individual jika Anda ingin fixture hanya digunakan oleh tes dalam file itu.Kedua, ya , Anda dapat memiliki
conftest.py
file lain di subdirektori dari direktori tes teratas. Jika Anda melakukannya, perlengkapan yang ditentukan dalamconftest.py
file - file tingkat rendah ini akan tersedia untuk pengujian dalam direktori dan subdirektori tersebut.Akhirnya, menempatkan fixture dalam
conftest.py
file di root tes akan membuatnya tersedia di semua file uji.sumber