Nie mogę sprawić, by struktura testowa nosa rozpoznawała moduły pod moim skryptem testowym w strukturze plików. Ustawiłem najprostszy przykład, który demonstruje problem. Wyjaśnię to poniżej.
Oto struktura pliku pakietu:
./__init__.py
./foo.py
./tests
./__init__.py
./test_foo.py
foo.py zawiera:
def dumb_true():
return True
testy / test_foo.py zawiera:
import foo
def test_foo():
assert foo.dumb_true()
Oba pliki init .py są puste
Jeśli uruchomię nosetests -vv
w głównym katalogu (gdzie jest foo.py), otrzymam:
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)
Ten sam błąd pojawia się, gdy uruchamiam z katalogu tests /. Zgodnie z dokumentacją i przykładem, który znalazłem, nos ma dodać wszystkie pakiety nadrzędne do ścieżki, a także katalog, z którego jest wywoływany, ale wydaje się, że w moim przypadku tak się nie dzieje.
Używam Ubuntu 8.04 z Pythonem 2.6.2. Zbudowałem i zainstalowałem nos ręcznie (nie za pomocą setup_tools), jeśli ma to znaczenie.
źródło
Czy jesteś w virtualenv? W moim przypadku
nosetests
był to ten w/usr/bin/nosetests
, który używał/usr/bin/python
. Pakiety w virtualenv na pewno nie będą w ścieżce systemowej. Naprawiono to:źródło
nosetests
został zbuforowany przezbash
system jeden w/usr/local/bin
(podczas gdywhich nosetests
dawał właściwy wynik). Użyłem tego, aby to wyczyścić.Do tych z Was, którzy znajdą to pytanie później: Otrzymuję błąd importowania, jeśli nie mam pliku
__init__.py
pliku w katalogu testów.Moja struktura katalogów wyglądała następująco:
Gdybym przeprowadził testy w nosie:
To dałoby to
ImportError
, co widzą wszyscy inni. Jeśli dodam pusty__init__.py
plik, to działa dobrze:źródło
Innym potencjalnym problemem są myślniki / myślniki w drzewie katalogów. Niedawno naprawiłem problem z ImportError nosa, zmieniając nazwę katalogu z
sub-dir
nasub_dir
.źródło
Oczywiście, jeśli masz błąd składni w importowanym module, to spowoduje to. U mnie problem rozwiał się, gdy miałem kopię zapasową pliku testów ze ścieżką taką jak module / tests.bak.py w tym samym katalogu co tests.py. Ponadto, aby poradzić sobie z problemem z pakietem / modułem init w aplikacji Django, możesz uruchomić następujące (w powłoce bash / OSX), aby upewnić się, że nie masz żadnych plików init .pyc w pobliżu:
źródło
Otrzymałem ten komunikat o błędzie, ponieważ uruchomiłem
nosetests
polecenie z niewłaściwego katalogu.Głupie, ale się zdarza.
źródło
nosetests
w katalogu bez żadnych testów spowodujeRan 0 tests
, a nie błąd importu. W obecnej formie ta odpowiedź nie jest przydatna.Właśnie natknąłem się na jeszcze jedną rzecz, która może powodować ten problem: nazewnictwo testów w formularzu
testname.test.py
. To dodatkowo.
dezorientuje nos i prowadzi do importowania rzeczy, których nie powinien. Przypuszczam, że może być oczywiste, że stosowanie niekonwencjonalnych konwencji nazewnictwa testów zepsuje sytuację, ale pomyślałem, że warto to zauważyć.źródło
Na przykład, o następującej strukturze katalogów, jeśli chcesz uruchomić
nosetests
wm1
,m2
lubm3
do testowania niektórych funkcjin.py
, należy użyćfrom m2.m3 import n
wtest.py
.źródło
Aby odpowiedzieć na pytanie: Jeśli zmagasz się z taką strukturą:
A może chcesz uruchomić test ze ścieżki spoza projektu, umieść ścieżkę projektu w PYTHONPATH.
wklej go w swoim .profile. Jeśli znajdujesz się w środowisku wirtualnym, wklej go do aktywacji w katalogu głównym venv
źródło