Saya menggunakan easy_install untuk menginstal pytest pada mac dan mulai menulis tes untuk proyek dengan struktur file seperti:
repo/
repo/app.py
repo/settings.py
repo/models.py
repo/tests/
repo/tests/test_app.py
dijalankan py.test
saat berada di direktori repo, semuanya berjalan seperti yang Anda harapkan
tetapi ketika saya mencoba hal yang sama di linux atau windows (keduanya memiliki pytest 2.2.3 pada mereka) itu menggonggong setiap kali hits impor pertama dari sesuatu dari jalur aplikasi saya. Katakan misalnyafrom app import some_def_in_app
Apakah saya perlu mengedit PATH saya untuk menjalankan py.test pada sistem ini? Adakah yang pernah mengalami ini?
python
unit-testing
pytest
MattoTodd
sumber
sumber
Jawaban:
Ya, folder sumber tidak ada di jalur Python jika Anda
cd
ke direktori tes.Anda memiliki 2 pilihan:
Tambahkan path secara manual ke file tes, sesuatu seperti ini:
Jalankan tes dengan env var
PYTHONPATH=../
.sumber
cd
ke direktori? saya berlaripy.test
dari root saya. kecuali saya salah dan maksud Anda sebagai pytest berjalan melalui folder sayacd
masalah, tidakkah saya akan memukulnya juga di mac?Saya tidak yakin mengapa py.test tidak menambahkan direktori saat ini di PYTHONPATH itu sendiri, tapi ini solusinya (akan dieksekusi dari root repositori Anda):
Ini berfungsi karena Python menambahkan direktori saat ini di PYTHONPATH untuk Anda.
sumber
project/test/all-my-tests
danproject/src/app.py
dan karena perubahan itu, seseorang perlu memanggil yangapp.py
tidak langsung menggunakan__main__.py
fileproject/src
, sehingga seseorang dapat menggunakan panggilanpython -m src
. Hal-hal yang cukup berantakan sejauh yang saya tahu./home/user/dev/projectxyz/src ...
akan sangat buruk dan tidak berjalan di komputer lain dalam banyak kasus. Saya pikir apa yang saya maksudkan adalah, bahwa saya harus selalu menulis seluruh proyek root ke lintasan modul bahkan jika modul ada di folder yang sama dengan file yang dijalankan. Saya tidak tahu bahwa ini dianggap praktik terbaik, jadi itu sedikit informasi yang berguna, terima kasih. Saya setuju dengan sebagian besar dari pep8, meskipun masih belum sempurna.__init__.py
dalam tes, yang memecahkan masalah. Sekarang saya bisa menggunakanpytest
conftest
larutanSolusi yang paling tidak invasif adalah menambahkan file kosong bernama
conftest.py
dalamrepo/
direktori:Itu dia. Tidak perlu menulis kode khusus untuk mengatur
sys.path
atau mengingat untuk menyeretPYTHONPATH
, atau menempatkan__init__.py
ke dirs di tempat yang tidak seharusnya.Direktori proyek sesudahnya:
Penjelasan
pytest
mencariconftest
modul pada koleksi tes untuk mengumpulkan kait dan perlengkapan khusus, dan untuk mengimpor objek kustom dari mereka,pytest
menambahkan direktori indukconftest.py
kesys.path
(dalam hal inirepo
direktori).Struktur proyek lainnya
Jika Anda memiliki struktur proyek lain, tempatkan
conftest.py
direktori dir paket (yang berisi paket tetapi bukan paket itu sendiri, jadi tidak mengandung__init__.py
), misalnya:src
tata letakMeskipun pendekatan ini dapat digunakan dengan
src
tata letak (tempatconftest.py
disrc
dir):waspadalah bahwa menambahkan
src
untukPYTHONPATH
mengurangi arti dan manfaat darisrc
tata letak! Anda akan berakhir dengan menguji kode dari repositori dan bukan paket yang diinstal. Jika Anda perlu melakukannya, mungkin Anda tidak perlusrc
dir sama sekali.Ke mana harus pergi dari sini
Tentu saja,
conftest
modul bukan hanya beberapa file untuk membantu penemuan kode sumber; di situlah semua penyempurnaan spesifik proyek daripytest
kerangka kerja dan penyesuaian suite pengujian Anda terjadi.pytest
memiliki banyak informasi tentangconftest
modul yang tersebar di seluruh dokumen mereka ; mulai denganconftest.py
: plugin per-direktori lokalJuga, SO memiliki pertanyaan yang sangat baik pada
conftest
modul: Dalam py.test, apa gunanya file conftest.py?sumber
pytest
dan sangat disarankan untuk tidak melakukannya. Dengan melakukan itu, Anda menanam benih untuk kesalahan di masa depan. Buat modul lain bernamautils.py
dan tempatkan kode untuk digunakan kembali dalam tes di sana.conftest.py
bukan milik kode aplikasi dan, imo, menempatkannya di bawahsrc/
tidak benar.Saya memiliki masalah yang sama. Saya memperbaikinya dengan menambahkan
__init__.py
file kosong ketests
direktori saya .sumber
avoid “__init__.py” files in your test directories. This way your tests can run easily against an installed version of mypkg, independently from the installed package if it contains the tests or not.
SRC: pytest.org/latest/goodpractises.html__init__.py
dari direktori tes saya menyelesaikannya untuk saya.__init__.py
sub-direktori ditest/
membuat impor mutlak berfungsi untuk menjalankan tes tertentu di sub-direktori terhadap modul yang akan diinstal. Terima kasih.Jalankan
pytest
sendiri sebagai modul dengan:python -m pytest tests
sumber
python -m pytest
tanpa penjelasan selain "karena berfungsi"package/src package/tests
dantests
Anda mengimpor dari dalamnyasrc
. Eksekusi sebagai modul akan mempertimbangkan impor sebagai absolut daripada relatif terhadap lokasi eksekusi.Anda dapat menjalankan dengan PYTHONPATH di root proyek
Atau gunakan pip instal sebagai impor yang dapat diedit
sumber
test
direktori tidak dalamsrc
struktur direktori dan panggilan dari direktori yang berisi keduanyatest
dansrc
direktori.Saya membuat ini sebagai jawaban untuk pertanyaan Anda dan kebingungan saya sendiri. Saya harap ini membantu. Perhatikan PYTHONPATH di baris perintah py.test dan di tox.ini.
https://github.com/jeffmacdonald/pytest_test
Khususnya: Anda harus memberi tahu py.test dan tahu di mana menemukan modul yang Anda sertakan.
Dengan py.test Anda bisa melakukan ini:
Dan dengan racun, tambahkan ini ke tox.ini Anda:
sumber
Saya memiliki masalah yang sama di Labu.
Ketika saya menambahkan:
ke folder tes, masalah hilang :)
Mungkin aplikasi tidak dapat mengenali tes folder sebagai modul
sumber
Saya memperbaikinya dengan menghapus tingkat atas
__init__.py
di folder induk sumber saya.sumber
Saya mulai mendapatkan
ConftestImportFailure: ImportError('No module named ...
kesalahan aneh ketika saya secara tidak sengaja menambahkan__init__.py
file ke direktori src saya (yang seharusnya tidak menjadi paket Python, hanya sebuah wadah dari semua sumber).sumber
Saya mendapatkan kesalahan ini karena sesuatu yang lebih sederhana (Anda bahkan bisa mengatakan sepele). Saya belum menginstal
pytest
modul. Jadi sederhanaapt install python-pytest
memperbaikinya untukku.'pytest' akan terdaftar di setup.py sebagai dependensi pengujian. Pastikan Anda menginstal persyaratan pengujian juga.
sumber
Saya punya masalah serupa.
pytest
tidak mengenali modul yang dipasang di lingkungan tempat saya bekerja.Saya mengatasinya dengan juga menginstal
pytest
ke lingkungan yang sama.sumber
Bagi saya masalahnya
tests.py
dihasilkan oleh Django bersama dengantests
direktori. Menghapustests.py
masalah diselesaikan.sumber
Saya mendapatkan kesalahan ini karena saya menggunakan impor relatif yang salah. Dalam contoh OP, test_app.py harus mengimpor fungsi menggunakan mis
Namun secara bebas file __init__.py tersebar di sekitar struktur file, ini tidak berfungsi dan membuat jenis ImportError terlihat kecuali file dan file uji berada di direktori yang sama.
Berikut ini contoh apa yang harus saya lakukan dengan salah satu proyek saya:
Inilah struktur proyek saya:
Untuk dapat mengakses activity_indicator.py dari test_activity_indicator.py saya perlu:
sumber
Sangat sering tes terputus karena modul tidak dapat diimpor, Setelah penelitian, saya menemukan bahwa sistem melihat file di tempat yang salah dan kita dapat dengan mudah mengatasi masalah dengan menyalin file, berisi modul, di folder yang sama seperti yang dinyatakan, agar dapat diimpor dengan benar. Usulan solusi lain adalah mengubah deklarasi untuk impor dan menunjukkan MutPy jalur yang benar dari unit. Namun, karena fakta bahwa banyak unit dapat memiliki ketergantungan ini, artinya kita perlu melakukan perubahan juga dalam deklarasi mereka, kami lebih memilih untuk hanya memindahkan unit ke folder.
sumber
Menurut posting di Medium oleh Dirk Avery (dan didukung oleh pengalaman pribadi saya) jika Anda menggunakan lingkungan virtual untuk proyek Anda, maka Anda tidak dapat menggunakan instalasi pytest di seluruh sistem; Anda harus menginstalnya di lingkungan virtual dan menggunakannya.
Secara khusus, jika Anda menginstalnya di kedua tempat maka hanya menjalankan
pytest
perintah tidak akan berhasil karena akan menggunakan instalasi sistem. Seperti yang dijelaskan oleh jawaban lain, satu solusi sederhana adalah menjalankanpython -m pytest
alih-alihpytest
; ini berfungsi karena menggunakan versi pytest lingkungan. Atau, Anda cukup menghapus instalan versi sistem dari pytest; setelah mengaktifkan kembali lingkungan virtual,pytest
perintah harus bekerja.sumber
python -m pytest tests/
.Saya memiliki masalah yang sama ketika mengikuti tutorial Flask dan saya menemukan jawabannya di Pytest resmi docs Ini pergeseran sedikit dari cara saya (dan saya pikir banyak orang lain) digunakan untuk melakukan hal-hal.
Anda harus membuat
setup.py
file di direktori root proyek Anda dengan setidaknya dua baris berikut:di mana PACKAGENAME adalah nama aplikasi Anda. Maka Anda harus menginstalnya dengan pip:
The
-e
flag mengatakan pip untuk intall paket di diedit atau "mengembangkan" mode. Jadi lain kali Anda menjalankannyapytest
harus menemukan aplikasi Anda dalam standarPYTHONPATH
.sumber
Solusi saya:
buat
conftest.py
file ditest
direktori yang berisi:Ini akan menambahkan folder yang menarik ke jalur python tanpa memodifikasi setiap file uji , mengatur variabel env atau mengacaukan jalur absolut / relatif.
sumber