Python - No entiendo los tests en python. Ayuda!

 
Vista:
Imágen de perfil de Pablo

No entiendo los tests en python. Ayuda!

Publicado por Pablo (2 intervenciones) el 30/12/2023 02:34:04
Estoy aprendiendo Python hace unos meses. Queriendo sumar conocimientos me dispuse a tratar de ver que era eso de los tests.
En todos los videos que veo siempre muestran lo mismo. Prueban una función (pe. Suma) y testean si pasándole 2 y 3 da 5, pasándole 4 y 2 da 6.No entiendo como eso puede ayudar a encontrar un error. Necesitaría un buen ejemplo en el que un test encuentre un error inesperado. Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

No entiendo los tests en python. Ayuda!

Publicado por Costero (92 intervenciones) el 02/01/2024 19:42:42
Digamos que el jefe dice que no se permitira pasar numeros negativos. Si esto pasa entonces la funcion tiene que tirar un ValueError exception

Entonces hacemos esto:

1
2
3
4
def add_numbers(a, b):
    if a < 0:
        raise ValueError(f'Sorry, no numbers below zero. a={a} and b={b}')
    return a + b

Y escribimos el test:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import unittest
from my_math import add_numbers
 
 
class TestMyMathFunctions(unittest.TestCase):
 
    def test_add_numbers_positives(self):
        result = add_numbers(2, 3)
        self.assertEqual(result, 5)
 
    def test_add_numbers_a_negative(self):
        """Check that an exception is thrown and the error message"""
        with self.assertRaises(ValueError) as error:
            a = -2
            b = 3
            add_numbers(a, b)
        expected_error_message = f"Sorry, no numbers below zero. a={a} and b={b}"
        self.assertEqual(str(error.exception), expected_error_message)
 
    def test_add_numbers_b_negative(self):
        """Check that an exception is thrown and the error message"""
        with self.assertRaises(ValueError) as error:
            a = 2
            b = -3
            add_numbers(a, b)
        expected_error_message = f"Sorry, no numbers below zero. a={a} and b={b}"
        self.assertEqual(str(error.exception), expected_error_message)
 
    def test_add_numbers_both_negative(self):
        """Check that an exception is thrown and the error message"""
        with self.assertRaises(ValueError) as error:
            a = -2
            b = -3
            add_numbers(a, b)
        expected_error_message = f"Sorry, no numbers below zero. a={a} and b={b}"
        self.assertEqual(str(error.exception), expected_error_message)
 
 
if __name__ == '__main__':
    unittest.main()

Pero cuando corremos nuestro test, tira lo siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
FAIL: test_add_numbers_b_negative (__main__.TestMyMathFunctions)
Check that an exception is thrown and the error message
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/tests/test_my_math.py", line 25, in test_add_numbers_b_negative
    add_numbers(a, b)
AssertionError: ValueError not raised
 
----------------------------------------------------------------------
Ran 4 tests in 0.001s
 
FAILED (failures=1)

Al mirar por que el test falla, me doy cuenta que, not estoy chequeando si b es negativo. Asi que arreglo el codigo

1
2
3
4
5
6
# File: my_math.py
 
def add_numbers(a, b):
    if a < 0 or b < 0:
        raise ValueError(f'Sorry, no numbers below zero. a={a} and b={b}')
    return a + b

Corro el test y me da lo siguiente:

1
2
3
Ran 4 tests in 0.000s
 
OK

Perfecto.

Sal2
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de pablo daniel

No entiendo los tests en python. Ayuda!

Publicado por pablo daniel (2 intervenciones) el 05/01/2024 20:30:25
@Costero.
En tu ejemplo, al escribir el test , tuviste en cuenta que el valor de b tambien podia ser negativo.justamente neso es lo que no entiendo. No es mas facil, en lugar de escribir y ejecutar el test, directamente corregir la funcion.
Es que a mi la unica forma que se me ocurre de encontarle un error a una funcion , es que alguien mas la pruebe y genere situaciones que a uno no se le hubiesen ocurrido.
gracias por contestar
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

No entiendo los tests en python. Ayuda!

Publicado por Costero (92 intervenciones) el 05/01/2024 23:06:10
Una cosa primero tests no solo es en Python. Todos los lenguajes tienen Unit Test asi que tu pregunta se aplica a cualquier lenguaje donde se este haciendo Unit Test.

Los testos se escriben para encontrar bugs, no su ausencia.

No es mas facil, en lugar de escribir y ejecutar el test, directamente corregir la funcion. Si en una funcion simple como esta, si, pero si es mas compleja?.

Otra cosa supongamos que trabajas con un equipo de programadores. Un programador viene y inavertidamente borra el chequeo de "b" en la funcion. Problema, nadie se da cuenta va a Producion y se romple cuando los usuarios la estan utilizando. No bueno.
Si embargo como tu tienes al commit el codigo automaticamente correr todos los tests, se rompe y asi vas y arreglas el codigo y nunca pasaria a Produccion

Es que a mi la unica forma que se me ocurre de encontarle un error a una funcion , es que alguien mas la pruebe y genere situaciones que a uno no se le hubiesen ocurrido

Exactamente cuando encuentra situaciones que codigo genere error. Entonces escribes mas testos que generen esos errores y arreglas el codigo, y tus testos pasan.

No todas las funciones deben de tener testo como la que tu pusiste al empezar. Si no tiene sentido, no escribas testo.

Otra cosa positiva de testos es que te obliga a escribir clases y funciones muy modulares (sencillos). Trata de escribir un testo a una funcion que esta haciendo mil cosas.


No se si me hice explicar.

Suerte
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar