(Breve)Introducción al desarrollo guiado por pruebas

Agenda

  • Pruebas unitarias
  • ¿De dónde viene el desarrollo guiado por pruebas?
  • ¿De qué va el desarrollo guiado por pruebas?
  • Práctica
    • ¿Qué es un entorno virtual de desarrollo?
    • Instalación de virtualenv
    • Creación y activación de un ambiente virtual
    • Instalación de paquetes
    • Desarrollo guiado por pruebas de la función suma
  • Ventajas y desventajas
  • Conclusión

Pruebas unitarias

Es un bloque de código que comprueba el correcto funcinamiento de una unidad de código fuente.

¿De dónde viene el desarrollo guiado por pruebas?

Extreme programming

Kent Beck

  • Programación en pares
  • Refactorización
  • TDD
  • ...

¿De qué va el desarrollo guiado por pruebas?

No se escribe código sin antes escribir una prueba unitaria que especifica su objetivo y comprueba que se cumple.

Práctica

¿Qué es un ambiente virtual de desarrollo?

Es un ambiente totalmente aislado donde puedes manipular las dependencias de tu proyecto con mayor flexibilidad.

Instalación

pip install virtualenv

Creación de un entorno virtual y activación

virtualenv venv

source venv/activate

Pytest

pytest es un framework que hace fácil la creación de pequeñas pruebas unitarias hasta complejas pruebas funcionales.

Instalación de pytest

pip install pytest

clonar el repositorio:

https://github.com/mayela/clase-muestra-tdd.git

1. Escribe el primer test

def test_add():
    assert add() == 8

tests.py

2. El test tiene que fallar

$ venv/bin/pytest tests.py
=================================== test session starts ====================================
platform linux -- Python 3.6.6rc1, pytest-3.6.1, py-1.5.3, pluggy-0.6.0
rootdir: /data/Documentos/proyectos-python/demo-pytest, inifile:
collected 1 item                                                                                                                                     

calc.py F                                                                                                                                      [100%]

=================================== FAILURES ==============================================
___________________________________ test_add ______________________________________________
    def test_add():
>       assert add() == 8
E       NameError: name 'add' is not defined

tests.py:2: NameError

================================= 1 failed in 0.08 seconds ================================

3. Escribe solo el código necesario

# calc.py
def add():
    return 8


# tests.py

def test_add():
    assert add() == 8

4. Corre el test

$ venv/bin/pytest tests.py
================================= test session starts =================================
platform linux -- Python 3.6.6rc1, pytest-3.6.1, py-1.5.3, pluggy-0.6.0
rootdir: /data/Documentos/proyectos-python/demo-pytest, inifile:
collected 1 item                                                                                                                                     

tests.py .                                                                                                                                      [100%]

================================= 1 passed in 0.07 seconds ============================

5. Escribe otro test

# calc.py

def add():
    return 8


# tests.py

def test_add_equals_to_8():
    assert add() == 8

def test_add_equals_to_5():
    assert add() == 5

6. El último test debe fallar

$ venv/bin/pytest tests.py
============================= test session starts ================================
platform linux -- Python 3.6.6rc1, pytest-3.6.1, py-1.5.3, pluggy-0.6.0
rootdir: /data/Documentos/proyectos-python/demo-pytest, inifile:
collected 2 items                                                                                                                                    

calc.py .F                                                                                                                                     [100%]

============================= FAILURES ===========================================
_____________________________ test_add_equals_to_5 _______________________________

    def test_add_equals_to_5():
>       assert add() == 5
E       assert 8 == 5
E        +  where 8 = add()

tests.py:8: AssertionError
============================= 1 failed, 1 passed in 0.11 seconds =================

7. Refactoriza

# calc.py

def add(first_number, second_number):
    return first_number + second_number

# tests.py


def test_add_equals_to_8():
    assert add(5, 3) == 8

def test_add_equals_to_5():
    assert add(2, 3) == 5

$ venv/bin/pytest tests.py
============================== test session starts ================================
platform linux -- Python 3.6.6rc1, pytest-3.6.1, py-1.5.3, pluggy-0.6.0
rootdir: /data/Documentos/proyectos-python/demo-pytest, inifile:
collected 2 items                                                                                                                                    

tests.py ..                                                                                                                                     [100%]

============================== 2 passed in 0.07 seconds ============================

Recapitulando...

Ventajas

  • Código de mayor calidad.
  • Desarrollas solo el código necesario.
  • Los errores se corrigen en etapas tempranas del desarrollo.

Desventajas

  • Curva de aprendizaje
  • Adopción del proceso

Conclusión

El desarrollo guiado por pruebas es una técnica que ayuda a desarrollar código de mayor calidad, vale la pena invertir tiempo en familiarizarse con esta práctica

¡Gracias!

intro-tdd

By Maricela Sanchez