Não consigo obter a estrutura de teste do nariz para reconhecer os módulos abaixo do meu script de teste na estrutura do arquivo. Eu configurei o exemplo mais simples que demonstra o problema. Vou explicar isso abaixo.
Aqui está a estrutura do arquivo do pacote:
./__init__.py
./foo.py
./tests
./__init__.py
./test_foo.py
foo.py contém:
def dumb_true():
return True
tests / test_foo.py contém:
import foo
def test_foo():
assert foo.dumb_true()
Ambos os arquivos init .py estão vazios
Se eu executar nosetests -vv
no diretório principal (onde está foo.py), eu obtenho:
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)
Eu recebo o mesmo erro quando executo de dentro do diretório tests /. De acordo com a documentação e um exemplo que encontrei, o nariz deve adicionar todos os pacotes-pai ao caminho e ao diretório a partir do qual ele é chamado, mas isso não parece estar acontecendo no meu caso.
Estou executando o Ubuntu 8.04 com Python 2.6.2. Criei e instalei o nariz manualmente (não com o setup_tools), se isso importa.
fonte
Você está em um virtualenv? No meu caso,
nosetests
foi o/usr/bin/nosetests
que estava usando/usr/bin/python
. Os pacotes no virtualenv definitivamente não estarão no caminho do sistema. O seguinte corrigiu isso:fonte
nosetests
foi armazenado em cachebash
no sistema/usr/local/bin
(enquantowhich nosetests
estava dando o resultado apropriado). Eu usei isso para limpá-lo.Para aqueles que encontrarem essa pergunta mais tarde: Recebo o erro de importação se não houver um
__init__.py
arquivo no meu diretório de testes.Minha estrutura de diretórios era assim:
Se eu fizesse testes nos:
Daria o
ImportError
que todo mundo está vendo. Se eu adicionar um__init__.py
arquivo em branco, ele funcionará perfeitamente:fonte
Outro problema em potencial parece ser hífens / traços na árvore de diretórios. Corrigi recentemente um problema no ImportError renomeando um diretório de
sub-dir
parasub_dir
.fonte
Obviamente, se você tiver um erro de sintaxe no módulo sendo importado, isso causará isso. Para mim, o problema surgiu quando eu tinha um backup de um arquivo de testes com um caminho como module / tests.bak.py no mesmo diretório que tests.py. Além disso, para lidar com o problema do pacote / módulo init em um aplicativo Django, você pode executar o seguinte (em um shell bash / OSX) para garantir que não haja nenhum arquivo .pyc init por aí:
fonte
Recebi essa mensagem de erro porque executo o
nosetests
comando no diretório errado.Bobo, mas acontece.
fonte
nosetests
em um diretório sem nenhum teste resultará emRan 0 tests
nenhum erro de importação. Na sua forma atual, essa resposta não é útil.Acabei de encontrar mais uma coisa que pode causar esse problema: nomeação de testes no formulário
testname.test.py
. Esse extra.
confunde o nariz e leva a importar coisas que não deveria. Suponho que seja óbvio que o uso de convenções de nomenclatura de teste não convencionais vá quebrar as coisas, mas achei que poderia valer a pena notar.fonte
Por exemplo, com a seguinte estrutura de diretórios, se você deseja executar
nosetests
emm1
,m2
oum3
para testar algumas funções emn.py
, você deve usarfrom m2.m3 import n
notest.py
.fonte
Apenas para concluir a pergunta: se você está enfrentando uma estrutura como esta:
E talvez você queira executar o teste a partir de um caminho fora do projeto, inclua o caminho do projeto dentro do seu PYTHONPATH.
cole-o dentro do seu .profile. Se você estiver em um ambiente virtual, cole-o dentro do ativar em sua raiz venv
fonte