Ningún buen desarrollador implementa código sin realizar pruebas exhaustivas. La prueba unitaria es el proceso de probar los módulos individuales de un programa grande.
Este artículo discutirá cómo puede realizar pruebas unitarias de su código utilizando el módulo de prueba unitaria de Python. Primero, entendamos cuáles son los tipos de pruebas.
Cuando se trata de las pruebas , hay pruebas manuales y pruebas automáticas. Prueba manual es una técnica de prueba en la que los humanos realizan la prueba manualmente después de completar el desarrollo. Pruebas de automatización es una técnica de prueba donde los programas realizan la prueba automáticamente y nos dan los resultados.
Habría entendido que las pruebas manuales requieren tiempo y son difíciles de realizar. Entonces, los desarrolladores escriben código para realizar pruebas (pruebas automáticas). Hay diferentes tipos de pruebas en las pruebas automatizadas. Algunos de ellos son Pruebas unitarias, pruebas integradoras, pruebas de un extremo a otro, pruebas de estrés, etc ..,
Veamos el flujo estándar de pruebas.
- Escribe o actualiza el código.
- Escriba o actualice pruebas para diferentes casos para su código.
- Ejecute las pruebas (ya sea manualmente o con un corredor de pruebas).
- Vea los resultados de la prueba. Si hay algún error, corríjalo y repita los pasos.
Aquí, vamos a discutir el tipo de prueba más esencial y básico llamado examen de la unidad. Sin más preámbulos, profundicemos en el tutorial real.
What is Unit Testing?
La prueba unitaria es una técnica para probar un pequeño bloque de código independiente. El código de bloque pequeño será una función en la mayoría de los casos. La palabra independiente significa que no depende de otras piezas de código del proyecto.
Digamos que tenemos que comprobar si una cadena es igual a "Geekflare" o no. Para eso, hemos escrito una función que toma un argumento y devuelve si es igual a "Geekflare" o no.
def is_equal_to_geekflare(string):
return string == "Geekflare"
La función anterior no depende de ningún otro código. Entonces, podemos probarlo de forma independiente dando diferentes entradas. La pieza de código independiente se puede utilizar en todo el proyecto.
Importance of Unit Testing
En general, el código de bloques independientes se puede utilizar en todo el proyecto. Por lo tanto, debe estar bien redactado y probado. Las pruebas unitarias son las pruebas que se utilizan para probar esos tipos de bloques de código independientes. ¿Qué sucede si no usamos pruebas unitarias para nuestro proyecto?
Supongamos que no probamos pequeños bloques de código que se utilizan en todo el proyecto. Todas las demás pruebas, como las pruebas de integración, las pruebas de extremo a extremo, etc., que utilizan los otros bloques pequeños de código pueden fallar. Esto rompe la aplicación. Es por eso que los bloques de construcción básicos del código deben probarse bien.
Ahora, sabemos la importancia de las pruebas unitarias y las pruebas unitarias escritas para todos los bloques de código independientes. Dado que hemos realizado pruebas unitarias, otras pruebas como integración las pruebas, las pruebas de extremo a extremo, etc., no fallarán debido al bloque independiente de códigos.
En las próximas secciones, veremos qué es el módulo unittest de Python y cómo usamos el módulo unittest para escribir pruebas unitarias en Python.
Nota: Suponemos que está familiarizado con las clases, los módulos, etc. de Python. Si no está familiarizado con los conceptos intermedios de Python, como clases, módulos, etc., es posible que le resulte difícil comprender las secciones siguientes.
What is Python unittest?
La prueba unitaria de Python es un marco de prueba integrado para probar el código Python. Tiene un corredor de pruebas, lo que nos permite ejecutar las pruebas sin mucho esfuerzo. Entonces, podemos usar el prueba de unidad módulo para probar sin utilizar los módulos de terceros. Pero cambia según sus requisitos. El incorporado prueba de unidad El módulo es bueno para comenzar con las pruebas en Python.
Tenemos que seguir los pasos a continuación para probar el código Python usando el módulo unittest.
#1. Escribe el código.
#2. Importar el unittest
módulo.
#3. Cree un archivo que comience con la palabra clave test
. Por ejemplo test_prime.py
. La palabra clave test se utiliza para identificar los archivos de prueba.
#4. Crea una clase ampliando la clase unittest.TestCase
.
#5. Escribe métodos (pruebas) dentro de la clase. Cada método contiene diferentes casos de prueba según sus requisitos. Debemos nombrar el método comenzando con test
palabra clave.
#6. Ejecute las pruebas. Podemos ejecutar las pruebas de diferentes formas.
- Ejecuta el comando
python -m unittest test_filename.py
. - Ejecutamos los archivos de prueba como archivos generales de Python con el comando
python test_filename.py
. Para que este método funcione, necesitamos invocar elmain
método de launittest
en el archivo de prueba. - Y finalmente, usando el
discover
. Podemos ejecutar automáticamente las pruebas usando el comandopython -m unittest discover
sin mencionar el nombre de archivo de la prueba. Encontrará las pruebas utilizando la convención de nomenclatura que seguimos. Entonces, debemos nombrar nuestros archivos de prueba con la palabra clavetest
en el arranque.
Generalmente, en las pruebas, comparamos la salida del código con la salida esperada. Entonces, para comparar las salidas prueba de unidad proporciona diferentes métodos. Puede encontrar la lista de funciones de comparación aquí.
Puede comprenderlos fácilmente sin ninguna dificultad. Son sencillos.
Eso es mucha teoría. Ahora debemos meternos en la codificación.
Nota: Si tiene alguna consulta sobre el módulo unittest, puede ir a la documentación y despeja tus dudas. Sin más demora, usemos el módulo unittest.
Unit Tests in Python using unittest
Primero escribiremos algunas funciones y luego nos centraremos en escribir las pruebas. Primero, abra una carpeta en su favorito Editor de código. Y crea un archivo llamado utils.py
. Pegue el siguiente código en el archivo.
import math
def is_prime(n):
if n < 0:
return 'Negative numbers are not allowed'
if n <= 1:
return False
if n == 2:
return True
if n % 2 == 0:
return False
for i in range(2, int(math.sqrt(n)) + 1):
if n % i == 0:
return False
return True
def cubic(a):
return a * a * a
def say_hello(name):
return "Hello, " + name
Tenemos tres funciones diferentes en el utils.py
expediente. Ahora, tenemos que probar cada función con diferentes casos de prueba. Escribamos las pruebas para la primera función. is_prime
.
#1. Crea un archivo llamado test_utils.py
en la carpeta de muestra como utils.py
.
#2. Importar el utils
y unittest
módulo.
#3. Crea una clase con el nombre TestUtils
extensión unittest.TestCase
clase. El nombre de la clase puede ser cualquier cosa. Intente darle a la clase un nombre significativo.
#4. Dentro de la clase, escribe un método llamado test_is_prime
que acepta self
como argumento
#5. Escriba diferentes casos de prueba con argumentos al is_prime
y compare la salida con la salida esperada.
#6. Caso de prueba de ejemplo self.assertFalse(utils.is_prime(1))
.
#7. Esperamos el resultado del is_prime(1)
será falso en el caso anterior.
#8. Al igual que en el caso anterior, realizaremos diferentes casos de prueba en función de la función que estamos probando.
Veamos las pruebas.
import unittest
import utils
class TestUtils(unittest.TestCase):
def test_is_prime(self):
self.assertFalse(utils.is_prime(4))
self.assertTrue(utils.is_prime(2))
self.assertTrue(utils.is_prime(3))
self.assertFalse(utils.is_prime(8))
self.assertFalse(utils.is_prime(10))
self.assertTrue(utils.is_prime(7))
self.assertEqual(utils.is_prime(-3),
"Negative numbers are not allowed")
if __name__ == '__main__':
unittest.main()
Estamos invocando el main
método de unittest
el módulo para ejecutar las pruebas usando python filename.py
El comando. Ahora, ejecute las pruebas.
Verá una salida similar a la siguiente.
$ python test_utils.py
.
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
Ahora, intente escribir también los casos de prueba para otras funciones. Piense en diferentes casos para las funciones y escriba pruebas para ellos. Eche un vistazo a las siguientes pruebas que se agregan a la clase anterior.
...
class TestUtils(unittest.TestCase):
def test_is_prime(self):
...
def test_cubic(self):
self.assertEqual(utils.cubic(2), 8)
self.assertEqual(utils.cubic(-2), -8)
self.assertNotEqual(utils.cubic(2), 4)
self.assertNotEqual(utils.cubic(-3), 27)
def test_say_hello(self):
self.assertEqual(utils.say_hello("Geekflare"), "Hello, Geekflare")
self.assertEqual(utils.say_hello("Chandan"), "Hello, Chandan")
self.assertNotEqual(utils.say_hello("Chandan"), "Hi, Chandan")
self.assertNotEqual(utils.say_hello("Hafeez"), "Hi, Hafeez")
...
Usamos solo algunas de las funciones de comparación del unittest
módulo. Puedes encontrar la lista completa aquí.
Hemos aprendido a escribir pruebas unitarias utilizando el módulo unittest. Ahora es el momento de ver diferentes formas de ejecutar las pruebas.
How to Run Tests using unittest
Ya hemos visto una forma de ejecutar los casos de prueba en la sección anterior. Veamos las otras dos formas de ejecutar las pruebas usando el módulo unittest.
#1. Usando el nombre del archivo y el módulo unittest.
En este método, usaremos el módulo unittest y el nombre del archivo para ejecutar las pruebas. El comando para ejecutar las pruebas es python -m unittest filename.py
. En nuestro caso, el comando para ejecutar las pruebas es python -m unittest test_utils.py
.
#2. Usando el método de descubrimiento
Usaremos el discover
método del módulo unittest para detectar automáticamente todos los archivos de prueba y ejecutarlos. Para detectar automáticamente los archivos de prueba, debemos nombrarlos comenzando con la palabra clave test
.
El comando para ejecutar las pruebas usando el método de descubrimiento es python -m unittest discover
. El comando detectará todos los archivos cuyos nombres comiencen con test
y ejecutarlos.
Conclusión 👩💻
Las pruebas unitarias son pruebas básicas en el mundo de la programación. Hay muchas otras pruebas en el mundo real. Trate de aprenderlos una por una. Espero que este tutorial te ayude a escribir pruebas básicas en Python usando el módulo unittest. Hay bibliotecas de terceros como pytest, Robot Framework, nose, nose2, slash, etc. Puede explorarlas según los requisitos de su proyecto.
Feliz prueba 😎
También podría interesarle Preguntas y respuestas de la entrevista de Python.