conftest
solução
A solução menos invasiva é adicionar um arquivo vazio nomeado conftest.py
no repo/
diretório:
$ touch repo/conftest.py
É isso aí. Não há necessidade de escrever um código personalizado para manipular sys.path
ou lembrar-se de arrastar PYTHONPATH
ou colocar __init__.py
em diretórios onde não pertence.
O diretório do projeto depois:
repo
├── conftest.py
├── app.py
├── settings.py
├── models.py
└── tests
└── test_app.py
Explicação
pytest
procura os conftest
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 pai conftest.py
dosys.path
(no caso, o repo
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:
repo
├── conftest.py
├── spam
│ ├── __init__.py
│ ├── bacon.py
│ └── egg.py
├── eggs
│ ├── __init__.py
│ └── sausage.py
└── tests
├── test_bacon.py
└── test_egg.py
src
disposição
Embora essa abordagem possa ser usada com o src
layout (coloque conftest.py
no src
dir):
repo
├── src
│ ├── conftest.py
│ ├── spam
│ │ ├── __init__.py
│ │ ├── bacon.py
│ │ └── egg.py
│ └── eggs
│ ├── __init__.py
│ └── sausage.py
└── tests
├── test_bacon.py
└── test_egg.py
cuidado que adicionar src
ao PYTHONPATH
atenua o significado e os benefícios do src
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 do src
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 da pytest
estrutura e a personalização do seu conjunto de testes acontecem. pytest
tem muitas informações sobre os conftest
módulos espalhados pelos documentos ; comece com conftest.py
: plugins locais por diretório
Além disso, o SO tem uma excelente pergunta sobre os conftest
módulos: No py.test, qual é a utilidade dos arquivos conftest.py?