Descubrimiento de prueba de unidad de Python

Salman Mehmood 10 octubre 2023
Descubrimiento de prueba de unidad de Python

Este artículo nos enseñará sobre la prueba unitaria y cómo ejecutarla para una pieza de código en particular. Aprenderemos el uso del comando descubrir para reconocer el nombre del módulo automáticamente y por qué puede no funcionar en Python.

Use el módulo unittest para reconocer el módulo de prueba con la ayuda del comando discover en Python

No podemos tocar, oler o sentir el software para determinar su calidad, pero podemos probarlo usando una herramienta de prueba. La prueba unitaria es el método que instancia una pequeña parte de su aplicación y verifica su comportamiento independientemente de otras partes.

En otras palabras, toma una pequeña parte de su código y lo prueba en una pequeña función por separado. Esta parte del desarrollo a menudo se omite, lo que lleva a que la prueba de su software por parte del cliente sea una experiencia de usuario deficiente.

Una prueba unitaria típica tiene tres fases: Organizar, Actuar y Afirmar.

Arrange crea las condiciones adecuadas para que la prueba unitaria se ejecute o instancia un objeto. Act le da a ese objeto alguna entrada o datos, y Assert verifica si los datos de salida fueron los esperados.

Creemos un nuevo archivo llamado demo.py y comencemos a escribir un código; crearemos dos funciones que suman y restan dos números. Estas funciones solo pueden aceptar números enteros o flotantes como argumento; de lo contrario, arrojará un TypeError.

def Add_TWO_NUM(a, b):
    return a + b


def SUB_TWO_NUM(a, b):
    return a - b

Ahora, crearemos un archivo test_functions.py para la prueba usando unittest porque unittest viene integrado con la distribución de Python. No necesitamos hacer nada para instalarlo; sin embargo, podemos importar unittest en nuestro código.

Hemos añadido aquí este prefijo extra, test_, delante del nombre de nuestro archivo, que es functions.py. Este prefijo test_ ayudará a unittest a reconocer que este es el archivo en el que se escriben las funciones de prueba unitaria.

Primero, como puede ver, importamos el módulo unittest y luego importamos la función de los módulos que queremos probar, y luego inicializamos una clase llamada TesstSomeFunctions. Si necesita escribir una clase de prueba, debe escribir una clase de prueba antes de escribir todas las funciones de prueba.

Como estamos probando, es por eso que entre paréntesis, debemos darle unittest.TestCase; la clase definida por el usuario debe derivarse de unittest.TestCase. Ejecutar una prueba es la única manera de que las funciones sean invocadas por unittest; es un caso de pruebas unitarias, y cada función en esta clase será una sola prueba unitaria.

Podemos definir esto como cualquier otra función en nuestro script de Python y escribir la palabra clave def. Luego comience el nombre con el prefijo de prueba como test_, y luego cualquier nombre que podamos darle.

El módulo unittest nos proporciona aserción. Puede ver todos los activos en el módulo unittest usando unittest. o todos los métodos en la documentación oficial.

Usando el método assertEqual(), comprobaremos si esta función devuelve 10 o no. La afirmación indica que desea afirmar que la función devuelve el resultado deseado como esperamos el resultado 10.

Proporcionamos 4 y 6 como argumento para esta función Add_TWO_NUM(). En el segundo argumento del método assertEqual(), proporcionamos una comprobación de si es igual o no.

También probaremos otra función llamada test_SUB_TWO_NUM(), el proceso sería el mismo, pero en esta función estamos probando una función que resta dos números. Ahora tenemos que bajar al archivo y escribir una línea if __name__=='__main__' y ejecutar la prueba unitaria usando el comando unittest.main().

import unittest
from demo import Add_TWO_NUM, SUB_TWO_NUM


class TesstSomeFunctions(unittest.TestCase):
    def test_Add_TWO_NUM(self):
        self.assertEqual(Add_TWO_NUM(4, 6), 10)

    def test_SUB_TWO_NUM(self):
        self.assertEqual(SUB_TWO_NUM(5, 3), 2)


if __name__ == "__main__":
    unittest.main()

Los dos casos de prueba ahora están listos, así que ejecutemos el archivo de Python. Como puede ver, nos dio información sobre las dos pruebas que se ejecutaron en 0,0 segundos.

Estos dos puntos representan las pruebas superadas. Vería una F mayúscula si no pasa la prueba.

..
----------------------------------------------------------------------
Ran 2 tests in 0.001s

OK

¿Qué sucede si no desea ejecutar su módulo de prueba desde el archivo como un módulo? Bueno, puedes hacerlo escribiendo el comando en la terminal.

python -m unittest test_functions.py

Este comando funciona igual.

..
----------------------------------------------------------------------
Ran 2 tests in 0.001s

OK

Si desea más información, puede poner v -, que significa detallado, brindándole más detalles sobre cada prueba unitaria. Te dice qué prueba es la mejor.

python -m unittest -v test_functions.py

Producción :

test_Add_TWO_NUM (test_functions.TesstSomeFunctions) ... ok
test_SUB_TWO_NUM (test_functions.TesstSomeFunctions) ... ok

----------------------------------------------------------------------
Ran 2 tests in 0.002s

OK

También existe una tercera opción para ejecutar la prueba unitaria desde el terminal, descubrir. Este comando descubrirá automáticamente todos los módulos que comienzan con una prueba, por lo que no necesitamos pasar el nombre del módulo individualmente.

Por eso es fundamental nombrar todos tus módulos empezando por test.

python -m unittest discover

Producción :

..
----------------------------------------------------------------------
Ran 2 tests in 0.001s

OK

Si el nombre del archivo de prueba no comienza con “prueba”, entonces el comando “descubrir” no devolverá nada porque lo reconoce como un archivo o módulo normal de Python. Para obtener más información sobre el módulo unittest, puede visitar python.org.

Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn

Artículo relacionado - Python Unit Test