Testes unitários

Princípios de Engenharia de Software em Python

Adam Spannbauer

Machine Learning Engineer at Eastman

Por que testar?

  • Confirmar que o código funciona como esperado
  • Garantir que mudanças em uma função não quebrem outra
  • Proteger contra mudanças em uma dependência
Princípios de Engenharia de Software em Python

Testando em Python

  • doctest
  • pytest

logo do pytest

Princípios de Engenharia de Software em Python

Usando doctest

def square(x):
    """Quadrado do número x

    :param x: número a ser elevado ao quadrado
    :return: x ao quadrado

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


import doctest doctest.testmod()
Exemplo falhou:
    square(3)
Esperado:
    9
Obtido:
    27
Princípios de Engenharia de Software em Python

Estrutura do pytest

Estrutura de Teste

Princípios de Engenharia de Software em Python

Estrutura do pytest

Estrutura de Teste

Princípios de Engenharia de Software em Python

Escrevendo testes unitários

trabalhando em workdir/tests/test_document.py

from text_analyzer import Document


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

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

# Testar caso de borda de documento vazio def test_document_empty(): doc = Document('') assert doc.tokens == [] assert doc.word_counts == Counter()
Princípios de Engenharia de Software em Python

Escrevendo testes unitários

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

# Verificar se objetos são ==
print(doc_a == doc_b)

# Verificar se atributos são == print(doc_a.tokens == doc_b.tokens) print(doc_a.word_counts == doc_b.word_counts)
False

True True
Princípios de Engenharia de Software em Python

Executando pytest

trabalhando com terminal

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

tests/test_document.py ..                     [100%]

========== 2 passed in 0.61 seconds ==========
Princípios de Engenharia de Software em Python

Executando pytest

trabalhando com terminal

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

tests/test_document.py ..                     [100%]

========== 2 passed in 0.61 seconds ==========
Princípios de Engenharia de Software em Python

Testes falhando

trabalhando com terminal

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

tests/test_document.py F.

============== FAILURES ==============
________ 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 ======
Princípios de Engenharia de Software em Python

Vamos Praticar

Princípios de Engenharia de Software em Python

Preparing Video For Download...