Estoy tratando de usar TDD (desarrollo basado en pruebas) con pytest.
pytestNo printa la consola cuando lo uso print.
Estoy usando pytest my_tests.pypara ejecutarlo.
El documentationparece 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 unittestmódulo, todo se imprime por defecto, que es exactamente lo que necesito. Sin embargo, deseo utilizarlo pytestpor otros motivos.
¿Alguien sabe cómo hacer que se muestren las declaraciones impresas?
python
unit-testing
python-2.7
pytest
BBedit
fuente
fuente

sys.stdout.write("Test")? ¿Qué talsys.__stdout__.write("Test")? Este último siempre debe escribir en el stdout definido por el sistema, que debe ser la consola. Si los dos comandos hacen cosas diferentes, entonces se está cambiando stdout; si hacen lo mismo, entonces el problema es otra cosa.Respuestas:
De forma predeterminada,
py.testcaptura el resultado de la salida estándar para que pueda controlar cómo se imprime. Si no hiciera esto, arrojaría mucho 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 muestra lo que se imprimió según el estándar en esa prueba en particular.
Por ejemplo,
Resultados en la siguiente salida:
Tenga en cuenta la
Captured stdoutsección.Si desea ver las
printdeclaraciones a medida que se ejecutan, puede pasar el-sindicador apy.test. Sin embargo, tenga en cuenta que esto a veces puede ser difícil de analizar.fuente
El uso de la
-sopción imprimirá la salida de todas las funciones, lo que puede ser demasiado.Si necesita un resultado particular, la página de documentos que mencionó ofrece algunas sugerencias:
Inserte
assert False, "dumb assert to make PyTest print my stuff"al final de su función, y verá su salida 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
Puede abrir los archivos
outyerren una pestaña separada y dejar que el editor lo actualice automáticamente, o hacer un simplepy.test; cat out.txtcomando de shell para ejecutar su prueba.Esa es una forma bastante complicada de hacer cosas, pero puede ser que sea lo que necesita: después de todo, TDD significa que se mete con cosas y lo deja limpio y silencioso cuando está listo :-).
fuente
print()función, debe colocar la variable o el mensaje que desea imprimir después de la coma en la declaración de aserción. Por ejemploassert False, what_are_you, "imprimirá" el valor dewhat_are_youen el informe de pytest.Respuesta corta
Usa la
-sopción:Respuesta detallada
De los documentos :
pytesttiene la opción--capture=methoden la quemethodes per-test captura de método, y podría ser una de las siguientes:fd,sysono.pytesttambién tiene la opción-sque es un acceso directo para--capture=no, y esta es la opción que le permitirá ver sus declaraciones de impresión en la consola.Establecer métodos de captura o deshabilitar la captura
Hay dos formas de
pytestrealizar la captura:captura de nivel del descriptor de archivo (FD) (predeterminado): se capturarán todas las escrituras que se dirijan a los descriptores de archivo 1 y 2 del sistema operativo.
captura de nivel sys : solo se capturarán las escrituras en archivos Python sys.stdout y sys.stderr. No se realiza la captura de escrituras en descriptores de archivos.
fuente
Necesitaba imprimir una advertencia importante sobre las pruebas omitidas exactamente cuando estaba
PyTestsilenciado, literalmente, todo .No quería fallar una prueba para enviar una señal, así que hice un truco de la siguiente manera:
El
atexitmódulo me permite imprimir cosas después dePyTestlanzar las secuencias de salida. El resultado es el siguiente:El mensaje se imprime incluso cuando
PyTestestá en modo silencioso, y no se imprime si ejecuta cosaspy.test -s, por lo que todo ya está bien probado.fuente
Según los documentos de pytest ,
pytest --capture=sysdebería funcionar. Si desea capturar el estándar dentro de una prueba, consulte el accesorio capsys.fuente
Originalmente vine aquí para encontrar cómo
PyTestimprimir en la consola de VSCode mientras ejecutaba / depuraba la prueba de la unidad desde allí. Esto se puede hacer con la siguientelaunch.jsonconfiguración. Dada.venvla carpeta del entorno virtual.fuente