Primeros pasos con las pruebas en Python

¡Aquí aprenderemos cómo crear una prueba básica, ejecutarla y encontrar los errores antes que los usuarios! Aprenderá sobre las herramientas disponibles para escribir y ejecutar pruebas y también verá términos de prueba como pruebas automatizadas, manuales, unitarias y de integración.

Pruebas automatizadas vs. manuales 

automatizado  Prueba manual 
 
El software de automatización de pruebas junto con las herramientas de prueba ejecutan los casos de prueba. Explícitamente humanos involucrados en la ejecución de las pruebas paso a paso, y pueden estar probando sin scripts de prueba.
Los casos de prueba están escritos por ingenieros de control de calidad, pero la ejecución es completamente automática y es bastante más rápida y se ejecutará en un número n de escenarios diferentes. Los analistas y los ingenieros de control de calidad deben involucrarse en las pruebas de extremo a extremo y requieren mucho tiempo.
En Python, necesitamos instalar un paquete llamado «unittest». En Python, a través de “Pruebas de Caja Blanca”, “Pruebas Unitarias”, “Pruebas de Integración”, etc., se pueden realizar metodologías, Pruebas Manuales.

Pruebas unitarias frente a pruebas de integración 

Pruebas unitarias  Pruebas de integración 
Las pruebas unitarias funcionan componente por componente y, por lo tanto, si se prueba algún componente pequeño, debemos realizar pruebas unitarias. Las pruebas de integración funcionan en todo el componente, podemos concluir que muchas pruebas unitarias hacen pruebas de integración. Y también un software está completo si se completa la prueba de integración completa
Prueba de cálculo de suma solo en un programa de calculadora para un conjunto específico de argumentos Comprobación de todas las operaciones aritméticas como sumas, restas, etc., (lo que esté presente en el programa de calculadora) con diferentes conjuntos de argumentos

Ejemplo de prueba unitaria:

Python3

# define a function
def test_sum_numbers():
    assert sum([100, 200, 300,400]) == 1000, "Result should be 1000"
 
# define a function
def test_sum_tuple_values():
    assert sum((100, 200, 200,400)) == 1000, "Result should be 1000"
 
# Driver code
if __name__ == "__main__":
   
    test_sum_numbers()
    test_sum_tuple_values()
     
    print("Checking whether all tests are passed or not")

Producción:

Traceback (most recent call last):
 File "....../test_example.py", line 9, in <module>
   test_sum_tuple_values()
 File "...../test_example.py", line 5, in test_sum_tuple_values
   assert sum((100, 200, 200,400)) == 1000, "Result should be 1000"
AssertionError: Result should be 1000

En el ejemplo anterior, tenemos dos métodos aquí y cuando se ejecuta el código, el segundo método arroja un error ya que los valores dados no producen 1000. 

Elegir un corredor de prueba: 

Test Runner es una biblioteca o una herramienta de prueba que lee el código fuente que contiene pruebas unitarias y un montón de configuraciones que se pueden ejecutar y produce su salida a la consola o archivos de registro. 
Hay diferentes Test Runners disponibles en Python. uno popular son 

  • prueba de unidad
  • nariz o nose2
  • pytest

unittest  : está integrado en la biblioteca estándar de python.  import unittest  debe ser la línea de inicio del código para usarlo. Depende de la versión de python, debería diferir ya que las versiones posteriores de Python admiten unittest y las versiones anteriores admitían unittest2. 
A continuación se muestra un fragmento de código de Python que usa unittest:

Python3

# import library
import unittest
 
# create a class
class TestXXXXX(unittest.TestCase):
   
      # define a function
    def test_xxxxxxx(self):
       
        data = [100, 200, 300]
        result = sum(data)
        self.assertEqual(result, 6000)
 
# driver code
if __name__ == '__main__':
   
    unittest.main()

Producción:

======================================================================
.F
FAIL: test_xxxxxxx (__main__.TestXXXXX)
----------------------------------------------------------------------
Traceback (most recent call last):
 File "......py", line 8, in test_xxxxxxx
   self.assertEqual(result, 6000)
AssertionError: 600 != 6000
----------------------------------------------------------------------
Ran 1 test in 0.001s
FAILED (failures=1)

nose o nose2: esta es una aplicación de código abierto y similar únicamente a unittest. Es compatible con numerosos tipos de pruebas que se escriben utilizando el marco unittest. nose2 es la versión más reciente, y se instalan usando. 

pip install nose2 

pytest: Soporta la ejecución de casos de prueba unittest. Tiene beneficios como admitir declaraciones de afirmación incorporadas, filtrado de casos de prueba, regreso de la última prueba fallida, etc.

Python3

def test_sum_numbers_using_pytest():
    assert sum([700, 900]) == 1600, "Resultant should be 1600"
 
def test_sum_tuple_using_pytest():
    assert sum((700,1900)) == 1600, "Resultant should be 1600"

No es necesario escribir la clase, el punto de entrada de la línea de comando, etc.,

Cómo estructurar una prueba simple:

  1. Para escribir una prueba, necesita saber qué se va a probar.
  2. ¿Cubre pruebas unitarias y/o pruebas de integración?
  3. Todo tipo de entradas necesarias (puede variar entre enteros, flotantes, tipos de datos de tipo, etc.) y el código para su ejecución y obtener la salida y comparar la salida con el resultado esperado.

Cómo escribir afirmaciones:

