Estou usando o pytest. Nota W10.
Estarei executando meu aplicativo indo > python src/core
. "core" é meu módulo central, com um __main__.py
arquivo.
Por esse motivo estou colocando meu diretório "testes" em [raiz do projeto]/src/core.
Eu tenho um arquivo de teste test_xxx.py. Nele tento importar __main__
:
import __main__
...
def test_xxxxx():
print(f'main {__main__} type {type(__main__)}')
Isso imprime o seguinte:
main <module '__main__' from 'D:\\apps\\Python\\virtual_envs\\doc_indexer v2.0.0\\Scripts\\pytest.exe\\__main__.py'> type <class 'module'>
... em outras palavras, ele não está importando meu local __main__.py
do módulo "principal" local, mas o próprio pytest __main__
de seu módulo. Até agora tudo compreensível. Então eu olho para sys.path:
path: D:\My Documents\software projects\EclipseWorkspace\doc_indexer\src\core\tests
path: D:\My Documents\software projects\EclipseWorkspace\doc_indexer\src\core
path: D:\apps\Python\virtual_envs\doc_indexer v2.0.0\Scripts\pytest.exe
path: D:\apps\Python\PyQt5
...
Agora estou coçando a cabeça, não pela primeira vez com o pytest. Este caminho ...src\core está listado antes de ...Scripts\pytest.exe. Por que o pytest identificaria o seu próprio __main__.py
e o importaria, antes de importar __main__.py
de um caminho que o precede?
Eu também tentei vários experimentos com importlib
. Nada parece funcionar.
Então, geralmente, existe alguma maneira de realmente importar esse arquivo ...src/core/ __main__py
?
Sei que esse arquivo deve fazer coisas mínimas antes de passar para outro arquivo, mas para completar, gostaria apenas de testar se main()
de fato faz isso. Existe alguma maneira de executar __main__.main()
um teste?
Todo programa Python cria um módulo nomeado
__main__
na inicialização, com base no script que está sendo executado.Como resultado,
import __main__
sempre encontra um módulo com esse nome, o que significa que não é necessário defini-lo a partir, digamos, de um arquivo chamado__main__.py
. No seu caso, você executoupytest
(que é principalmente um wrapper simples em torno deimport pytest; pytest.console_main()
. (O scriptpytest
, armazenado em um diretório em seu caminho de pesquisa, é separado de um módulo definido porpytest.py
em sua biblioteca Python.)Uma solução seria garantir que você possa importar
__main__.py
usando outro pacote, de forma quesomepackage.__main__
seja diferente do__main__
.No entanto,
__main__.py
nunca se destina a ser importado como um módulo. É o arquivo que define um script quando você tenta executar um diretório ou um arquivo compactado como um script. Se contiver código que precisa ser testado, eu recomendaria fatorá-lo em um módulo separado com__main__.py
as próprias importações.