In Tests We Trust:
começando com TDD, mocks e mais
@anapaulagomess
Ana Paula Gomesoi!
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ívelDado um nome, retorna o gênero.
entrada: Ana
saída: female
O menor teste possívelDado um nome, retorna o gênero.
Utilizando pytests!
O menor teste possívelDado um nome, retorna o gênero.
Utilizando pytests!
AAA: Arrange, Act & Assert
O menor teste possívelDado 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ívelDessa 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çãoNão esquecer
do import mock
Mockando a nossa requisiçãoArrange
ActAssert
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-f2ba8326e76aklauslaube.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
Top Related