Saya tidak bisa mendapatkan kerangka pengujian hidung untuk mengenali modul di bawah skrip pengujian saya dalam struktur file. Saya telah menyiapkan contoh paling sederhana yang menunjukkan masalah tersebut. Saya akan menjelaskannya di bawah.
Berikut struktur file paketnya:
./__init__.py
./foo.py
./tests
./__init__.py
./test_foo.py
foo.py mengandung:
def dumb_true():
return True
tes / test_foo.py berisi:
import foo
def test_foo():
assert foo.dumb_true()
Kedua file init .py kosong
Jika saya menjalankan nosetests -vv
di direktori utama (di mana foo.py berada), saya mendapatkan:
Failure: ImportError (No module named foo) ... ERROR
======================================================================
ERROR: Failure: ImportError (No module named foo)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/usr/lib/python/site-packages/nose-0.11.1-py2.6.egg/nose/loader.py", line 379, in loadTestsFromName
addr.filename, addr.module)
File "/usr/lib/python/site-packages/nose-0.11.1-py2.6.egg/nose/importer.py", line 39, in importFromPath
return self.importFromDir(dir_path, fqname)
File "/usr/lib/python/site-packages/nose-0.11.1-py2.6.egg/nose/importer.py", line 86, in importFromDir
mod = load_module(part_fqname, fh, filename, desc)
File "/home/user/nose_testing/tests/test_foo.py", line 1, in <module>
import foo
ImportError: No module named foo
----------------------------------------------------------------------
Ran 1 test in 0.002s
FAILED (errors=1)
Saya mendapatkan kesalahan yang sama ketika saya menjalankan dari dalam direktori tes /. Menurut dokumentasi dan contoh yang saya temukan, nose seharusnya menambahkan semua paket induk ke jalur serta direktori tempat ia dipanggil, tetapi ini tampaknya tidak terjadi dalam kasus saya.
Saya menjalankan Ubuntu 8.04 dengan Python 2.6.2. Saya telah membangun dan menginstal nose secara manual (bukan dengan setup_tools) jika itu penting.
sumber
Apakah Anda berada di virtualenv? Dalam kasus saya,
nosetests
adalah salah satu/usr/bin/nosetests
yang digunakan/usr/bin/python
. Paket-paket di virtualenv pasti tidak akan berada di jalur sistem. Hal berikut memperbaiki ini:sumber
nosetests
-cache olehbash
satu sistem/usr/local/bin
(sementarawhich nosetests
memberikan hasil yang tepat). Saya menggunakan ini untuk membersihkannya.Bagi Anda yang menemukan pertanyaan ini nanti: Saya mendapatkan kesalahan impor jika saya tidak memiliki
__init__.py
file di direktori pengujian saya.Struktur direktori saya seperti ini:
Jika saya tidak melakukan uji coba:
Itu akan memberi apa
ImportError
yang dilihat orang lain. Jika saya menambahkan__init__.py
file kosong, itu berfungsi dengan baik:sumber
Masalah potensial lainnya tampaknya adalah tanda hubung / tanda hubung di pohon direktori. Saya baru-baru ini memperbaiki masalah ImportError hidung dengan mengganti nama direktori dari
sub-dir
menjadisub_dir
.sumber
Tentu saja jika Anda memiliki kesalahan sintaks pada modul yang diimpor yang akan menyebabkan hal ini. Bagi saya, masalahnya muncul ketika saya memiliki cadangan file tes dengan jalur seperti module / tests.bak.py di direktori yang sama seperti tests.py. Juga, untuk menangani masalah paket / modul init dalam aplikasi Django, Anda dapat menjalankan berikut ini (dalam shell bash / OSX) untuk memastikan Anda tidak memiliki berkas .pyc init yang tergeletak di sekitar:
sumber
Saya mendapat pesan kesalahan ini karena saya menjalankan
nosetests
perintah dari direktori yang salah.Konyol, tapi terjadi.
sumber
nosetests
di direktori tanpa pengujian sama sekali akan menghasilkanRan 0 tests
, bukan kesalahan impor. Dalam bentuknya yang sekarang, jawaban ini tidak berguna.Saya baru saja mengalami satu hal lagi yang mungkin menyebabkan masalah ini: penamaan tes dalam formulir
testname.test.py
. Ekstra itu.
mengacaukan hidung dan menyebabkannya mengimpor hal-hal yang tidak semestinya. Saya rasa mungkin sudah jelas bahwa menggunakan konvensi penamaan pengujian yang tidak konvensional akan merusak banyak hal, tetapi saya pikir mungkin perlu diperhatikan.sumber
Misalnya, dengan struktur direktori berikut, jika Anda ingin menjalankan
nosetests
dim1
,m2
ataum3
untuk menguji beberapa fungsi dalamn.py
, Anda harus menggunakanfrom m2.m3 import n
ditest.py
.sumber
Sekadar melengkapi pertanyaan: Jika Anda kesulitan dengan struktur seperti ini:
Dan mungkin Anda ingin menjalankan pengujian dari jalur di luar proyek, termasuk jalur proyek Anda di dalam PYTHONPATH Anda.
tempelkan di dalam .profil Anda. Jika Anda berada di lingkungan virtual, tempelkan di dalam aktivasi di root venv Anda
sumber