La afirmación no es más que validar la salida contra una respuesta conocida. es decir, en el código anterior, hemos pasado la lista que contiene 3 valores, a saber, 10, 20 y 30, y sabemos que su resultado de multiplicación es 6000. Entonces, como último paso en el código, escribiremos el código de aserción y el código anterior aparece con afirmarEqual y seguramente dará la salida como 6000 y, por lo tanto, pasa el caso de prueba. 

unittest tiene muchos métodos para afirmar los valores, tipos y existencia de variables. 
Veamos algunos: 

.assertEqual(one,two) means one == two (Our above example) 
.assertTrue(expr) means boolean(expr) is True 
.assertFalse(expr) means boolean(expr) is False 
.assertIs(one,two) means one is two 

También tenemos métodos opuestos como:

 .assertIsNot(one,two) means one is not two. 
.assertIsNone(x) vs .assertIsNone(x) 
.assertIn(x, y) vs .assertNotIn(x, y) 
.assertIsInstance(m, n) vs .assertNotIsInstance(m,n) 

Efectos secundarios:

La ejecución continua de una pieza de código tiene la posibilidad de alterar otras cosas para cambiar, como el atributo de una clase o incluso un valor en la base de datos. Por lo tanto, estos deben decidirse antes de realizar las pruebas. Se debe considerar la refactorización del código para romper los efectos secundarios y escribir pruebas unitarias simples y repetibles. 

Ejecución de pruebas desde PyCharm:

Podemos ejecutar unittest o pytest siguiendo los pasos y esto es aplicable para ejecutar todas las pruebas en un directorio:

  1. Primero desde la ventana de la herramienta del proyecto, seleccione el directorio de pruebas
  2. Luego, en el menú contextual, seleccione «UnitTests in» o «PyTests in». 
    Para pruebas individuales,
    • A través de la barra de herramientas principal usando el comando Ejecutar o Depurar
    • A través del menú contextual usando Ejecutar o Depurar haciendo clic en el archivo específico

Pruebas para marcos web como Django y Flask:

Basado en unittest, Django y Flask facilitan las cosas y tienen su marco de prueba:

 Django Test Runner: la plantilla Django startapp habrá creado un archivo tests.py dentro del directorio de su aplicación. Si aún no lo tiene, puede crearlo con los siguientes contenidos:

Python3

from django.test import TestCase
 
class RequiredTestCases(TestCase):
    # Write all Test methods

Para ejecutar el traje de prueba, necesitamos dar como:

python manage.py test

Use unittest y Flask  : Flask requiere que la aplicación se importe en un archivo y luego se configure en modo de prueba. Puede crear una instancia de un cliente de prueba y utilizar el cliente de prueba para realizar requests a cualquier ruta en su aplicación.

Toda la instanciación del cliente de prueba se realiza en el método setUp() de su caso de prueba. 

Python3

# import our application file
import my_app
 
# import library
import unittest
 
class FlaskTestCase(unittest.TestCase):
 
    def setUp(self):
        my_app.app.testing = True
        self.app = my_app.app.test_client()
 
    def test_home(self):
        result = self.app.get('/')

Los casos de prueba se pueden ejecutar usando el siguiente comando (a través de la línea de comando):

 python -m unittest discover

Escenarios de prueba más avanzados:

  • Se utiliza un dispositivo que no es más que los datos que se crean como entrada y se reutilizan.
  • Se puede seguir la parametrización, que no es más que ejecutar la misma prueba varias veces pasando diferentes valores y esperando el mismo resultado.
  • Necesita cubrir diferentes escenarios como manejar fallas esperadas, escribir pruebas de integración, probar en múltiples entornos, etc.

El siguiente ejemplo muestra cómo escribir una prueba para un tipo de datos incorrecto:

Python3

import unittest
 
class TestSumDifferentPatterns(unittest.TestCase):
    def test_list_tuple_values(self):
       
        # Summation of numbers present
        # in a tuple value
        data = (10*2, 200*2)
        result = sum(data)
        self.assertEqual(result, 600)
 
    def test_bad_data_type(self):
        data = "alpha value passed instead of numeric"
        # Because of the below condition, TypeError
        # occurs and hence it will not proceed
        # to next step
        with self.assertRaises(TypeError):
            result = sum(data)
 
if __name__ == '__main__':
    unittest.main()

Producción

.F
======================================================================
FAIL: test_list_tuple_values (__main__.TestSumDifferentPatterns)
----------------------------------------------------------------------
Traceback (most recent call last):
 File "......py", line 10, in test_list_tuple_values
   self.assertEqual(result, 600)
AssertionError: 420 != 600
----------------------------------------------------------------------
Ran 2 tests in 0.001s
FAILED (failures=1)

Automatización de la Ejecución de Pruebas:

Las herramientas de integración continua/implementación continua están disponibles. Ayudan a ejecutar pruebas, compilar, publicar y también implementar en producción.
https://travis-ci.com/ es uno de ellos que funciona bien con Python y es un proyecto de código abierto. Inicie sesión en el sitio y cree. travis.yml con el siguiente contenido:

language: python 
python:
<Incluir las versiones como 2.7 o 3.7 según sea necesario>

install:
– pip install -r <su archivo de requisitos>

script: 
– python -m unittest descubrir

El archivo anterior le indica a «Travis CI» que busque en este archivo y, para las versiones de Python dadas, los casos de prueba se prueban instalando los paquetes necesarios como se indica en el archivo de requisitos y finalmente ejecuta el siguiente comando para ejecutar la prueba.

 python -m unittest discover 

 Los resultados están en el sitio web contra su credencial

Publicación traducida automáticamente

Artículo escrito por priyarajtt y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

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