Property-based testing vs Unit testing. ¿De verdad tengo que elegir?
Maricela
- Soy desarrolladora en Nearsoft
- Organizadora dentro de PythonDay México y PyMX y PyCon Charlas
- Organizadora dentro de Rust Latam Conf y RustMX
- Directora dentro de Women Who Code CDMX y líder dentro de Women Who Code Python
Unit testing
Código que comprueba la funcionalidad de una unidad de código productivo
# calc.py
def add(first_number, second_number):
return first_number + second_number
# tests.py
from .calc import add
def test_add_equals_to_8():
assert add(5, 3) == 8
def test_add_equals_to_5():
assert add(2, 3) == 5
Se basa en ejemplos que comprueban la funcionalidad
import unittest
class TestStringMethods(unittest.TestCase):
def setUp(self):
pass
# Retorna True si la cadena contiene 4 a.
def test_strings_a(self):
self.assertEqual( 'a'*4, 'aaaa')
# Retorna True si la cadena está en mayúsculas
def test_upper(self):
self.assertEqual('foo'.upper(), 'FOO')
# Retorna True si la primera letra de la cadena está en
# mayúscula de otro modo retorna False
def test_isupper(self):
self.assertTrue('FOO'.isupper())
self.assertFalse('Foo'.isupper())
Ventajas
- Código de mayor calidad
- Detección de errores de manera temprana
- Favorece la integración continúa
- Sirve como documentación
desVentajas
- Solo compruebas casos concretos
- Si quieres cubrir la mayor parte de escenarios debes escribir muchas pruebas
- Pierdes de vista lo que realmente deseas probar.
Property-based testing
Las pruebas basadas en propiedad comprueban una especificación abstracta
from hypothesis import given
import hypothesis.strategies as some
@given (some.lists(some.integers()))
def test_list_size_is_invariant_across_sorting(a_list):
original_length = len(a_list)
a_list.sort()
assert len(a_list) == original_length
@given(some.lists(some.text()))
def test_sorted_result_is_ordered(a_list):
a_list.sort()
for i in range(len(a_list) - 1):
assert a_list[i] <= a_list[i + 1]
En vez probar un ejemplo a la vez podemos establecer la propiedad que queremos comprobar
@given(some.integers())
Ventajas
- Probamos muchos casos a la vez
- Disminuimos la posiblidad de errores ya que le cedemos el control a la máquina
- Validamos suposiciones
desVentajas
- Es una técnica poco explorada
- No existe un framework para esta técnica en todos los lenguajes
¿Debo elegir una técnica u otra?
NO
Ambas técnicas son complementarias y te ayudarán a mantener mayor calidad en el software que desarrollas
https://www.meetup.com/es/__PyMX__
https://pythondaymx.github.io/
¡gracias!
Pruebas basadas en propiedad
By Maricela Sanchez
Pruebas basadas en propiedad
- 1,259