Ejemplo de prueba de unidad de Python unittest

Hoy aprenderemos sobre python unittest y revisaremos programas de ejemplo de python unit test. En el tutorial anterior, aprendimos sobre la función zip de Python.

Python unittest

El módulo unittest de Python se utiliza para probar una unidad de código fuente. Supongamos que necesitas probar tu proyecto. Sabes qué tipo de datos devolverá la función. Después de escribir un código extenso, necesitas verificar si la salida es correcta o no. Normalmente, lo que hacemos es imprimir la salida y compararla con el archivo de salida de referencia o verificar la salida manualmente. Para reducir esta molestia, Python ha introducido el módulo unittest. Utilizando este módulo, puedes verificar la salida de la función con un código simple. En este tutorial, discutiremos sobre el uso básico del módulo unittest de Python y escribiremos algunos casos de prueba de unidad de Python para probar las funciones de una clase.

Ejemplo de código fuente de Python Unit Test

Primero que nada, tenemos que escribir un poco de código para probarlos unitariamente. Tendremos una clase Python. El propósito principal de la clase es almacenar y recuperar el nombre de una persona. Así que, escribimos la función set_name() para almacenar los datos y la función get_name() 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 nombrado el archivo de la clase como Person.py. Y la salida del código anterior será como sigue.

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

Estructura de pruebas unitarias en Python

Ahora, aprendamos cómo codificar para pruebas unitarias. Un caso de prueba individual se crea mediante la subclasificación de unittest.TestCase. Al sobrescribir o agregar funciones apropiadas, podemos agregar lógica para realizar pruebas. El siguiente código será exitoso si a es igual a b.

import unittest


class 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 de pruebas unitarias de Python

Si estás utilizando el entorno de desarrollo PyCharm, simplemente presiona ctrl+shift+F10 para ejecutar el módulo de pruebas unitarias. De lo contrario, puedes usar la línea de comandos para ejecutar este módulo. Por ejemplo, si hemos nombrado el archivo para las pruebas unitarias como Basic_Test.py, el comando para ejecutar las pruebas unitarias de Python sería: $python3.6 -m unittest Basic_Test.Testing. Si deseas ver más detalles, el comando sería: $python3.6 -m unittest -v Basic_Test.Testing. Al utilizar PyCharm, obtenemos la siguiente salida.

Resultado y Funciones Básicas de las Pruebas Unitarias en Python

Este módulo de pruebas unitarias tiene 3 resultados posibles. Se mencionan a continuación:

  1. OK: Si todos los casos de prueba son exitosos, la salida muestra OK.
  2. Fallo: Si alguno de los casos de prueba falla y genera una excepción AssertionError
  3. Error: Si se produce alguna excepción que no sea una excepción AssertionError.

Existen varias funciones en el módulo de pruebas unitarias. Se enumeran a continuación.

Method Checks that
assertEqual(a,b) a==b
assertNotEqual(a,b) a != b
assertTrue(x) bool(x) is True
assertFalse(x) bool(x) is False
assertIs(a,b) a is b
assertIs(a,b) a is b
assertIsNot(a, b) a is not b
assertIsNone(x) x is None
assertIsNotNone(x) x is not None
assertIn(a, b) a in b
assertNotIn(a, b) a not in b
assertIsInstance(a, b) isinstance(a, b)
assertNotIsInstance(a, b) not isinstance(a, b)

Ejemplo de prueba unitaria en 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, vamos a probar esas funciones usando unittest. Así que hemos diseñado dos casos de prueba para esas dos funciones. Echa un vistazo al siguiente código, lo entenderás fácilmente.

import unittest

# Esta es la clase que queremos probar. Por lo tanto, necesitamos importarla
import Person as PersonClass


class 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

    # función de caso de prueba para verificar la función Person.set_name
    def test_0_set_name(self):
        print("Start set_name test\n")
        """
        Any method which starts with ``test_`` will considered as a test case.
        """
        for i in range(4):
            # inicializar un nombre
            name = 'name' + str(i)
            # almacenar el nombre en la variable de lista
            self.user_name.append(name)
            # obtener el id de usuario obtenido de la función
            user_id = self.person.set_name(name)
            # verificar si el id de usuario obtenido es nulo o no
            self.assertIsNotNone(user_id)  # null user id will fail the test
            # almacenar el id de usuario en la lista
            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 test\n")

    # función de caso de prueba para verificar la función Person.get_name
    def test_1_get_name(self):
        print("\nStart get_name test\n")
        """
        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):
            # si no se excede la longitud total, entonces verificar el nombre devuelto
            if i < length:
                # si los dos nombres no coinciden, fallará el caso de prueba
                self.assertEqual(self.user_name[i], self.person.get_name(self.user_id[i]))
            else:
                print("Testing for get_name no user test")
                # si la longitud excede, entonces verificar el mensaje de tipo 'no such user'
                self.assertEqual('There is no such user', self.person.get_name(i))
        print("\nFinish get_name test\n")


if __name__ == '__main__':
    # comenzar el unittest.main()
    unittest.main()

Es importante tener 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 de set_name se ejecute primero, hemos nombrado nuestras funciones de caso de prueba como test_0_set_name y test_1_get_name.

Ejemplo de salida de prueba de unidad de Python

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

$ python3.6 -m unittest -v PersonTest.Test
test_0_set_name (PersonTest.Test) ... Start set_name test

user_id length =  4
[0, 1, 2, 3]
user_name length =  4
['name0', 'name1', 'name2', 'name3']

Finish set_name test

ok
test_1_get_name (PersonTest.Test) ... 
Start get_name test

user_id length =  4
user_name length =  4
Testing for get_name no user test
Testing for get_name no user test

Finish get_name test

ok

----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK
$

Eso es todo sobre el tutorial de unittest de Python. Para obtener más información, lea la Documentación Oficial. Para cualquier consulta adicional, utilice el cuadro de comentarios. 🙂

Source:
https://www.digitalocean.com/community/tutorials/python-unittest-unit-test-example