Pruebas unitarias parametrizadas en Python: una guía para la generación de pruebas dinámicas
En el desarrollo de software, las pruebas desempeñan un papel crucial para garantizar la confiabilidad y exactitud de nuestro código. Las pruebas unitarias, en particular, implican la creación de pruebas individuales para funciones o módulos específicos. Sin embargo, cuando se trata de grandes conjuntos de datos o escenarios de prueba complejos, resulta laborioso escribir pruebas manualmente para cada parámetro.
Pruebas parametrizadas: una solución para la generación de pruebas dinámicas
Las pruebas parametrizadas, también conocidas como pruebas unitarias parametrizadas, abordan este desafío al automatizar el proceso de generación de pruebas en función de los parámetros de entrada. Nos permite ejecutar una única prueba en múltiples conjuntos de datos, con los parámetros de prueba sustituidos dinámicamente en tiempo de ejecución.
Herramientas y técnicas para la parametrización
Python proporciona una gama de herramientas y librerías para la parametrización. Estos incluyen:
1. Decorador de pytest:
pytest ofrece un decorador conveniente @pytest.mark.parametrize que simplifica la parametrización. Nos permite pasar una lista de tuplas que contienen parámetros de prueba y el decorador expande la prueba para cada conjunto de valores.
Ejemplo:
import pytest @pytest.mark.parametrize("name, a, b", [ ("foo", "a", "a"), ("bar", "a", "b"), ("lee", "b", "b"), ]) def test_sequence(name, a, b): assert a == b
2. Biblioteca parametrizada:
La biblioteca parametrizada proporciona un enfoque alternativo a la parametrización. Nos permite usar un decorador @parameterized.expand para especificar parámetros de prueba como listas o generadores.
Ejemplo:
from parameterized import parameterized class TestSequence(unittest.TestCase): @parameterized.expand([ ("foo", "a", "a"), ("bar", "a", "b"), ("lee", "b", "b"), ]) def test_sequence(self, name, a, b): self.assertEqual(a, b)
Beneficios de las pruebas parametrizadas:
Enfoque heredado:
Para el contexto histórico, podemos mencionar un enfoque más antiguo que implica el uso de la creación dinámica de clases para generar pruebas:
Ejemplo:
import unittest l = [["foo", "a", "a",], ["bar", "a", "b"], ["lee", "b", "b"]] class TestSequense(unittest.TestCase): pass def test_generator(a, b): def test(self): self.assertEqual(a,b) return test if __name__ == '__main__': for t in l: test_name = 'test_%s' % t[0] test = test_generator(t[1], t[2]) setattr(TestSequense, test_name, test) unittest.main()
Este enfoque heredado es menos común en el desarrollo moderno de Python debido a la disponibilidad de herramientas de parametrización más eficientes y fáciles de usar.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3