python - salto - Cómo imprimir en consola en Py Test?
salto de linea en una lista python (4)
De acuerdo con los documentos de Pytest , pytest --capture=sys
debería funcionar. Si desea capturar el estándar dentro de una prueba, consulte el accesorio capsys.
pytest
utilizar Test-Driven Development con el módulo pytest
. Pytest no se print
en la consola cuando escriba print
.
Yo uso py.test my_tests.py
para ejecutarlo ...
La documentation
parece decir que debería funcionar por defecto: http://pytest.org/latest/capture.html
Pero:
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.
No se imprime nada en mi consola de salida estándar (solo el progreso normal y cuántas pruebas pasaron / fallaron).
Y el script que estoy probando contiene print:
class Blogger(Site):
get_links(self, posts):
print len(posts) # It won''t get printed in the test.
En el módulo unittest
, todo se imprime por defecto, que es exactamente lo que necesito. Sin embargo, deseo usar pytest
por otros motivos. Parece una funcionalidad tan básica que quizás me la estoy perdiendo?
¿Alguien sabe cómo hacer que se muestren las declaraciones impresas?
El uso de la opción -s
imprimirá la salida de todas las funciones, que pueden ser demasiado.
Si necesita un resultado particular, la página de documentos que mencionó ofrece algunas sugerencias:
Inserte la
assert False, "dumb assert to make PyTest print my stuff"
al final de su función, y verá su resultado debido a una prueba fallida.PyTest le ha pasado un objeto especial y puede escribir el resultado en un archivo para inspeccionarlo más tarde, como
def test_good1(capsys): for i in range(5): print i out, err = capsys.readouterr() open("err.txt", "w").write(err) open("out.txt", "w").write(out)
Puede abrir los archivos de
out
y deerr
en una pestaña separada y dejar que el editor lo actualice automáticamente, o realice una simplepy.test; cat out.txt
Comando de shellpy.test; cat out.txt
para ejecutar tu prueba.
Esa es una forma bastante hackosa de hacer las cosas, pero puede ser que es lo que necesitas: después de todo, TDD significa que te metas con cosas y las dejas limpias y silenciosas cuando están listas :-).
Necesitaba imprimir una advertencia importante sobre las pruebas omitidas exactamente cuando PyTest
silenciaba literalmente todo .
No quería reprobar una prueba para enviar una señal, así que hice un truco de la siguiente manera:
def test_2_YellAboutBrokenAndMutedTests():
import atexit
def report():
print C_patch.tidy_text("""
In silent mode PyTest breaks low level stream structure I work with, so
I cannot test if my functionality work fine. I skipped corresponding tests.
Run `py.test -s` to make sure everything is tested.""")
if sys.stdout != sys.__stdout__:
atexit.register(report)
El módulo atexit
me permite imprimir cosas después de que PyTest
lanzó las secuencias de salida. El resultado se ve de la siguiente manera:
============================= test session starts ==============================
platform linux2 -- Python 2.7.3, pytest-2.9.2, py-1.4.31, pluggy-0.3.1
rootdir: /media/Storage/henaro/smyth/Alchemist2-git/sources/C_patch, inifile:
collected 15 items
test_C_patch.py .....ssss....s.
===================== 10 passed, 5 skipped in 0.15 seconds =====================
In silent mode PyTest breaks low level stream structure I work with, so
I cannot test if my functionality work fine. I skipped corresponding tests.
Run `py.test -s` to make sure everything is tested.
~/.../sources/C_patch$
El mensaje se imprime incluso cuando PyTest
está en modo silencioso y no se imprime si ejecuta cosas con py.test -s
, por lo que todo se ha probado py.test -s
.
Por defecto, py.test
captura el resultado de la salida estándar para que pueda controlar cómo se imprime. Si no lo hiciera, arrojaría una gran cantidad de texto sin el contexto de qué prueba imprimió ese texto.
Sin embargo, si una prueba falla, incluirá una sección en el informe resultante que muestre lo que se imprimió como estándar en esa prueba en particular.
Por ejemplo,
def test_good():
for i in range(1000):
print(i)
def test_bad():
print(''this should fail!'')
assert False
Resultados en el siguiente resultado:
>>> py.test tmp.py
============================= test session starts ==============================
platform darwin -- Python 2.7.6 -- py-1.4.20 -- pytest-2.5.2
plugins: cache, cov, pep8, xdist
collected 2 items
tmp.py .F
=================================== FAILURES ===================================
___________________________________ test_bad ___________________________________
def test_bad():
print(''this should fail!'')
> assert False
E assert False
tmp.py:7: AssertionError
------------------------------- Captured stdout --------------------------------
this should fail!
====================== 1 failed, 1 passed in 0.04 seconds ======================
Tenga en cuenta la sección Captured stdout
.
Si desea ver print
declaraciones print
medida que se ejecutan, puede pasar la bandera -s
a py.test
. Sin embargo, tenga en cuenta que esto a veces puede ser difícil de analizar.
>>> py.test tmp.py -s
============================= test session starts ==============================
platform darwin -- Python 2.7.6 -- py-1.4.20 -- pytest-2.5.2
plugins: cache, cov, pep8, xdist
collected 2 items
tmp.py 0
1
2
3
... and so on ...
997
998
999
.this should fail!
F
=================================== FAILURES ===================================
___________________________________ test_bad ___________________________________
def test_bad():
print(''this should fail!'')
> assert False
E assert False
tmp.py:7: AssertionError
====================== 1 failed, 1 passed in 0.02 seconds ======================