Às vezes, quero apenas inserir algumas instruções de impressão no meu código e ver o que é impresso quando o exercito. Minha maneira usual de "exercitar" é com os testes pytest existentes. Mas quando eu os executo, não consigo ver nenhuma saída padrão (pelo menos no PyCharm, meu IDE).
Existe uma maneira simples de ver a saída padrão durante uma execução de pytest?
Respostas:
O
-s
comutador desativa a captura por teste.fonte
-s
=--capture=no
Em um comentário votado para a resposta aceita , Joe pergunta:
No UNIX, isso geralmente é chamado de tweet . Idealmente, fazer xixi em vez de capturar seria o padrão py.test. Não idealmente, nem o py.test nem qualquer plug-in py.test de terceiros existente (... que eu saiba, de qualquer maneira ) são compatíveis com o tee - apesar do Python suportar trivialmente o tee fora da caixa .
O teste de patch de macaco para fazer qualquer coisa sem suporte não é trivial. Por quê? Porque:
_pytest
pacote privado que não se destina a ser importado externamente. Tentar fazer isso sem saber o que você está fazendo normalmente resulta nopytest
pacote público gerando exceções obscuras no tempo de execução. Muito obrigado, py.test. Arquitetura realmente robusta que você chegou lá._pytest
API de uma forma segura, você tem que fazê-lo antes de executar o públicopytest
run pacote pelo externopy.test
de comando. Você não pode fazer isso em um plug-in (por exemplo, umconftest
módulo de nível superior em seu conjunto de testes). No momento em que o py.test preguiçosamente importa a importação dinâmica do seu plug-in, qualquer classe py.test que você deseja corrigir o patch já foi instanciada - e você não tem acesso a essa instância. Isso implica que, se você deseja que seu patch para macaco seja aplicado de maneira significativa, não poderá mais executar opy.test
comando externo com segurança . Em vez disso, você deve agrupar a execução desse comando com um setuptools personalizadotest
comando que (em ordem):_pytest
API privada .pytest.main()
função pública para executar opy.test
comando.Esta resposta corrige py.test
-s
e--capture=no
opções para capturar stderr, mas não stdout. Por padrão, essas opções não capturam nem stderr nem stdout. Isso não é nada, é claro. Mas toda grande jornada começa com uma prequela tediosa que todos esquecem em cinco anos.Por que fazer isso? Agora vou lhe contar. Meu conjunto de testes orientado por py.test contém testes funcionais lentos. A exibição do stdout desses testes é útil e reconfortante, impedindo que o leycec atinja
killall -9 py.test
quando outro teste funcional de longa duração falha em fazer qualquer coisa por semanas a fio. A exibição do stderr desses testes, no entanto, impede que o py.test relate tracebacks de exceção em falhas de teste. O que é completamente inútil. Portanto, coagimos py.test para capturar stderr, mas não stdout.Antes de chegarmos a isso, esta resposta supõe que você já tenha um
test
comando setuptools personalizado invocando py.test. Caso contrário, consulte a subseção Integração manual da página bem escrita de Boas Práticas do py.test .Você não instalar pytest-runner , um terceiro setuptools do plugin fornecendo um setuptools personalizados
test
também comandam invocando py.test. Se o pytest-runner já estiver instalado, você provavelmente precisará desinstalar esse pacote pip3 e adotar a abordagem manual vinculada a acima.Supondo que você seguiu as instruções em Integração manual destacadas acima, sua base de código agora deve conter um
PyTest.run_tests()
método. Modifique este método para se parecer com:Para ativar esse patch de macaco, execute py.test da seguinte maneira:
Stderr, mas não stdout, agora serão capturados. Bacana!
Estender o patch de macaco acima para tee stdout e stderr é deixado como um exercício para o leitor com um barril cheio de tempo livre.
fonte
Ao executar o teste, use a
-s
opção Todas as instruções de impressãoexampletest.py
serão impressas no console quando o teste for executado.fonte
De acordo com a documentação do pytest , a versão 3 do pytest pode desativar temporariamente a captura em um teste:
fonte
O pytest captura o stdout de testes individuais e os exibe apenas em determinadas condições, junto com o resumo dos testes que ele imprime por padrão.
Informações de resumo extras podem ser exibidas usando a opção '-r':
mostra a saída capturada dos testes aprovados.
mostra a saída capturada de testes com falha (comportamento padrão).
A formatação da saída é mais bonita com -r do que com -s.
fonte
Tente
pytest -s -v test_login.py
obter mais informações no console.-v
é um curto--verbose
-s
significa 'desativar todas as capturas'fonte
Se você estiver usando o PyCharm IDE, poderá executar esse teste individual ou todos os testes usando a barra de ferramentas Executar. A janela da ferramenta Executar exibe a saída gerada pelo seu aplicativo e você pode ver todas as instruções de impressão como parte da saída de teste.
fonte
pytest --capture=tee-sys
foi adicionado recentemente. Você pode capturar e ver a saída em stdout / err.fonte
As outras respostas não funcionam. A única maneira de ver a saída capturada é usando o seguinte sinalizador:
fonte
--show-capture=all
é o valor padrão. Adicioná-lo não afeta nada.