nose vs pytest: ¿cuáles son las diferencias (subjetivas) que deberían hacerme elegir? [cerrado]

85

Comencé a trabajar en un proyecto Python bastante grande (multiproceso), con un montón de pruebas (unitarias). El problema más importante es que la ejecución de la aplicación requiere un entorno preestablecido, que es implementado por un administrador de contexto. Hasta ahora hicimos uso de una versión parcheada del ejecutor de pruebas unitarias que ejecutaría las pruebas dentro de este administrador, pero que no permite cambiar el contexto entre diferentes módulos de prueba.

Tanto nose como pytest admiten tal cosa porque admiten accesorios en muchas granularidades, por lo que estamos buscando cambiar a nose o pytest. Ambas bibliotecas también admitirían pruebas de 'etiquetado' y ejecutarían solo estos subconjuntos etiquetados, que es algo que también nos gustaría hacer.

He estado revisando la documentación de nose y pytest un poco, y por lo que puedo ver, la mayor parte de esas bibliotecas esencialmente admiten la misma funcionalidad, excepto que puede tener un nombre diferente o requerir una sintaxis ligeramente diferente. Además, noté algunas pequeñas diferencias en los complementos disponibles (nose tiene soporte multiproceso, pytest no parece, por ejemplo)

Por lo que parece, el diablo está en los detalles, lo que significa (a menudo al menos) en el gusto personal y es mejor que vayamos con la biblioteca que mejor se ajuste a nuestro gusto personal.

Entonces, pediría una argumentación subjetiva de por qué debería ir con nose o pytest para elegir la combinación de biblioteca / comunidad que mejor se adapte a nuestras necesidades.

Jakob van Bethlehem
fuente
Acabo de señalar que aquí también se hizo más o menos la misma pregunta , pero eso fue hace cinco años, así que todavía creo que volver a hacer la pregunta tiene sentido
Jakob van Bethlehem
9
pytestadmite soporte multiproceso a través del complemento pytest-xdist .
Bruno Oliveira
2
Por otro lado, los administradores de contexto son simples objetos de Python, y puede llamar manager.__enter__()a su TestCase.setUp()y manager.__exit__()a su tearDown().
rescdsk
3
La nariz ya no se mantiene .
copos tostados

Respuestas:

80

Solía ​​usar Nose porque era el predeterminado con Pylons. No me gustó nada. Tenía zarcillos de configuración en varios lugares, prácticamente todo parecía estar hecho con un complemento poco documentado que lo hacía aún más indirecto y confuso, y debido a que realizaba pruebas unitarias de forma predeterminada, regularmente rompía con los rastreos Unicode, ocultando las fuentes de errores.

He sido bastante feliz con py.test los últimos dos años. Ser capaz de escribir sólo una prueba con assertsacarlo de la caja hace que me gusta escribir pruebas de manera menos, y la piratería lo que tenga encima de la base ha sido bastante fácil. En lugar de una interfaz de complemento fijo, solo tiene montones de ganchos y un código fuente bastante comprensible en caso de que necesite investigar más. Incluso escribí un adaptador para ejecutar pruebas de Testify bajo py.test, y tuve más problemas con Testify que con py.test.

Dicho esto, escuché que nose tiene complementos para pruebas sin clases y afirma la introspección hoy en día, por lo que probablemente te irá bien con cualquiera de ellos. Sin embargo, todavía siento que puedo comenzar a ejecutar con py.test, y puedo entender lo que sucede cuando se rompe.

Eevee
fuente
2
Algunos problemas con la ocultación de trazas se solucionaron alrededor de la nariz 0.11, hace muchos años. Desde el puerto de Python 3, espero que los rastreos unicode sean menos frecuentes (aunque personalmente creo que solo encontré un problema unicode con la nariz una vez, que surgió al combinarlo con alguna clase base de casos de prueba que hizo algún "truco" que no funcionó realmente tiene sentido, así que resultó no ser culpa de Nariz). Sospecho en verdad que a ambas herramientas se les han eliminado los bordes ásperos a lo largo de los años, por lo que tal vez le guste más la que haya usado más recientemente ;-)
Croad Langshan
¿Qué pasa con la parte de documentación reciente? También estoy confundido si debo usar nosetests o py.test. ambos parecen ser igualmente buenos, pero según leo, la mayoría de la gente está usando pruebas de nariz en estos días. ¿Cuál podría ser la razón por la que py.tests tiene un mejor conjunto de bibliotecas de multiprocesamiento disponibles?
proprius
1
@proprius, podría ser que las pruebas de nariz fueran lo primero. algunos marcos agregaron soporte para él, los proyectos que usan esos marcos lo usaron de forma predeterminada y se extendió. Además, aunque py.test puede ejecutar pruebas de nariz y pruebas unitarias, su estilo habitual no se organiza en torno a clases, por lo que la migración a py.test puede resultar abrumadora.
Eevee
4
Empecé a leer la parte de documentación de pytest y me di cuenta de que para propósitos de multiprocesamiento, así como en términos de aprendizaje para un novato, pytest es una mejor opción.
proprius