60
Ferramentas e Práticas de TDD em Python Patrick Porto

Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Ferramentas e Práticas de TDD em Python

Patrick Porto

Page 2: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Software Engineer na Globo.com

Praticante de TDD há 5 anos

7 anos de experiência em Python

Page 3: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

TALENTOS.GLOBO.COM

VOCÊ NASCEU PRA ISSO!

Page 4: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Agenda● Introdução ao TDD● Ferramentas para testes unitários em Python● Anatomia de um teste● Abordagens de TDD em Python● Mock de objetos● Considerações finais

Page 5: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Teste é um procedimento que conduz a aceitação ou

rejeição

Page 6: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Código que não é testado não funciona

Page 7: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Por que escrever Testes Automatizados?

Page 8: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Escrevendo bons Testes Automatizados● Devemos projetar organicamente com o código, executando e recebendo

feedback constante sobre o seu funcionamento.●

Page 9: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Escrevendo bons Testes Automatizados● Devemos projetar organicamente com o código, executando e recebendo

feedback constante sobre o seu funcionamento.● Devemos escrever nossos próprios testes, pois não podemos esperar 20 vezes

por dia para outra pessoa escrever um teste.●

Page 10: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Escrevendo bons Testes Automatizados● Devemos projetar organicamente com o código, executando e recebendo

feedback constante sobre o seu funcionamento.● Devemos escrever nossos próprios testes, pois não podemos esperar 20 vezes

por dia para outra pessoa escrever um teste.● Nosso ambiente de desenvolvimento deve fornecer resposta rápida a pequenas

mudanças.●

Page 11: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Escrevendo bons Testes Automatizados● Devemos projetar organicamente com o código, executando e recebendo

feedback constante sobre o seu funcionamento.● Devemos escrever nossos próprios testes, pois não podemos esperar 20 vezes

por dia para outra pessoa escrever um teste.● Nosso ambiente de desenvolvimento deve fornecer resposta rápida a pequenas

mudanças.● Nosso projeto deve consistir em muitos componentes altamente coesos e

fracamente acoplados para tornar os testes fáceis.

Page 12: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

O que é Test-Driven Development?

Page 13: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Test First

Page 14: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Feedback sem TDD

Codificar Testar Funciona? Pronto

Refatorar no futuro

Page 15: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Feedback com TDD

CodificarTestar Pronto

Page 16: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

TDD não é Teste Unitário

Page 17: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

TDD não é uma Técnica de Teste

Page 18: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

O que guia um desenvolvimento que não tem

TDD?

Page 19: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

"Esse é um problema difícil e eu não consigo ver o fim a partir do começo".

~ Bob

Page 20: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Regras do TDD● Escrevemos código novo apenas se um teste automatizado falhou●

Page 21: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Regras do TDD● Escrevemos código novo apenas se um teste automatizado falhou● Eliminamos duplicação

Page 22: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Test-Driven Development em Python

REFATORAR

Remova duplicação

VERMELHO

Escreva um teste. Rode-o e veja-o falhar

VERDE

Faça-o passar e rode-o novamente

Page 23: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Ferramentas para Testes Unitários em Python

Page 24: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução
Page 25: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução
Page 26: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução
Page 27: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução
Page 28: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Anatomia de um Teste

Page 29: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Anatomia de um teste

assert Money(100 / 2 * (1–0.015), "GBP") == result

A expectativa vem em primeiro lugar

Page 30: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Anatomia de um teste

result = bank.convert(Money(100, "USD"), "GBP")

assert Money(100 / 2 * (1–0.015), "GBP") == result

Page 31: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Anatomia de um teste

bank = Bank()

bank.add_rate("USD", "GBP", STANDARD_RATE)

bank.commission(STANDARD_COMMISSION)

result = bank.convert(Money(100, "USD"), "GBP")

assert Money(100 / 2 * (1–0.015), "GBP") == result

Page 32: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Anatomia de um teste# arrange

bank = Bank()

bank.add_rate("USD", "GBP", STANDARD_RATE)

bank.commission(STANDARD_COMMISSION)

# act

result = bank.convert(Money(100, "USD"), "GBP")

# assert

assert Money(100 / 2 * (1–0.015), "GBP") == result

Page 33: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Teste interativo por exemplosdef factorial(n): """Return the factorial of n, an exact integer >= 0. >>> factorial(5) 120 >>> factorial(-1) Traceback (most recent call last): ... ValueError: n must be >= 0 """ if not n >= 0: raise ValueError("n must be >= 0") result = 1 factor = 2 while factor <= n: result *= factor factor += 1 return result

Page 34: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Abordagens de TDD em Python

Page 35: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Um Só Passo

def test_sum():

assert 4 == calc.add(2, 2)

assert 0 == calc.sub(2, 2)

def test_sum():

assert 4 == calc.add(2, 2)

def test_sub():

assert 0 == calc.sub(2, 2)

RUIM BOM

