Escribir pruebas unitarias en Python: ¿cómo empiezo? [cerrado]

534

Completé mi primer proyecto adecuado en Python y ahora mi tarea es escribir pruebas para ello.

Como esta es la primera vez que hago un proyecto, esta es la primera vez que escribiría pruebas para él.

La pregunta es, ¿cómo empiezo? No tengo la mínima idea. ¿Alguien puede señalarme alguna documentación / tutorial / enlace / libro que pueda usar para comenzar a escribir pruebas (y supongo que las pruebas unitarias en particular)

Cualquier consejo será bienvenido sobre este tema.

usuario225312
fuente
44
Nunca es demasiado tarde para escribir exámenes si esa es tu intención. Es mejor tener algo que ninguno para todos los que se quejan ...
Preguntado el
1
Aquí hay un buen libro de desarrollo basado en pruebas que está disponible gratis en línea: chimera.labs.oreilly.com/books/1234000000754/index.html
Será el
44
buen recurso me topé con https://www.jeffknupp.com/blog/2013/12/09/improve-your-python-understanding-unit-testing/ . Como novato en Python, lo encontré comprensible.
ferry
2
La Guía del autoestopista para Python tiene una breve descripción de las herramientas para pruebas unitarias: python-guide-pt-br.readthedocs.io/en/latest/writing/tests
Anton Tarasenko
El comentario anterior debe tener una calificación más alta, ya que la guía también tiene un repositorio de código de ejemplo en github.com/kennethreitz/samplemod, que también es un excelente lugar para comenzar.
Setempler

Respuestas:

101

Si eres nuevo en el uso de pruebas unitarias, el enfoque más simple para aprender es a menudo el mejor. Sobre esa base, recomiendo usar en py.testlugar del unittestmódulo predeterminado .

Considere estos dos ejemplos, que hacen lo mismo:

Ejemplo 1 (prueba de unidad):

import unittest

class LearningCase(unittest.TestCase):
    def test_starting_out(self):
        self.assertEqual(1, 1)

def main():
    unittest.main()

if __name__ == "__main__":
    main()

Ejemplo 2 (pytest):

def test_starting_out():
    assert 1 == 1

Suponiendo que ambos archivos tienen nombre test_unittesting.py, ¿cómo ejecutamos las pruebas?

Ejemplo 1 (prueba de unidad):

cd /path/to/dir/
python test_unittesting.py

Ejemplo 2 (pytest):

cd /path/to/dir/
py.test
Tim McNamara
fuente
77
He oído hablar de la simplicidad de py.test en varios lugares ( docs.python-guide.org/en/latest/writing/tests/#py-test , docs.python.org/3.5/library/unittest.html#module -unittest , jeffknupp.com/blog/2013/12/09/… ) ¿Por qué unit-testtodavía se incluye en la biblioteca estándar, si py.testy noseproporciona la misma funcionalidad con una interfaz mucho más simple? ¿Es sólo para proporcionar compatibilidad con versiones anteriores, o no unittesttener algunas ventajas que py.testy nosetestno puede proporcionar?
alpha_989
@ alpha_989 La biblioteca estándar de Python no tiene la intención de contener las mejores herramientas disponibles. Para eso es PyPI. El unittestpaquete estándar sigue siendo lo suficientemente bueno. Es estándar, lo que significa que está garantizado que funcionará bien. Finalmente, cualquiera que use su código no necesita instalar paquetes adicionales.
Jeyekomon
72

El libro gratuito Python Dive Into Python tiene un capítulo sobre pruebas unitarias que puede resultarle útil.

Si sigue prácticas modernas, probablemente debería escribir las pruebas mientras escribe su proyecto, y no esperar hasta que su proyecto esté casi terminado.

Un poco tarde ahora, pero ahora lo sabes para la próxima vez. :)

Mark Byers
fuente
13
Todavía diría que si desea refactorizar el código que no tiene pruebas unitarias, primero debe escribir pruebas unitarias para él
Hubert Kario el
99
Sí, muchas personas que vienen a las pruebas unitarias por primera vez escuchan lo que suena como "bueno, es demasiado tarde para su proyecto actual" de manos viejas: incluso si eso no es lo que realmente querían decir, eso es lo que escuchan los novatos . Es como el proverbio chino sobre plantar un árbol: el mejor momento para comenzar las pruebas es al comienzo de un proyecto; ¡El segundo mejor momento para comenzar las pruebas es ahora!
JP
44
Sumérgete en el enlace de Python está roto ... :-(
Scott Skiles
40

En mi opinión, hay tres grandes marcos de prueba de Python que son buenos para ver.
unittest - el módulo viene de serie con todas las distribuciones python
nose - puede ejecutar pruebas unittest y tiene menos repetitivo.
pytest : también ejecuta pruebas unitarias, tiene menos repetitivo, mejores informes, muchas características adicionales geniales

Para obtener una buena comparación de todo esto, lea las introducciones de cada uno en http://pythontesting.net/start-here .
También hay artículos extendidos sobre accesorios, y más allí.

Okken
fuente
35

Los documentos para unittest serían un buen lugar para comenzar.

Además, es un poco tarde ahora, pero en el futuro considere escribir pruebas unitarias antes o durante el proyecto mismo. De esa manera, puede usarlos para probar a medida que avanza, y (en teoría) puede usarlos como pruebas de regresión, para verificar que los cambios en su código no hayan roto ningún código existente. Esto le daría el beneficio completo de escribir casos de prueba :)

Justin Ethier
fuente
Eso si quieres un desarrollo basado en pruebas, que no es algo malo. En mi caso, estoy mirando el código existente y tratando de entenderlo escribiendo y ajustando las pruebas para aprobar, y eso me ayudó a comenzar unittest. Una vez que me familiarice con las cosas, lo usaré más para el desarrollo, así como para aumentar el número de casos de prueba para cada unidad.
agua helada el
27

unittest viene con la biblioteca estándar, pero te recomendaría pruebas de nariz .

"la nariz extiende la prueba unitaria para facilitar las pruebas " .

También te recomendaría pylint

" analiza el código fuente de Python buscando errores y signos de mala calidad " .

ssoler
fuente
8

Como otros ya respondieron, es tarde para escribir pruebas unitarias, pero no demasiado tarde. La pregunta es si su código es comprobable o no. De hecho, no es fácil poner a prueba el código existente, incluso hay un libro sobre esto: Trabajar eficazmente con código heredado (ver puntos clave o PDF precursor ).

Ahora escribir las pruebas unitarias o no es su decisión. Solo necesita ser consciente de que podría ser una tarea tediosa. Puede abordar esto para aprender las pruebas unitarias o considerar primero escribir pruebas de aceptación (de extremo a extremo) y comenzar a escribir pruebas unitarias cuando cambie el código o agregue una nueva característica al proyecto.

philant
fuente
2
+1 para "Trabajar eficazmente con código heredado". Se trata de código que no tiene pruebas.
David
3

nosetests es una solución brillante para pruebas unitarias en python. Admite casos de prueba basados ​​en unittest y doctests, y le ayuda a comenzar con un simple archivo de configuración.

Daniel Kluev
fuente
Su enlace de pruebas nasales está obsoleto. Parece que la nueva ubicación es: nose.readthedocs.org/en/latest
odigity
1
Según la documentación en github y el sitio web nosetest, nosey nose2están en modo de mantenimiento. Es mejor comenzar py.testya que tiene mucho más soporte
alpha_989