Estou tentando usar TDD (desenvolvimento orientado a teste) com pytest
.
pytest
não vai print
para o console quando eu uso print
.
Estou usando pytest my_tests.py
para executá-lo.
O documentation
parece dizer que ele deve funcionar por padrão: http://pytest.org/latest/capture.html
Mas:
import myapplication as tum
class TestBlogger:
@classmethod
def setup_class(self):
self.user = "alice"
self.b = tum.Blogger(self.user)
print "This should be printed, but it won't be!"
def test_inherit(self):
assert issubclass(tum.Blogger, tum.Site)
links = self.b.get_links(posts)
print len(links) # This won't print either.
Nada é impresso no meu console de saída padrão (apenas o progresso normal e quantos testes foram aprovados / reprovados).
E o script que estou testando contém print:
class Blogger(Site):
get_links(self, posts):
print len(posts) # It won't get printed in the test.
No unittest
módulo, tudo é impresso por padrão, que é exatamente o que eu preciso. No entanto, desejo usar pytest
por outros motivos.
Alguém sabe como fazer com que as instruções de impressão sejam exibidas?
python
unit-testing
python-2.7
pytest
BBedit
fonte
fonte
sys.stdout.write("Test")
? Que talsys.__stdout__.write("Test")
? O último deve sempre gravar no stdout definido pelo sistema, que deve ser o console. Se os dois comandos fazem coisas diferentes, o stdout está sendo alterado; se eles fazem a mesma coisa, então o problema é outra coisa.Respostas:
Por padrão,
py.test
captura o resultado da saída padrão para poder controlar como a imprime. Se isso não acontecesse, seria possível enviar muito texto sem o contexto de qual teste imprimia esse texto.No entanto, se um teste falhar, incluirá uma seção no relatório resultante que mostra o que foi impresso com o padrão nesse teste específico.
Por exemplo,
Resultados na seguinte saída:
Observe a
Captured stdout
seção.Se você deseja ver as
print
instruções como elas são executadas, pode passar a-s
flag parapy.test
. No entanto, observe que isso às vezes pode ser difícil de analisar.fonte
Usar a
-s
opção imprimirá a saída de todas as funções, que podem ser demais.Se você precisar de uma saída específica, a página do documento que você mencionou oferece algumas sugestões:
Insira
assert False, "dumb assert to make PyTest print my stuff"
no final de sua função, e você verá sua saída devido a falha no teste.Você tem um objeto especial passado pelo PyTest e pode gravar a saída em um arquivo para inspecioná-lo mais tarde, como
Você pode abrir os arquivos
out
eerr
em uma guia separada e deixar o editor atualizá-lo automaticamente para você oupy.test; cat out.txt
executar um simples comando shell para executar seu teste.Essa é uma maneira bastante tola de fazer coisas, mas pode ser que você precise: afinal, TDD significa que você mexe com as coisas e deixa tudo limpo e silencioso quando estiver pronto :-).
fonte
print()
função, você deve colocar a variável ou mensagem que deseja imprimir após a vírgula na declaração assert. Por exemploassert False, what_are_you
, 'imprimirá' o valor dewhat_are_you
no relatório pytest.Resposta curta
Use a
-s
opção:Resposta detalhada
Dos documentos :
pytest
tem a opção--capture=method
na qualmethod
é por teste método de captura, e pode ser um dos seguintes:fd
,sys
ouno
.pytest
também tem a opção-s
que é um atalho--capture=no
, e essa é a opção que permitirá que você veja suas instruções de impressão no console.Configurando métodos de captura ou desativando a captura
Existem duas maneiras pelas quais a
pytest
captura pode ser realizada:captura no nível do descritor de arquivo (FD) (padrão): todas as gravações enviadas para os descritores de arquivo 1 e 2 do sistema operacional serão capturadas.
Captura no nível do sys : somente gravações nos arquivos Python sys.stdout e sys.stderr serão capturadas. Nenhuma captura de gravações em filedescriptors é executada.
fonte
Eu precisava imprimir um aviso importante sobre testes ignorados exatamente quando
PyTest
silenciosamente literalmente tudo .Como não queria falhar em um teste para enviar um sinal, fiz um hack da seguinte maneira:
O
atexit
módulo permite que eu imprima coisas apósPyTest
liberar os fluxos de saída. A saída é a seguinte:A mensagem é impressa mesmo quando
PyTest
está no modo silencioso e não é impressa se você executar coisaspy.test -s
, portanto tudo já foi testado com bom gosto.fonte
De acordo com os documentos pytest ,
pytest --capture=sys
deve funcionar. Se você deseja capturar o padrão dentro de um teste, consulte o acessório capsys.fonte
Originalmente, vim aqui para descobrir como
PyTest
imprimir no console do VSCode durante a execução / depuração do teste de unidade a partir daí. Isso pode ser feito com a seguintelaunch.json
configuração. Dada.venv
a pasta do ambiente virtual.fonte