Probar un software es someterlo a ciertas condiciones que puedan demostrar si es válido o no con respecto a los requerimientos planteados.
El objetivo de las pruebas es encontrar la mayor cantidad de errores posibles, preferentemente antes de que los encuentre el usuario final.
El testing mejora la calidad del producto y deber realizarse en cada una de las etapas del desarrollo del software.
En Python podemos escribir lo siguiente:
assert sum([1, 2, 3]) == 6
assert condicion
if not condicion:
raise AssertionError()
assert sum([1, 2, 3]) == 6
if sum([1, 2, 3]) != 6:
raise AssertionError()
assert condicion ["," expresion]
if not condicion:
raise AssertionError(expresion)
if sum([1, 2, 3]) != 6:
raise AssertionError("Debería dar 6")
assert sum([1, 2, 3]) == 5, "Debería dar 6"
def calcular_promedio(lista):
cant_elementos = len(lista)
return 0 if cant_elementos == 0 else sum(lista)/cant_elementos
assert calcular_promedio([1, 2, 3]) == 2.0, "Deberia dar 2.0"
assert calcular_promedio([1]) == 1.0, "Deberia dar 1.0"
assert calcular_promedio([]) == 0, "Deberia dar 0"
def sumar(a, b):
assert type(a) == int, "El primer argumento debería ser un entero"
assert type(b) == int, "El segundo argumento debería ser un entero"
return a+b
sumar(1,2)
sumar(15.2, 2)
def test_case1():
assert calcular_promedio([]) == 0, "Debería dar 0"
def test_case2():
assert calcular_promedio([1]) == 1.0, "Debería dar 1.0"
def test_case3():
assert calcular_promedio([1, 2, 3]) == 2.0, "Debería dar 2.0"
if __name__ == "__main__":
test_case1()
test_case2()
test_case3()
print("Tests pasados!")
Permiten examinar cada parte del programa (módulo, clase o función) de manera individual para asegurar su correcto funcionamiento.
Por lo general, se realizan una vez que se ha desarrollado, revisado y verificado el código fuente.
Tienen que poder correr sin interacción humana: sin que el usuario ingrese valores en ningún caso.
Tienen que poder verificar el resultado de la ejecución sin interacción humana: se debe poder analizar los resultados en forma automática.
Un test tiene que ser independiente del otro. Es decir, el resultado de un test no debería depender del resultado anterior.
Que funcione correctamente cuando los valores de entrada son válidos.
Que falle cuando los valores de entrada son inválidos, o que levante una excepción.
Basado en JUnit (test de unidad para Java).
# Módulo: mis_funciones
def calcular_promedio(lista):
""" Calcula el promedio de los valores dentro de la lista dada como argumento"""
cant_elementos = len(lista)
return 0 if cant_elementos == 0 else sum(lista)/cant_elementos
#Código: test1.py
import unittest
from mis_funciones import calcular_promedio
class TestMiFuncion(unittest.TestCase):
def test_case1(self):
""" Testea que el promedio de una lista vacía de 0"""
self.assertEqual(calcular_promedio([]), 0)
def test_case2(self):
""" Testea que el promedio de una lista con un único valor es el mismo valor """
valor = 1
self.assertEqual(calcular_promedio([valor]), float(valor))
def test_case3(self):
""" testea que el promedio de los valores 1, 2 y 3 sea 2.0"""
self.assertEqual(calcular_promedio([1, 2, 3]), 2.0)
if __name__ == '__main__':
unittest.main()
def calcular_promedio_descuidada(valores):
""" Calcula el promedio de los valores dentro de la lista dada como argumento"""
return sum(valores) / len(valores)
Cödigo: test2.py ```python class TestFuncionDescuidada(unittest.TestCase): def test_case1(self):
""" Testea que el promedio de los valores 20, 50 y 70 sea 40.0 """
self.assertEqual(calcular_promedio_descuidada([20, 30, 70]), 40.0)
def test_case2(self):
""" Testea que se levante la excepciónn ZeroDivisionError cuando la lista está vacía """
self.assertRaises(ZeroDivisionError, calcular_promedio_descuidada, [])
def test_case3(self):
""" Testea que el argumento de la función sea una secuencia"""
self.assertRaises(TypeError, calcular_promedio_descuidada, 20, 30, 70)
```
def calcular_promedio(lista):
cant_elementos = len(lista)
return 1 if cant_elementos == 0 else sum(lista)/cant_elementos
¿Qué excepción se levanta? AssertionError: 0 != 1