¡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:
- Para escribir una prueba, necesita saber qué se va a probar.
- ¿Cubre pruebas unitarias y/o pruebas de integración?
- 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:
- Primero desde la ventana de la herramienta del proyecto, seleccione el directorio de pruebas
- 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