in tests we trust: começando com tdd, mocks e mais

42
In Tests We Trust: começando com TDD, mocks e mais @anapaulagomess

Upload: ana-paula-gomes

Post on 16-Mar-2018

301 views

Category:

Software


2 download

TRANSCRIPT

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

In Tests We Trust:

começando com TDD, mocks e mais

@anapaulagomess

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

Ana Paula Gomesoi!

Software Engineer @LoadSmart

Code Reviewer @Udacity

Msc Computer Science @UFMG

Organizer @PyData

Perna de pau @Boas Esportes

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

“Se você não faz testes, seu código não é profissional.”

Ex-colega de trabalho para um candidato

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

Mas que raios é TDD?

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

Test-Driven Development

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

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!

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

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

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

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)

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

talk is cheap - show me the code

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

dojo Você deve desenvolver um identificador de gênero, dado um nome próprio (utilizando uma API)um problema real para começar

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

Por onde você começaria?

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

Talvez fazendo logo uma requisição?

requests.get('https://api.genderize.io/?name=ana')

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

Baby Steps

Qual o menor teste possível?

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

O menor teste possívelDado um nome, retorna o gênero.

entrada: Ana

saída: female

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

O menor teste possívelDado um nome, retorna o gênero.

Utilizando pytests!

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

O menor teste possívelDado um nome, retorna o gênero.

Utilizando pytests!

AAA: Arrange, Act & Assert

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

O menor teste possívelDado um nome, retorna o gênero.

Utilizando pytests!

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

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

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

Continuando... pytest tests/

Falhou! Isso aí! \o/

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

Fizemos o teste falhar. Vamos fazê-lo passar!

Implementamos apenas a funcionalidade necessária para fazer o teste passar!

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

Continuando... pytest tests/

Testes passando!

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

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

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

Continuando o menor teste possívelDessa vez, dado um nome masculino, retorna o gênero “male”.

Utilizando pytests!

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

Continuando... pytest tests/

Falhou! Isso aí! \o/

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

Fizemos o teste falhar. Vamos fazê-lo passar!

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

Continuando... pytest tests/

Testes passando!

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

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

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

Test Doubles: Mocks & Stubs

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

Mocks import mock

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

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

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

talk is cheap - show me the code

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

O que podemos mockar?

requests.get('https://api.genderize.io/?name=ana')

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

Mockando a nossa requisiçãoNão esquecer

do import mock

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

Mockando a nossa requisiçãoArrange

ActAssert

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

Continuando... pytest tests/

Testes passando!

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

Como ficou o código!https://github.com/anapaulagomes/in-tests-we-trust

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

Turbinando os seus testes!

Algumas bibliotecas para ajudar nos testes

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

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

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

Pra lembrar!

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

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!

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

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

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

valeu =)deixe o seu feedback após o sinal: @anapaulagomess