In Tests We Trust:
começando com
TDD, mocks e mais
@anapaulagomess
Ana Paula Gomes
oi!
Software Engineer @LoadSmart
Code Reviewer @Udacity
Msc Computer Science @UFMG
Organizer @PyData
Perna de pau @Boas Esportes
“Se você não faz testes, seu código não é
profissional.”
Ex-colega de trabalho para um candidato
Mas que raios é TDD?
Test-Driven Development
Test-Driven Development
● Escreva um teste (unitário) para a funcionalidade que você deseja
○ O teste irá falhar, afinal a funcionalidade ainda não existe!
● Escreva o código da funcionalidade até que o teste passe
○ Utilize baby steps!
● Refatore o código
○ A ideia é deixá-lo bem estruturado!
Estranho ou não?
● Começar exige um certo esforço
● A prática leva a naturalidade
● Se você achou difícil, está tudo bem
Mas porquê é importante?
● Te ajuda a moldar o design da aplicação
● Dá mais confiabilidade e qualidade a aplicação
● Torna melhor a manutenção do código (para refatorar ou corrigir bugs)
talk is cheap - show me the code
dojo Você deve desenvolver um
identificador de gênero, dado um
nome próprio (utilizando uma API)um problema real para começar
Por onde você começaria?
Talvez fazendo logo uma requisição?
requests.get('https://api.genderize.io/?name=ana')
Baby Steps
Qual o menor teste possível?
O menor teste possível
Dado um nome, retorna o gênero.
entrada: Ana
saída: female
O menor teste possível
Dado um nome, retorna o gênero.
Utilizando
pytests!
O menor teste possível
Dado um nome, retorna o gênero.
Utilizando
pytests!
AAA: Arrange, Act & Assert
O menor teste possível
Dado um nome, retorna o gênero.
Utilizando
pytests!
Importante!
● AAA
○ Arrange: prepare tudo o que você precisa para executar o seu teste
○ Act: execute o trecho de código a ser testado
○ Assert: verifique o resultado!
● Os testes devem estar em uma pasta separada
○ Por convenção, o nome da pasta é chamada de tests
● Os arquivos de testes devem começar com o prefixo
test_nome_do_modulo_testado.py
○ As bibliotecas de teste buscam pelo prefixo test_
● Os nomes dos testes importam e precisam ser expressivos!
○ Os testes devem ser a documentação viva do código
Continuando...
pytest tests/
Falhou!
Isso aí! o/
Fizemos o teste falhar. Vamos fazê-lo passar!
Implementamos apenas a funcionalidade necessária para fazer o teste passar!
Continuando...
pytest tests/
Testes
passando!
Situações que poderiam existir no “detector”
● Retornar “female” quando o nome for feminino
● Retornar “male” quando o nome for masculino
● Buscar apenas pelo primeiro nome
● Lançar uma exceção quando o nome for “” ou None
● Retornar “unidentified” quando o nome não tiver o gênero identificável
Continuando o menor teste possível
Dessa vez, dado um nome masculino, retorna o gênero “male”.
Utilizando
pytests!
Continuando...
pytest tests/
Falhou!
Isso aí! o/
Fizemos o teste falhar. Vamos fazê-lo passar!
Continuando...
pytest tests/
Testes
passando!
Quais as desvantagens da nossa abordagem atual?
● Tempo de execução
● Os testes não são offline
● Não atende as limitações do negócio
○ Muitas APIs, assim como essa, tem número de requests limitadas
Test Doubles: Mocks & Stubs
Mocks
import mock
Algumas regras de ouro sobre Mocks
● Mock o que você não pode testar
● Mock dependências externas
● Evite mockar as suas classes
○ Mockistas x Classistas
talk is cheap - show me the code
O que podemos mockar?
requests.get('https://api.genderize.io/?name=ana')
Mockando a nossa requisição
Não esquecer
do import mock
Mockando a nossa requisição Arrange
Act
Assert
Continuando...
pytest tests/
Testes
passando!
Como ficou o código!
https://github.com/anapaulagomes/in-tests-we-trust
Turbinando os seus
testes!
Algumas bibliotecas para ajudar nos
testes
Bibliotecas para ajudar nos testes
● Pytest
○ fixtures
○ coverage
● Faker
● vcrpy
● freezegun
● Tox + Pyenv + Virtualenv
Referências:
blog.paulagrangeiro.com.br/5-libs-essenciais-para-testes-unit%C3%A1rios-python-f2ba8326e76a
klauslaube.com.br/2016/04/26/o-simples-e-poderoso-pyenv.html
Pra lembrar!
Pra lembrar!
● A maior vantagem do TDD é deixar surgir o design do software
○ Buscando melhor manutenção e objetividade
● Qualidade do código / manutenibilidade
○ A garantia após fazer uma alteração: não tem preço
● Começar pode ser difícil - e está tudo bem - pratique!
Para Casa
● Test Driven Development: By Example
● Growing Object-Oriented Software, Guided by Tests
● Dar uma olhada:
○ Continuous Integration
○ Continuous Delivery
○ Cobertura de testes
● Código da palestra completo em:
github.com/anapaulagomes/in-tests-we-trust
valeu =)
deixe o seu feedback após o sinal: @anapaulagomess

