Eu usei o easy_install para instalar o pytest em um mac e comecei a escrever testes para um projeto com uma estrutura de arquivos como esta:
repo/
repo/app.py
repo/settings.py
repo/models.py
repo/tests/
repo/tests/test_app.py
executar py.test
enquanto no diretório repo, tudo se comporta como você esperaria
mas quando tento a mesma coisa no linux ou no windows (ambos possuem o pytest 2.2.3), ele late sempre que atinge sua primeira importação de algo do caminho do aplicativo. Digamos, por exemplofrom app import some_def_in_app
Preciso editar meu PATH para executar o py.test nesses sistemas? Alguém já passou por isso?
python
unit-testing
pytest
MattoTodd
fonte
fonte
Respostas:
Sim, a pasta de origem não está no caminho do Python se você estiver
cd
no diretório de testes.Você tem 2 opções:
Adicione o caminho manualmente aos arquivos de teste, algo como isto:
Execute os testes com o env var
PYTHONPATH=../
.fonte
cd
indo para um diretório? Eu estou correndopy.test
da minha raiz. se não me engano e você quer dizer como pytest anda através de minhas pastascd
problema, eu não iria acertá-lo também no mac?Não sei por que o py.test não adiciona o diretório atual no próprio PYTHONPATH, mas aqui está uma solução alternativa (a ser executada a partir da raiz do seu repositório):
Funciona porque o Python adiciona o diretório atual no PYTHONPATH para você.
fonte
project/test/all-my-tests
eproject/src/app.py
por causa dessa alteração, é necessário chamar oapp.py
indiretamente usando um__main__.py
arquivoproject/src
, para que você possa usar a chamadapython -m src
. Coisas bem bagunçadas, até onde eu sei./home/user/dev/projectxyz/src ...
seriam muito ruins e não seriam executadas em outras máquinas na maioria dos casos. Eu acho que o que eu quis dizer é que eu sempre devo escrever a raiz do projeto inteiro no caminho do módulo, mesmo que um módulo esteja na mesma pasta que o arquivo executado. Eu não sabia que isso é considerado uma prática recomendada, por isso é uma informação útil, obrigado. Eu concordo com a maioria do pep8, embora ainda não seja perfeito.__init__.py
em testes que resolveram o problema. Agora eu posso usarpytest
conftest
soluçãoA solução menos invasiva é adicionar um arquivo vazio nomeado
conftest.py
norepo/
diretório:É isso aí. Não há necessidade de escrever um código personalizado para manipular
sys.path
ou lembrar-se de arrastarPYTHONPATH
ou colocar__init__.py
em diretórios onde não pertence.O diretório do projeto depois:
Explicação
pytest
procura osconftest
módulos na coleção de testes para reunir ganchos e acessórios personalizados e, para importar os objetos personalizados deles,pytest
adiciona o diretório paiconftest.py
dosys.path
(no caso, orepo
diretório).Outras estruturas do projeto
Se você tiver outra estrutura de projeto, coloque o
conftest.py
diretório raiz do pacote (aquele que contém pacotes, mas não é um pacote em si, portanto não contém um__init__.py
), por exemplo:src
disposiçãoEmbora essa abordagem possa ser usada com o
src
layout (coloqueconftest.py
nosrc
dir):cuidado que adicionar
src
aoPYTHONPATH
atenua o significado e os benefícios dosrc
layout! Você terminará testando o código do repositório e não do pacote instalado. Se você precisar fazer isso, talvez não precise dosrc
dir.Para onde ir daqui
Obviamente, os
conftest
módulos não são apenas alguns arquivos para ajudar na descoberta do código-fonte; é onde todos os aprimoramentos específicos do projeto dapytest
estrutura e a personalização do seu conjunto de testes acontecem.pytest
tem muitas informações sobre osconftest
módulos espalhados pelos documentos ; comece comconftest.py
: plugins locais por diretórioAlém disso, o SO tem uma excelente pergunta sobre os
conftest
módulos: No py.test, qual é a utilidade dos arquivos conftest.py?fonte
pytest
e é altamente recomendável que não o faça. Ao fazer isso, você planta sementes para erros futuros. Crie outro módulo chamadoutils.py
e coloque o código para reutilização nos testes lá.conftest.py
não pertence ao código do aplicativo e, imo, colocá-lo sobsrc/
não está correto.Eu tive o mesmo problema. Corrigi-o adicionando um
__init__.py
arquivo vazio ao meutests
diretório.fonte
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
do meu diretório de testes resolveu isso para mim.__init__.py
nos subdiretóriostest/
faz com que a importação absoluta funcione para a execução de testes específicos nesse subdiretório nos módulos a serem instalados. Obrigado.Execute-
pytest
se como um módulo com:python -m pytest tests
fonte
python -m pytest
sem qualquer explicação que não seja "porque funciona"package/src package/tests
e natests
importação desrc
. A execução como um módulo considerará as importações como absolutas que em relação ao local de execução.Você pode executar com PYTHONPATH na raiz do projeto
Ou use a instalação do pip como importação editável
fonte
test
diretório que não está nasrc
estrutura de diretórios e que chamou do diretório que contém os doistest
e osrc
diretório.Eu criei isso como uma resposta para sua pergunta e minha própria confusão. Espero que ajude. Preste atenção ao PYTHONPATH na linha de comando py.test e no tox.ini.
https://github.com/jeffmacdonald/pytest_test
Especificamente: Você deve informar ao py.test e tox onde encontrar os módulos que você está incluindo.
Com py.test, você pode fazer isso:
E com o tox, adicione isso ao seu tox.ini:
fonte
Eu tive o mesmo problema no Flask.
Quando adicionei:
para pasta de testes, problema desapareceu :)
Provavelmente o aplicativo não conseguiu reconhecer os testes de pasta como módulo
fonte
Corrigi-o removendo o nível superior
__init__.py
na pasta pai das minhas fontes.fonte
Comecei a receber
ConftestImportFailure: ImportError('No module named ...
erros estranhos quando adicionei acidentalmente um__init__.py
arquivo ao meu diretório src (que não deveria ser um pacote Python, apenas um contêiner de todas as fontes).fonte
Eu estava recebendo esse erro devido a algo ainda mais simples (você pode até dizer trivial). Eu não tinha instalado o
pytest
módulo. Então, um simplesapt install python-pytest
corrigiu isso para mim.'pytest' teria sido listado em setup.py como uma dependência de teste. Certifique-se de instalar os requisitos de teste também.
fonte
Eu tive uma questão semelhante.
pytest
não reconheceu um módulo instalado no ambiente em que estava trabalhando.Eu o resolvi instalando também
pytest
no mesmo ambiente.fonte
Para mim, o problema foi
tests.py
gerado pelo Django junto com otests
diretório. A remoçãotests.py
resolveu o problema.fonte
Eu recebi esse erro porque usei importações relativas incorretamente. No exemplo do OP, test_app.py deve importar funções usando, por exemplo,
No entanto, os arquivos __init__.py liberalmente estão espalhados pela estrutura do arquivo, isso não funciona e cria o tipo de ImportError visto, a menos que os arquivos e os arquivos de teste estejam no mesmo diretório.
Aqui está um exemplo do que eu tive que fazer com um dos meus projetos:
Aqui está a estrutura do meu projeto:
Para acessar o activity_indicator.py em test_activity_indicator.py, eu precisava:
fonte
Muitas vezes, os testes eram interrompidos devido à impossibilidade de importação do módulo. Após a pesquisa, descobri que o sistema está olhando o arquivo no lugar errado e podemos solucionar facilmente o problema, copiando o arquivo, contendo o módulo, em a mesma pasta indicada, para ser importada corretamente. Outra proposta de solução seria alterar a declaração para a importação e mostrar ao MutPy o caminho correto da unidade. No entanto, devido ao fato de que várias unidades podem ter essa dependência, o que significa que precisamos confirmar alterações também em suas declarações, preferimos simplesmente mover a unidade para a pasta.
fonte
De acordo com um post no Medium de Dirk Avery (e suportado pela minha experiência pessoal) se você estiver usando um ambiente virtual para o seu projeto, não poderá usar uma instalação do pytest em todo o sistema; você precisa instalá-lo no ambiente virtual e usar essa instalação.
Em particular, se você o tiver instalado nos dois lugares, simplesmente executar o
pytest
comando não funcionará porque ele estará usando a instalação do sistema. Como as outras respostas descreveram, uma solução simples é executar empython -m pytest
vez depytest
; isso funciona porque usa a versão do ambiente do pytest. Como alternativa, você pode simplesmente desinstalar a versão do sistema do pytest; após reativar o ambiente virtual, opytest
comando deve funcionar.fonte
python -m pytest tests/
.Eu estava tendo o mesmo problema ao seguir o tutorial do Flask e encontrei a resposta nos documentos oficiais do Pytest. É uma pequena mudança na maneira como eu (e acho que muitos outros) costumamos fazer as coisas.
Você precisa criar um
setup.py
arquivo no diretório raiz do seu projeto com pelo menos as duas linhas a seguir:onde PACKAGENAME é o nome do seu aplicativo. Então você precisa instalá-lo com o pip:
O
-e
sinalizador diz ao pip para instalar o pacote no modo editável ou "desenvolvido". Portanto, da próxima vez que você executá-pytest
lo, seu aplicativo deverá estar no padrãoPYTHONPATH
.fonte
Minha solução:
crie o
conftest.py
arquivo notest
diretório que contém:Isso adicionará a pasta de interesse ao caminho do python sem modificar todos os arquivos de teste , configurando a variável env ou alterando os caminhos absolutos / relativos.
fonte