Python unittest: ejemplo de prueba unitaria

Hoy aprenderemos sobre las pruebas unitarias de Python y veremos ejemplos de programas de pruebas unitarias de Python. En el tutorial anterior aprendimos sobre la función zip de Python .

Prueba unitaria de Python

El módulo unittest de Python se utiliza para probar una unidad de código fuente. Supongamos que necesita probar su proyecto. Sabe qué tipo de datos devolverá la función. Después de escribir un código enorme, necesita comprobar si el resultado es correcto o no. Normalmente, lo que hacemos es imprimir el resultado y compararlo con el archivo de salida de referencia o comprobar el resultado manualmente. Para reducir este problema, Python ha introducido el módulo unittest. Con este módulo puede comprobar el resultado de la función con un código simple. En este tutorial, analizaremos el uso básico del módulo unittest de Python y escribiremos algunos casos de prueba unitaria de Python para probar las funciones de una clase.

Ejemplo de prueba unitaria de Python

En primer lugar, tenemos que escribir un código para realizar pruebas unitarias. Tendremos una clase Python . El objetivo principal de la clase es almacenar y recuperar el nombre de la persona. Por lo tanto, escribimos set_name()una función para almacenar los datos y get_name()una función para recuperar el nombre de la clase.

class Person:    name = []    def set_name(self, user_name):        self.name.append(user_name)        return len(self.name) - 1    def get_name(self, user_id):        if user_id = len(self.name):            return 'There is no such user'        else:            return self.name[user_id]if __name__ == '__main__':    person = Person()    print('User Abbas has been added with id ', person.set_name('Abbas'))    print('User associated with id 0 is ', person.get_name(0))

Hemos llamado al archivo de clase Person.py. Y el resultado del código anterior será el siguiente.

$ python3.6 Person.py User Abbas has been added with id  0User associated with id 0 is  Abbas$

Estructura de pruebas unitarias de Python

Ahora, aprendamos a codificar para pruebas unitarias. Se crea un caso de prueba individual mediante la subclasificación de unittest.TestCase. Al anular o agregar las funciones adecuadas, podemos agregar lógica a la prueba. El siguiente código se ejecutará correctamente si a es igual a b.

import unittestclass Testing(unittest.TestCase):    def test_string(self):        a = 'some'        b = 'some'        self.assertEqual(a, b)    def test_boolean(self):        a = True        b = True        self.assertEqual(a, b)if __name__ == '__main__':    unittest.main()

Cómo ejecutar el módulo unittest de Python

Si está utilizando PyCharm IDE, puede simplemente presionar Ctrl+Shift+F10 para ejecutar el módulo unittest. De lo contrario, puede utilizar el símbolo del sistema para ejecutar este módulo. Por ejemplo, nombramos el archivo para la prueba unitaria como Basic_Test.py. Entonces, el comando para ejecutar python unittest será: $python3.6 -m unittest Basic_Test.TestingSi desea ver el detalle, entonces el comando será; $python3.6 -m unittest -v Basic_Test.TestingAl utilizar PyCharm, obtenemos el siguiente resultado.

Resultados de la prueba unitaria de Python y funciones básicas

Esta prueba unitaria tiene 3 resultados posibles, que se mencionan a continuación:

  1. OK: Si se pasan todos los casos de prueba, la salida muestra OK.
  2. Error: si alguno de los casos de prueba falló y generó una excepción AssertionError
  3. Error: si se genera alguna excepción que no sea AssertionError.

El módulo unittest incluye varias funciones, que se enumeran a continuación.

Método Comprueba que
afirmarIgual(a,b) a==b
afirmarNoIgual(a,b) a!=b
afirmarVerdadero(x) bool(x) es verdadero
afirmarFalso(x) bool(x) es falso
afirmarEs(a,b) a es b
afirmarEs(a,b) a es b
afirmarNoEs(a, b) a no es b
afirmarNoEsNinguno(x) x es Ninguno
afirmarNoEsNinguno(x) x no es Ninguno
afirmarEn(a, b) a en b
afirmarNoEn(a, b) a no en b
afirmarEsInstancia(a, b) esinstancia(a, b)
afirmarNoEsInstancia(a, b) no esinstancia(a,b)

Ejemplo de prueba unitaria de Python

Ahora es el momento de escribir pruebas unitarias para nuestra clase fuente Person. En esta clase hemos implementado dos funciones get_name()y set_name(). Ahora, probaremos esas funciones usando unittest. Por lo tanto, hemos diseñado dos casos de prueba para esas dos funciones. Eche un vistazo al siguiente código, lo entenderá fácilmente.

import unittest# This is the class we want to test. So, we need to import itimport Person as PersonClassclass Test(unittest.TestCase):    """    The basic class that inherits unittest.TestCase    """    person = PersonClass.Person()  # instantiate the Person Class    user_id = []  # variable that stores obtained user_id    user_name = []  # variable that stores person name    # test case function to check the Person.set_name function    def test_0_set_name(self):        print("Start set_name testn")        """        Any method which starts with ``test_`` will considered as a test case.        """        for i in range(4):            # initialize a name            name = 'name' + str(i)            # store the name into the list variable            self.user_name.append(name)            # get the user id obtained from the function            user_id = self.person.set_name(name)            # check if the obtained user id is null or not            self.assertIsNotNone(user_id)  # null user id will fail the test            # store the user id to the list            self.user_id.append(user_id)        print("user_id length = ", len(self.user_id))        print(self.user_id)        print("user_name length = ", len(self.user_name))        print(self.user_name)        print("nFinish set_name testn")    # test case function to check the Person.get_name function    def test_1_get_name(self):        print("nStart get_name testn")        """        Any method that starts with ``test_`` will be considered as a test case.        """        length = len(self.user_id)  # total number of stored user information        print("user_id length = ", length)        print("user_name length = ", len(self.user_name))        for i in range(6):            # if i not exceed total length then verify the returned name            if i  length:                # if the two name not matches it will fail the test case                self.assertEqual(self.user_name[i], self.person.get_name(self.user_id[i]))            else:                print("Testing for get_name no user test")                # if length exceeds then check the 'no such user' type message                self.assertEqual('There is no such user', self.person.get_name(i))        print("nFinish get_name testn")if __name__ == '__main__':    # begin the unittest.main()    unittest.main()

Tenga en cuenta que el módulo unittest ejecuta las funciones de prueba en el orden de su nombre, no en el orden en que están definidas. Y como queremos que nuestra prueba set_name se ejecute primero, hemos nombrado nuestras funciones de caso de prueba como test_0_set_namey test_1_get_name.

Ejemplo de salida de prueba unitaria de Python

Las siguientes imágenes muestran la salida generada por nuestro programa de prueba unitaria, tanto en modo normal como en modo detallado.

$ python3.6 -m unittest -v PersonTest.Testtest_0_set_name (PersonTest.Test) ... Start set_name testuser_id length =  4[0, 1, 2, 3]user_name length =  4['name0', 'name1', 'name2', 'name3']Finish set_name testoktest_1_get_name (PersonTest.Test) ... Start get_name testuser_id length =  4user_name length =  4Testing for get_name no user testTesting for get_name no user testFinish get_name testok----------------------------------------------------------------------Ran 2 tests in 0.000sOK$

Eso es todo acerca del tutorial de pruebas unitarias de Python. Para obtener más información, lea la Documentación oficial . Si tiene alguna otra consulta, utilice el cuadro de comentarios.

SUSCRÍBETE A NUESTRO BOLETÍN 
No te pierdas de nuestro contenido ni de ninguna de nuestras guías para que puedas avanzar en los juegos que más te gustan.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Scroll al inicio