In tests we trust: começando com TDD, mocks e mais

  • 1.
    In Tests WeTrust: começando com TDD, mocks e mais @anapaulagomess
  • 2.
    Ana Paula Gomes oi! SoftwareEngineer @LoadSmart Code Reviewer @Udacity Msc Computer Science @UFMG Organizer @PyData Perna de pau @Boas Esportes
  • 3.
    “Se você nãofaz testes, seu código não é profissional.” Ex-colega de trabalho para um candidato
  • 4.
  • 5.
  • 6.
    Test-Driven Development ● Escrevaum teste (unitário) para a funcionalidade que você deseja ○ O teste irá falhar, afinal a funcionalidade ainda não existe! ● Escreva o código da funcionalidade até que o teste passe ○ Utilize baby steps! ● Refatore o código ○ A ideia é deixá-lo bem estruturado!
  • 7.
    Estranho ou não? ●Começar exige um certo esforço ● A prática leva a naturalidade ● Se você achou difícil, está tudo bem
  • 8.
    Mas porquê éimportante? ● Te ajuda a moldar o design da aplicação ● Dá mais confiabilidade e qualidade a aplicação ● Torna melhor a manutenção do código (para refatorar ou corrigir bugs)
  • 9.
    talk is cheap- show me the code
  • 10.
    dojo Você devedesenvolver um identificador de gênero, dado um nome próprio (utilizando uma API)um problema real para começar
  • 11.
    Por onde vocêcomeçaria?
  • 12.
    Talvez fazendo logouma requisição? requests.get('https://api.genderize.io/?name=ana')
  • 13.
    Baby Steps Qual omenor teste possível?
  • 14.
    O menor testepossível Dado um nome, retorna o gênero. entrada: Ana saída: female
  • 15.
    O menor testepossível Dado um nome, retorna o gênero. Utilizando pytests!
  • 16.
    O menor testepossível Dado um nome, retorna o gênero. Utilizando pytests! AAA: Arrange, Act & Assert
  • 17.
    O menor testepossível Dado um nome, retorna o gênero. Utilizando pytests!
  • 18.
    Importante! ● AAA ○ Arrange:prepare tudo o que você precisa para executar o seu teste ○ Act: execute o trecho de código a ser testado ○ Assert: verifique o resultado! ● Os testes devem estar em uma pasta separada ○ Por convenção, o nome da pasta é chamada de tests ● Os arquivos de testes devem começar com o prefixo test_nome_do_modulo_testado.py ○ As bibliotecas de teste buscam pelo prefixo test_ ● Os nomes dos testes importam e precisam ser expressivos! ○ Os testes devem ser a documentação viva do código
  • 19.
  • 20.
    Fizemos o testefalhar. Vamos fazê-lo passar! Implementamos apenas a funcionalidade necessária para fazer o teste passar!
  • 21.
  • 22.
    Situações que poderiamexistir no “detector” ● Retornar “female” quando o nome for feminino ● Retornar “male” quando o nome for masculino ● Buscar apenas pelo primeiro nome ● Lançar uma exceção quando o nome for “” ou None ● Retornar “unidentified” quando o nome não tiver o gênero identificável
  • 23.
    Continuando o menorteste possível Dessa vez, dado um nome masculino, retorna o gênero “male”. Utilizando pytests!
  • 24.
  • 25.
    Fizemos o testefalhar. Vamos fazê-lo passar!
  • 26.
  • 27.
    Quais as desvantagensda nossa abordagem atual? ● Tempo de execução ● Os testes não são offline ● Não atende as limitações do negócio ○ Muitas APIs, assim como essa, tem número de requests limitadas
  • 28.
  • 29.
  • 30.
    Algumas regras deouro sobre Mocks ● Mock o que você não pode testar ● Mock dependências externas ● Evite mockar as suas classes ○ Mockistas x Classistas
  • 31.
    talk is cheap- show me the code
  • 32.
    O que podemosmockar? requests.get('https://api.genderize.io/?name=ana')
  • 33.
    Mockando a nossarequisição Não esquecer do import mock
  • 34.
    Mockando a nossarequisição Arrange Act Assert
  • 35.
  • 36.
    Como ficou ocódigo! https://github.com/anapaulagomes/in-tests-we-trust
  • 37.
    Turbinando os seus testes! Algumasbibliotecas para ajudar nos testes
  • 38.
    Bibliotecas para ajudarnos testes ● Pytest ○ fixtures ○ coverage ● Faker ● vcrpy ● freezegun ● Tox + Pyenv + Virtualenv Referências: blog.paulagrangeiro.com.br/5-libs-essenciais-para-testes-unit%C3%A1rios-python-f2ba8326e76a klauslaube.com.br/2016/04/26/o-simples-e-poderoso-pyenv.html
  • 39.
  • 40.
    Pra lembrar! ● Amaior vantagem do TDD é deixar surgir o design do software ○ Buscando melhor manutenção e objetividade ● Qualidade do código / manutenibilidade ○ A garantia após fazer uma alteração: não tem preço ● Começar pode ser difícil - e está tudo bem - pratique!
  • 41.
    Para Casa ● TestDriven Development: By Example ● Growing Object-Oriented Software, Guided by Tests ● Dar uma olhada: ○ Continuous Integration ○ Continuous Delivery ○ Cobertura de testes ● Código da palestra completo em: github.com/anapaulagomes/in-tests-we-trust
  • 42.
    valeu =) deixe oseu feedback após o sinal: @anapaulagomess