Pruebas unitarias

Principios de ingeniería de software en Python

Adam Spannbauer

Machine Learning Engineer at Eastman

¿Por qué probar?

  • Confirmar que el código funciona como se espera
  • Asegurar que cambios en una función no rompan otra
  • Proteger contra cambios en una dependencia
Principios de ingeniería de software en Python

Pruebas en Python

  • doctest
  • pytest

logo de pytest

Principios de ingeniería de software en Python

Usando doctest

def square(x):
    """Elevar al cuadrado el número x

    :param x: número a elevar
    :return: x al cuadrado

    >>> square(3)
    9
    """
    return x ** 3


import doctest doctest.testmod()
Ejemplo fallido:
    square(3)
Esperado:
    9
Obtenido:
    27
Principios de ingeniería de software en Python

Estructura de pytest

Estructura de Prueba

Principios de ingeniería de software en Python

Estructura de pytest

Estructura de Prueba

Principios de ingeniería de software en Python

Escribiendo pruebas unitarias

trabajando en workdir/tests/test_document.py

from text_analyzer import Document


# Probar atributo tokens en objeto Document
def test_document_tokens():
    doc = Document('a e i o u')

    assert doc.tokens == ['a', 'e', 'i', 'o', 'u']

# Probar caso límite de documento vacío def test_document_empty(): doc = Document('') assert doc.tokens == [] assert doc.word_counts == Counter()
Principios de ingeniería de software en Python

Escribiendo pruebas unitarias

# Crear 2 objetos Document idénticos
doc_a = Document('a e i o u')
doc_b = Document('a e i o u')

# Verificar si los objetos son ==
print(doc_a == doc_b)

# Verificar si los atributos son == print(doc_a.tokens == doc_b.tokens) print(doc_a.word_counts == doc_b.word_counts)
False

True True
Principios de ingeniería de software en Python

Ejecutando pytest

trabajando con terminal

datacamp@server:~/work_dir $ pytest
collected 2 items

tests/test_document.py ..                     [100%]

========== 2 passed in 0.61 seconds ==========
Principios de ingeniería de software en Python

Ejecutando pytest

trabajando con terminal

datacamp@server:~/work_dir $ pytest tests/test_document.py
collected 2 items

tests/test_document.py ..                     [100%]

========== 2 passed in 0.61 seconds ==========
Principios de ingeniería de software en Python

Pruebas fallidas

trabajando con terminal

datacamp@server:~/work_dir $ pytest
collected 2 items

tests/test_document.py F.

============== FALLAS ==============
________ test_document_tokens ________

def test_document_tokens(): doc = Document('a e i o u')

assert doc.tokens == ['a', 'e', 'i', 'o']
E AssertionError: assert ['a', 'e', 'i', 'o', 'u'] == ['a', 'e', 'i', 'o']
E Left contains more items, first extra item: 'u'
E Use -v to get the full diff

tests/test_document.py:7: AssertionError
====== 1 failed in 0.57 seconds ======
Principios de ingeniería de software en Python

¡Vamos a practicar!

Principios de ingeniería de software en Python

Preparing Video For Download...