Como saber que calc.sub não está quebrado?

Page 36: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Dados evidentes

# arrange

bank = Bank().

bank.add_rate("USD", "GBP", STANDARD_RATE)

bank.commission(STANDARD_COMMISSION);

# act

result = bank.convert(Money(100, "USD"), "GBP")

# assert

assert result == Money(100 / 2 * (1–0.015), "GBP")

RUIM BOM

# arrange

bank = Bank()

bank.add_rate("USD", "GBP", STANDARD_RATE)

bank.commission(STANDARD_COMMISSION);

# act

result = bank.convert(Money(100, "USD"), "GBP")

# assert

assert result == Money(49.25, "GBP")

Page 37: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Fixtureimport pytest

@pytest.fixture

def bank()

bank = Bank()

bank.add_rate("USD", "GBP", STANDARD_RATE)

bank.commission(STANDARD_COMMISSION)

def test_bank_convert(bank)

result = bank.convert(Money(100, "USD"), "GBP")

assert result == Money(100 / 2 * (1–0.015), "GBP")

Como fica o isolamento?

Page 38: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Fixture externaimport pytest

@pytest.fixture

def bank()

bank = Bank.objects.create()

bank.add_rate("USD", "GBP", STANDARD_RATE)

bank.commission(STANDARD_COMMISSION)

yield bank

bank.delete()

def test_bank_convert(bank)

result = bank.convert(Money(100, "USD"), "GBP")

assert Money(100 / 2 * (1–0.015), "GBP") == result

Cria o registro no banco de dados

Apaga o registro no banco de dados

Page 39: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Asserções customizadasimport pytest

def assert_gbp(expected, actual):

assert Money(expected, "GBP") == actual

def test_bank_convert(bank)

bank = Bank()

bank.add_rate("USD", "GBP", STANDARD_RATE)

bank.commission(STANDARD_COMMISSION)

result = bank.convert(Money(100, "USD"), "GBP")

assert_gbp(100 / 2 * (1–0.015), result)

Page 40: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Teste de aprendizadodef test_json_response():

response = requests.get("https://httpbin.org/json")

data = response.json()

assert data is not None

assert "Yours Truly" == data["slideshow"]["author"]

Page 41: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Teste de regressão● Escreva um teste para um bug encontrado●●

Page 42: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Teste de regressão● Escreva um teste para um bug encontrado● Faça o menor teste possível que reproduza o problema●

Page 43: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Teste de regressão● Escreva um teste para um bug encontrado● Faça o menor teste possível que reproduza o problema● Você deveria ter escrito esse teste antes

Page 44: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Mock de Objetos

Page 45: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Simulação de recursos carosInfraestrutura

Aplicação

Serviços Externos

Models Views

Templates Services

Page 46: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Simulação de recursos caros (Classicista)Infraestrutura

Aplicação

Serviços Externos

Models Views

Templates Services

Page 47: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Simulação de recursos caros (Mockista)Infraestrutura

Aplicação

Serviços Externos

Models Views

Templates Services

Page 48: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução
Page 49: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Mock de Objetosfrom unittest.mock import MagicMock

def test_form():

form = Form()

form.is_valid = MagicMock(return_value=True)

form.submit() # True

form.is_valid.assert_called_once()

Page 50: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Modelo de teste de acidentesfrom unittest.mock import patch

import requests

@patch('requests.get', side_effect=requests.ConnectTimeout)

def test_recursion():

with pytest.raises(ConnectTimeout) as excinfo:

requests.get("https://httpbin.org/json")

assert excinfo is not None

Page 51: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Considerações finais

Page 52: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

O que devemos testar?● Condicionais●●●

Page 53: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

O que devemos testar?● Condicionais● Loops●●

Page 54: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

O que devemos testar?● Condicionais● Loops● Operações●

Page 55: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

O que devemos testar?● Condicionais● Loops● Operações● Polimorfismo

Page 56: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Vantagens do TDD● Você sabe quando está pronto sem ter que se preocupar com uma longa trilha

de erros●●●

Page 57: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Vantagens do TDD● Você sabe quando está pronto sem ter que se preocupar com uma longa trilha

de erros● Você pode escrever códigos melhores●●

Page 58: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Vantagens do TDD● Você sabe quando está pronto sem ter que se preocupar com uma longa trilha

de erros● Você pode escrever códigos melhores● Melhora a vida dos usuários de seu software●

Page 59: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Vantagens do TDD● Você sabe quando está pronto sem ter que se preocupar com uma longa trilha

de erros● Você pode escrever códigos melhores● Melhora a vida dos usuários de seu software● Melhora a confiança do time de desenvolvimento

Page 60: Ferramentas e Práticas de TDD em Python · 2019-04-27 · Praticante de TDD há 5 anos 7 anos de experiência em Python. TALENTOS.GLOBO.COM VOCÊ NASCEU PRA ISSO! Agenda Introdução

Obrigado!