conftest solução
A solução menos invasiva é adicionar um arquivo vazio nomeado conftest.pyno repo/diretório:
$ touch repo/conftest.py
É isso aí. Não há necessidade de escrever um código personalizado para manipular sys.pathou lembrar-se de arrastar PYTHONPATHou colocar __init__.pyem 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
pytestprocura os conftestmódulos na coleção de testes para reunir ganchos e acessórios personalizados e, para importar os objetos personalizados deles, pytestadiciona o diretório pai conftest.pydosys.path (no caso, o repodiretório).
Outras estruturas do projeto
Se você tiver outra estrutura de projeto, coloque o conftest.pydiretó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 srclayout (coloque conftest.pyno srcdir):
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 srcao PYTHONPATHatenua o significado e os benefícios do srclayout! 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 srcdir.
Para onde ir daqui
Obviamente, os conftestmó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 pytestestrutura e a personalização do seu conjunto de testes acontecem. pytesttem muitas informações sobre os conftestmódulos espalhados pelos documentos ; comece com conftest.py: plugins locais por diretório
Além disso, o SO tem uma excelente pergunta sobre os conftestmódulos: No py.test, qual é a utilidade dos arquivos conftest.py?