Struktur direktori yang sangat umum bahkan untuk modul Python sederhana tampaknya memisahkan tes unit ke test
direktori mereka sendiri :
new_project/
antigravity/
antigravity.py
test/
test_antigravity.py
setup.py
etc.
misalnya melihat proyek Python ini howto .
Pertanyaan saya sederhana. Apa cara biasa menjalankan tes? Saya menduga ini jelas untuk semua orang kecuali saya, tetapi Anda tidak bisa hanya menjalankan python test_antigravity.py
dari direktori tes karena import antigravity
akan gagal karena modul tidak ada di jalur.
Saya tahu saya bisa memodifikasi PYTHONPATH dan trik terkait jalur pencarian lainnya, tapi saya tidak percaya itu cara paling sederhana - tidak apa-apa jika Anda adalah pengembang tetapi tidak realistis untuk mengharapkan pengguna Anda untuk menggunakan jika mereka hanya ingin memeriksa tes lewat.
Alternatif lain adalah hanya menyalin file uji ke direktori lain, tetapi tampaknya agak bodoh dan melewatkan titik memiliki mereka di direktori terpisah untuk memulai.
Jadi, jika Anda baru saja mengunduh sumber ke proyek baru saya, bagaimana Anda menjalankan tes unit? Saya lebih suka jawaban yang akan membuat saya mengatakan kepada pengguna saya: "Untuk menjalankan tes unit lakukan X."
sumber
unittest
antarmuka baris perintah seperti yang dijelaskan dalam jawaban saya di bawah ini sehingga Anda tidak perlu menambahkan direktori ke jalan.Jawaban:
Solusi terbaik menurut saya adalah dengan menggunakan
unittest
antarmuka baris perintah yang akan menambahkan direktori kesys.path
sehingga Anda tidak perlu (dilakukan diTestLoader
kelas).Misalnya untuk struktur direktori seperti ini:
Anda bisa menjalankan:
Untuk struktur direktori seperti milik Anda:
Dan dalam modul tes di dalam
test
paket, Anda dapat mengimporantigravity
paket dan modul-modulnya seperti biasa:Menjalankan modul uji tunggal:
Untuk menjalankan modul uji tunggal, dalam hal ini
test_antigravity.py
:Referensi saja modul tes dengan cara yang sama Anda mengimpornya.
Menjalankan uji kasus tunggal atau metode uji:
Anda juga dapat menjalankan
TestCase
metode pengujian tunggal atau tunggal:Menjalankan semua tes:
Anda juga dapat menggunakan penemuan tes yang akan menemukan dan menjalankan semua tes untuk Anda, mereka harus modul atau paket bernama
test*.py
(dapat diubah dengan-p, --pattern
bendera):Ini akan menjalankan semua
test*.py
modul di dalamtest
paket.sumber
python -m unittest discover
akan menemukan dan menjalankan tes ditest
direktori jika diberi namatest*.py
. Jika Anda menamai subdirektoritests
, gunakanpython -m unittest discover -s tests
, dan jika Anda menamai file ujiantigravity_test.py
, gunakanpython -m unittest discover -s tests -p '*test.py'
Nama file dapat menggunakan garis bawah tetapi tidak garis putus-putus.ImportError: No module named 'test.test_antigravity'
karena konflik dengan sub-modul tes dari perpustakaan yang belum dikirim. Mungkin seorang ahli dapat mengkonfirmasi dan mengubah jawaban nama sub-direktori menjadi misalnya, 'tes' (jamak).test_antigravity.py
masih melempar kesalahan impor untuk keduanyaimport antigravity
danfrom antigravity import antigravity
juga. Saya memiliki kedua__init_.py
file dan saya meneleponpython3 -m unittest discover
darinew project
direktori. Apa lagi yang bisa salah?test/__init__.py
sangat penting di sini, bahkan jika kosongtest
itu spesial ... tetapi hanya sebagai catatan, tidak. : Ppython -m unittest discover
bekerja dengan file ujitests/
jugatest/
.Solusi paling sederhana untuk pengguna Anda adalah menyediakan skrip yang dapat dieksekusi (
runtests.py
atau semacamnya) yang mem-bootstrap lingkungan pengujian yang diperlukan, termasuk, jika perlu, menambahkan direktori proyek root Anda untuksys.path
sementara. Ini tidak mengharuskan pengguna untuk mengatur variabel lingkungan, sesuatu seperti ini berfungsi dengan baik dalam skrip bootstrap:Maka instruksi Anda kepada pengguna Anda dapat sesederhana "
python runtests.py
".Tentu saja, jika jalur yang Anda butuhkan benar-benar ada
os.path.dirname(__file__)
, maka Anda tidak perlu menambahkannyasys.path
sama sekali; Python selalu menempatkan direktori skrip yang saat ini berjalan di awalsys.path
, jadi tergantung pada struktur direktori Anda, hanya menempatkan Andaruntests.py
di tempat yang tepat mungkin semua yang diperlukan.Juga, modul unittest di Python 2.7+ (yang di-backport sebagai unittest2 untuk Python 2.6 dan yang lebih lama) sekarang memiliki built-in penemuan tes , jadi hidung tidak lagi diperlukan jika Anda ingin penemuan tes otomatis: instruksi pengguna Anda dapat sesederhana
python -m unittest discover
.sumber
python -m pdb tests\test_antigravity.py
. Di dalam pdb, saya mengeksekusisys.path.insert(0, "antigravity")
yang memungkinkan pernyataan impor untuk diselesaikan seolah-olah saya menjalankan modul.Saya biasanya membuat skrip "jalankan pengujian" di direktori proyek (yang umum untuk direktori sumber dan
test
) yang memuat suite "Semua Tes" saya. Ini biasanya kode boilerplate, jadi saya bisa menggunakannya kembali dari proyek ke proyek.run_tests.py:
test / all_tests.py (dari Bagaimana cara menjalankan semua tes unit Python dalam direktori? )
Dengan pengaturan ini, Anda memang bisa hanya
include antigravity
di modul tes Anda. Kelemahannya adalah Anda akan memerlukan lebih banyak kode dukungan untuk menjalankan tes tertentu ... Saya hanya menjalankannya setiap waktu.sumber
run tests
skrip di direktori proyek dan menemukan banyak bersih cara untuk melakukannya. Sangat dianjurkan.Dari artikel yang Anda tautkan ke:
Mungkin Anda harus melihat hidung seperti yang disarankan?
sumber
Saya memiliki masalah yang sama, dengan folder unit test terpisah. Dari saran yang disebutkan, saya menambahkan jalur sumber absolut ke
sys.path
.Manfaat dari solusi berikut adalah, bahwa seseorang dapat menjalankan file
test/test_yourmodule.py
tanpa mengubah pada awalnya menjadi direktori uji:sumber
jika Anda menjalankan "python setup.py develop" maka paket akan berada di jalur. Tetapi Anda mungkin tidak ingin melakukan itu karena Anda dapat menginfeksi instalasi python sistem Anda, itulah sebabnya alat seperti virtualenv dan buildout ada.
sumber
Solusi / Contoh untuk modul unittest Python
Diberikan struktur proyek berikut:
Anda dapat menjalankan proyek Anda dari direktori root dengan
python project_name
, yang memanggilProjectName/project_name/__main__.py
.Untuk menjalankan tes Anda dengan
python test
, berjalan secara efektifProjectName/test/__main__.py
, Anda perlu melakukan hal berikut:1) Ubah
test/models
direktori Anda menjadi sebuah paket dengan menambahkan__init__.py
file. Ini membuat kasus uji dalam sub direktori dapat diakses daritest
direktori induk .2) Ubah jalur sistem Anda
test/__main__.py
untuk memasukkanproject_name
direktori.Sekarang Anda dapat mengimpor hal-hal dari
project_name
tes Anda dengan sukses .sumber
Gunakan
setup.py develop
untuk membuat direktori kerja Anda menjadi bagian dari lingkungan Python yang terinstal, kemudian jalankan tes.sumber
invalid command 'develop'
dan opsi ini tidak disebutkan jika saya memintasetup.py --help-commands
. Apakah perlu ada sesuatu dalamsetup.py
dirinya sendiri untuk ini berfungsi?import setuptools
dari sayasetup.py
berkas. Tapi saya kira itu tidak menunjukkan bahwa ini tidak akan berfungsi setiap saat untuk modul orang lain.pip install -e .
Ini juga menambahkan paket ke lingkungan Python tanpa menyalin sumbernya, memungkinkan Anda untuk terus mengeditnya di tempatnya.pip install -e .
adalah hal yang sama persispython setup.py develop
, hanya monkeypatches Andasetup.py
untuk menggunakan setuptools bahkan jika itu tidak benar-benar, jadi itu berfungsi baik.Jika Anda menggunakan Kode VS dan tes Anda berada pada tingkat yang sama dengan proyek Anda maka menjalankan dan men-debug kode Anda tidak akan berhasil. Apa yang dapat Anda lakukan adalah mengubah file launch.json Anda:
Kuncinya di sini adalah envFile
Di root proyek Anda, tambahkan file .env
Di dalam file .env Anda tambahkan jalur ke root proyek Anda. Ini sementara akan ditambahkan
jalur ke proyek Anda dan Anda akan dapat menggunakan tes unit debug dari VS Code
sumber
Saya perhatikan bahwa jika Anda menjalankan antarmuka baris perintah yang paling bebas dari direktori "src" Anda, maka impor berfungsi dengan benar tanpa modifikasi.
Jika Anda ingin meletakkannya dalam file batch di direktori proyek Anda, Anda bisa melakukan ini:
sumber
Saya memiliki masalah yang sama untuk waktu yang lama. Apa yang baru-baru ini saya pilih adalah struktur direktori berikut:
dan dalam
__init__.py
skrip folder tes, saya menulis yang berikut ini:Super penting untuk berbagi proyek adalah Makefile, karena itu memaksa menjalankan skrip dengan benar. Ini adalah perintah yang saya masukkan ke Makefile:
Makefile penting bukan hanya karena perintah itu berjalan tetapi juga karena dari mana ia menjalankannya . Jika Anda akan melakukan cd dalam tes dan melakukannya
python -m unittest discover .
, itu tidak akan berhasil karena skrip init di unit_tests memanggil os.getcwd (), yang kemudian akan menunjuk ke jalur absolut yang salah (yang akan ditambahkan ke sys.path dan Anda akan hilang folder sumber Anda). Script akan berjalan karena temukan menemukan semua tes, tetapi mereka tidak akan berjalan dengan baik. Jadi Makefile ada di sana untuk menghindari harus mengingat masalah ini.Saya sangat suka pendekatan ini karena saya tidak harus menyentuh folder src saya, unit test saya atau variabel lingkungan saya dan semuanya berjalan dengan lancar.
Beritahu saya jika kalian menyukainya.
Semoga itu bisa membantu,
sumber
Berikut ini adalah struktur proyek saya:
Saya merasa lebih baik mengimpor metode setUp ():
sumber
Saya menggunakan Python 3.6.2
Untuk menginstal pytest :
sudo pip install pytest
Saya tidak menetapkan variabel jalur apa pun dan impor saya tidak gagal dengan struktur proyek "pengujian" yang sama.
Saya berkomentar tentang hal ini:
if __name__ == '__main__'
seperti ini:test_antigravity.py
sumber
Dimungkinkan untuk menggunakan pembungkus yang menjalankan tes terpilih atau semua.
Contohnya:
atau untuk menjalankan semua tes secara rekursif gunakan globbing (
tests/**/*.py
) (aktifkan olehshopt -s globstar
).Wrapper pada dasarnya dapat digunakan
argparse
untuk mengurai argumen seperti:Kemudian muat semua tes:
kemudian tambahkan ke dalam test suite Anda (menggunakan
inspect
):dan jalankan:
Lihat contoh ini untuk detail lebih lanjut.
Lihat juga: Bagaimana menjalankan semua tes unit Python dalam direktori?
sumber
Python 3+
Menambahkan ke @Pierre
Menggunakan
unittest
struktur direktori seperti ini:Untuk menjalankan modul tes
test_antigravity.py
:Atau satu
TestCase
Wajib jangan lupa
__init__.py
bahkan jika kosong tidak akan berfungsi.sumber
Anda tidak dapat mengimpor dari direktori induk tanpa beberapa voodoo. Inilah cara lain yang bekerja dengan setidaknya Python 3.6.
Pertama, miliki file test / context.py dengan konten berikut:
Kemudian impor berikut dalam file test / test_antigravity.py:
Perhatikan bahwa alasan untuk klausa coba-kecuali ini adalah itu
Dengan tipu daya ini mereka berdua bekerja.
Sekarang Anda dapat menjalankan semua file uji dalam direktori tes dengan:
atau jalankan file tes individual dengan:
Oke, ini tidak jauh lebih cantik daripada memiliki konten context.py di dalam test_antigravity.py, tapi mungkin sedikit. Saran diterima.
sumber
Jika Anda memiliki banyak direktori di direktori pengujian Anda, maka Anda harus menambahkan
__init__.py
file ke setiap direktori .Kemudian untuk menjalankan setiap tes sekaligus, jalankan:
Sumber:
python -m unittest -h
sumber
Skrip BASH ini akan mengeksekusi direktori tes python unittest dari mana saja dalam sistem file, tidak peduli apa direktori yang Anda gunakan.
Ini berguna ketika tetap berada di direktori kerja
./src
atau./example
dan Anda memerlukan tes unit cepat:Tidak perlu
test/__init__.py
file membebani paket Anda / memori-overhead selama produksi.sumber
Dengan cara ini Anda dapat menjalankan skrip pengujian dari mana pun Anda inginkan tanpa mengacaukan variabel sistem dari baris perintah.
Ini menambahkan folder proyek utama ke jalur python, dengan lokasi ditemukan relatif terhadap skrip itu sendiri, bukan relatif terhadap direktori kerja saat ini.
Tambahkan itu ke atas semua skrip pengujian Anda. Itu akan menambahkan folder proyek utama ke jalur sistem, sehingga setiap modul impor yang berfungsi dari sana sekarang akan berfungsi. Dan tidak masalah dari mana Anda menjalankan tes.
Anda jelas dapat mengubah file project_path_hack agar sesuai dengan lokasi folder proyek utama Anda.
sumber
Jika Anda mencari solusi khusus baris perintah:
Berdasarkan pada struktur direktori berikut (digeneralisasi dengan direktori sumber khusus):
Windows : (dalam
new_project
)Lihat pertanyaan ini jika Anda ingin menggunakan ini dalam batch untuk-loop.
Linux : (dalam
new_project
)Dengan pendekatan ini, juga dimungkinkan untuk menambahkan lebih banyak direktori ke PYTHONPATH jika perlu.
sumber
Anda harus benar-benar menggunakan alat pip.
Gunakan
pip install -e .
untuk menginstal paket Anda dalam mode pengembangan. Ini adalah praktik yang sangat baik, direkomendasikan oleh pytest (lihat dokumentasi praktik baik mereka , di mana Anda juga dapat menemukan dua tata letak proyek untuk diikuti).sumber
pytest
adalah cara yang lebih baik untuk menjalankan tes, karena output konsol Anda dapatkan, dalam warna, dengan info jejak stack dan informasi kesalahan pernyataan rinci.