Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[Meetup SumUp] Como não odiar seus testes

[Meetup SumUp] Como não odiar seus testes

Sabemos que escrever testes automatizados é extremamente importante, pois, entre outras coisas, eles garantem a qualidade do nosso código e o funcionamento da nossa aplicação. Apesar disso, muitas vezes acabamos com uma suíte de testes que, além de ser difícil de entender e manter, não é confiável. Nessa talk, vamos ver como reconhecer e evitar alguns dos problemas mais comuns que nos fazem odiar nossos testes, além de dar algumas dicas de como melhorar nossos testes.

Camila Campos

June 18, 2019
Tweet

More Decks by Camila Campos

Other Decks in Programming

Transcript

  1. @camposmilaa Plataforma online Empréstimo com garantia Juros baixos pra você

    <3 creditas.com.br vagas.creditas.com.br @CreditasBR
  2. @camposmilaa Junção de comunidades Incentivar mulheres em tech Palestras &

    Oficinas & Painéis womendevsummit.com fb.com/womendevsummit @WomenDevSummit
  3. @camposmilaa Testes na Creditas Testes lentos Quantidade Tempo para rodar

    Ponta a Ponta 13 ~ 15 min Integração ~ 3k < 3 min Unidade ~ 6k ~ 1 min
  4. @camposmilaa Regras e Convenções Testes lentos Bando de Dados Dependências

    externas Colaboradores Ponta a Ponta Sim Sim* Sim Integração Sim Não Sim Unidade Não Não Não
  5. @camposmilaa Teste é uma parada que garante que o seu

    código “de verdade” funciona Testes complicados > Sem clareza
  6. @camposmilaa Teste é código (que garante que o código "de

    verdade" funciona) Testes complicados > Sem clareza
  7. @camposmilaa Testes complicados > Sem clareza Fácil de ler Pequeno

    Simples Objetivo Teste é código não testado
  8. @camposmilaa it 'sends a message' do person = Person.new(name: 'John')

    response = Messenger.new(person).greet expect(response).to eq 'Hello, John' end Testes complicados > Sem clareza
  9. @camposmilaa it 'sends a message' do person = Person.new(name: 'John')

    response = Messenger.new(person).greet expect(response).to eq 'Hello, John' end Testes complicados > Sem clareza
  10. @camposmilaa it 'sends a message' do person = Person.new(name: 'John')

    response = Messenger.new(person).greet expect(response).to eq 'Hello, John' end Testes complicados > Sem clareza
  11. @camposmilaa it 'sends a message' do person = Person.new(name: 'John')

    response = Messenger.new(person).greet expect(response).to eq 'Hello, John' end Testes complicados > Sem clareza
  12. @camposmilaa it 'sends a message' do person = Person.new(name: 'John')

    response = Messenger.new(person).greet expect(response).to eq 'Hello, John' end Testes complicados > Sem clareza
  13. @camposmilaa Descrição ruim it 'sends a message' do person =

    Person.new(name: 'John') response = Messenger.new(person).greet expect(response).to eq 'Hello, John' end Testes complicados > Sem clareza
  14. @camposmilaa Descrição ruim it 'sends a message' do person =

    Person.new(name: 'John') response = Messenger.new(person).greet expect(response).to eq 'Hello, John' end Testes complicados > Sem clareza
  15. @camposmilaa Descrição ruim it 'greets a person' do person =

    Person.new(name: 'John') response = Messenger.new(person).greet expect(response).to eq 'Hello, John' end Testes complicados > Sem clareza
  16. @camposmilaa Descrição ruim it 'greets a person' do person =

    Person.new(name: 'John') response = Messenger.new(person).greet expect(response).to eq 'Hello, John' end Testes complicados > Sem clareza
  17. @camposmilaa it 'greets a person' do person = Person.new(name: 'John',

    last_name: 'Doe', age: 27) response = Messenger.new(person).greet expect(response).to eq 'Hello, John' end Testes complicados > Sem clareza
  18. @camposmilaa it 'greets a person' do person = Person.new(name: 'John',

    last_name: 'Doe', age: 27) response = Messenger.new(person).greet expect(response).to eq 'Hello, John' end Testes complicados > Sem clareza
  19. @camposmilaa it 'greets a person' do person = Person.new(name: 'John',

    last_name: 'Doe', age: 27) response = Messenger.new(person).greet expect(response).to eq 'Hello, John' end Testes complicados > Sem clareza
  20. @camposmilaa Coisas falsamente importantes it 'greets a person' do person

    = Person.new(name: 'John', last_name: 'Doe', age: 27) response = Messenger.new(person).greet expect(response).to eq 'Hello, John' end Testes complicados > Sem clareza
  21. @camposmilaa Coisas falsamente importantes it 'greets a person' do person

    = Person.new(name: 'John') response = Messenger.new(person).greet expect(response).to eq 'Hello, John' end Testes complicados > Sem clareza
  22. @camposmilaa Coisas falsamente importantes it 'greets a person' do person

    = Person.new(name: 'any-name') response = Messenger.new(person).greet expect(response).to eq 'Hello, any-name' end Testes complicados > Sem clareza
  23. @camposmilaa Ajeita tudo que precisa Chama o que está testando

    Verifica comportamento Testes complicados > Bangunçados
  24. @camposmilaa Testes fazem 3 coisas it 'greets a person' do

    person = Person.new(name: 'any-name') # Setup response = Messenger.new(person).greet # Exercise expect(response).to eq 'Hello, any-name' # Verify end Testes complicados > Bangunçados
  25. @camposmilaa Testes fazem 3 coisas it 'greets a person' do

    person = Person.new(name: 'any-name') # Setup response = Messenger.new(person).greet # Exercise expect(response).to eq 'Hello, any-name' # Verify end Testes complicados > Bangunçados
  26. @camposmilaa Testes fazem 3 coisas it 'greets a person' do

    person = Person.new(name: 'any-name') # Setup response = Messenger.new(person).greet # Exercise expect(response).to eq 'Hello, any-name' # Verify end Testes complicados > Bangunçados
  27. @camposmilaa it 'greets a person' do person = Person.new(name: 'any-name')

    # Setup response = Messenger.new(person).greet # Exercise expect(response).to eq 'Hello, any-name' # Verify end Testes fazem 3 coisas Testes complicados > Bangunçados
  28. @camposmilaa Testes fazem 3 coisas it 'greets a person' do

    person = Person.new(name: 'any-name') # Setup response = Messenger.new(person).greet # Exercise expect(response).to eq 'Hello, any-name' # Verify end Testes complicados > Bangunçados
  29. @camposmilaa Testes fazem 3 coisas it 'greets a person' do

    person = Person.new(name: 'any-name') # Setup response = Messenger.new(person).greet # Exercise expect(response).to eq 'Hello, any-name' # Verify end Testes complicados > Bangunçados
  30. @camposmilaa Testes fazem 3 coisas it 'sends email to person'

    do mailer = double('my mailer') # Setup person = Person.new(name: 'any-name', email: '[email protected]') # Setup expect(mailer).to receive(:notify).with(person.email) # Verify Messenger.new(person, mailer: mailer).send_email # Exercise end Testes complicados > Bangunçados
  31. @camposmilaa Testes fazem 3 coisas it 'sends email to person'

    do mailer = double('my mailer') # Setup person = Person.new(name: 'any-name', email: '[email protected]') # Setup expect(mailer).to receive(:notify).with(person.email) # Verify Messenger.new(person, mailer: mailer).send_email # Exercise end Testes complicados > Bangunçados
  32. @camposmilaa Testes fazem 3 coisas it 'sends email to person'

    do mailer = double('my mailer') # Setup person = Person.new(name: 'any-name', email: '[email protected]') # Setup expect(mailer).to receive(:notify).with(person.email) # Verify Messenger.new(person, mailer: mailer).send_email # Exercise end Testes complicados > Bangunçados
  33. @camposmilaa Testes fazem 3 coisas it 'sends email to person'

    do mailer = double('my mailer') # Setup person = Person.new(name: 'any-name', email: '[email protected]') # Setup expect(mailer).to receive(:notify).with(person.email) # Verify Messenger.new(person, mailer: mailer).send_email # Exercise end Testes complicados > Bangunçados
  34. @camposmilaa Testes fazem 3 coisas it 'sends email to person'

    do mailer = double('my mailer') # Setup person = Person.new(name: 'any-name', email: '[email protected]') # Setup expect(mailer).to receive(:notify).with(person.email) # Verify Messenger.new(person, mailer: mailer).send_email # Exercise end Testes complicados > Bangunçados
  35. @camposmilaa Testes fazem 3 coisas it 'sends email to person'

    do mailer = double('my mailer') # Setup person = Person.new(name: 'any-name', email: '[email protected]') # Setup expect(mailer).to receive(:notify).with(person.email) # Verify Messenger.new(person, mailer: mailer).send_email # Exercise end Testes complicados > Bangunçados
  36. @camposmilaa Testes fazem 3 coisas it 'sends email to person'

    do mailer = spy('my mailer') # Setup person = Person.new(name: 'any-name', email: '[email protected]') # Setup Messenger.new(person, mailer: mailer).send_email # Exercise expect(mailer).to have_received(:notify).with(person.email) # Verify end Testes complicados > Bangunçados
  37. @camposmilaa Testes fazem 3 coisas it 'sends email to person'

    do mailer = spy('my mailer') # Setup person = Person.new(name: 'any-name', email: '[email protected]') # Setup Messenger.new(person, mailer: mailer).send_email # Exercise expect(mailer).to have_received(:notify).with(person.email) # Verify end Testes complicados > Bangunçados
  38. @camposmilaa Testes mágicos it 'greets a person' do # ...

    end it 'gracefully greets a person' do # ... end Testes complicados > Mágicos
  39. @camposmilaa Testes mágicos it 'greets a person' do person =

    Person.new(name: 'any-name') response = Messenger.new(person).greet expect(response).to eq 'Hello, any-name' end it 'gracefully greets a person' do person = Person.new(name: 'any-name') response = Messenger.new(person).fancy_greet expect(response).to eq "Good afternoon, ma'am any-name!" end Testes complicados > Mágicos
  40. @camposmilaa Testes mágicos it 'greets a person' do person =

    Person.new(name: 'any-name') response = Messenger.new(person).greet expect(response).to eq 'Hello, any-name' end it 'gracefully greets a person' do person = Person.new(name: 'any-name') response = Messenger.new(person).fancy_greet expect(response).to eq "Good afternoon, ma'am any-name!" end Testes complicados > Mágicos
  41. @camposmilaa Testes mágicos it 'greets a person' do person =

    Person.new(name: 'any-name') response = Messenger.new(person).greet expect(response).to eq 'Hello, any-name' end it 'gracefully greets a person' do person = Person.new(name: 'any-name') response = Messenger.new(person).fancy_greet expect(response).to eq "Good afternoon, ma'am any-name!" end Testes complicados > Mágicos
  42. @camposmilaa Testes mágicos it 'greets a person' do person =

    Person.new(name: 'any-name') response = Messenger.new(person).greet expect(response).to eq 'Hello, any-name' end it 'gracefully greets a person' do person = Person.new(name: 'any-name') response = Messenger.new(person).fancy_greet expect(response).to eq "Good afternoon, ma'am any-name!" end Testes complicados > Mágicos
  43. @camposmilaa Testes mágicos let(:person) { Person.new(name: 'any-name') } it 'greets

    a person' do response = Messenger.new(person).greet expect(response).to eq 'Hello, any-name' end it 'gracefully greets a person' do response = Messenger.new(person).fancy_greet expect(response).to eq "Good afternoon, ma'am any-name!" end Testes complicados > Mágicos
  44. @camposmilaa Testes mágicos let(:person) { Person.new(name: 'any-name') } let(:messenger) {

    Messenger.new(person) } it 'greets a person' do expect(messenger.greet).to eq 'Hello, any-name' end it 'gracefully greets a person' do expect(messenger.fancy_greet).to eq "Good afternoon, ma'am any-name!" end Testes complicados > Mágicos
  45. @camposmilaa Testes mágicos let(:person) { Person.new(name: 'any-name') } let(:messenger) {

    Messenger.new(person) } it 'greets a person' do expect(messenger.greet).to eq 'Hello, any-name' end it 'gracefully greets a person' do expect(messenger.fancy_greet).to eq "Good afternoon, ma'am any-name!" end Testes complicados > Mágicos
  46. @camposmilaa Testes mágicos let(:person) { Person.new(name: 'any-name') } let(:messenger) {

    Messenger.new(person) } it 'greets a person' do expect(messenger.greet).to eq 'Hello, any-name' end it 'gracefully greets a person' do expect(messenger.fancy_greet).to eq "Good afternoon, ma'am any-name!" end Testes complicados > Mágicos
  47. @camposmilaa Testes mágicos let(:person) { Person.new(name: 'any-name') } let(:messenger) {

    Messenger.new(person) } it 'greets a person' do expect(messenger.greet).to eq "Hello, #{person.name}" end it 'gracefully greets a person' do expect(messenger.fancy_greet).to eq "Good afternoon, ma'am #{person.name}!" end Testes complicados > Mágicos
  48. @camposmilaa Testes mágicos let(:person) { Person.new(name: 'any-name') } let(:messenger) {

    Messenger.new(person) } it 'does an entirely different thing' do # .... end it 'greets a person' do expect(messenger.greet).to eq "Hello, #{person.name}" end it 'gracefully greets a person' do expect(messenger.fancy_greet).to eq "Good afternoon, ma'am #{person.name}!" end Testes complicados > Mágicos
  49. @camposmilaa Testes mágicos let(:person) { Person.new(name: 'any-name') } let(:messenger) {

    Messenger.new(person) } it 'does nothing sometimes' do # .... end it 'does an entirely different thing' do # .... end it 'greets a person' do expect(messenger.greet).to eq "Hello, #{person.name}" end it 'gracefully greets a person' do expect(messenger.fancy_greet).to eq "Good afternoon, ma'am #{person.name}!" end Testes complicados > Mágicos
  50. @camposmilaa Testes mágicos let(:person) { Person.new(name: 'any-name') } let(:messenger) {

    Messenger.new(person) } it 'does any other thing' do # .... end it 'does nothing sometimes' do # .... end it 'does an entirely different thing' do # .... end it 'greets a person' do expect(messenger.greet).to eq "Hello, #{person.name}" end it 'gracefully greets a person' do expect(messenger.fancy_greet).to eq "Good afternoon, ma'am #{person.name}!" end Testes complicados > Mágicos
  51. @camposmilaa Testes mágicos let(:person) { Person.new(name: 'any-name') } let(:messenger) {

    Messenger.new(person) } it 'does something else' do # .... end it 'does any other thing' do # .... end it 'does nothing sometimes' do # .... end it 'does an entirely different thing' do # .... end it 'greets a person' do expect(messenger.greet).to eq "Hello, #{person.name}" end it 'gracefully greets a person' do expect(messenger.fancy_greet).to eq "Good afternoon, ma'am #{person.name}!" end Testes complicados > Mágicos
  52. @camposmilaa Testes mágicos let(:person) { Person.new(name: 'any-name') } let(:messenger) {

    Messenger.new(person) } it 'does something' do # .... end it 'does something else' do # .... end it 'does any other thing' do # .... end it 'does nothing sometimes' do # .... end it 'does an entirely different thing' do # .... end it 'greets a person' do expect(messenger.greet).to eq "Hello, #{person.name}" end it 'gracefully greets a person' do expect(messenger.fancy_greet).to eq "Good afternoon, ma'am #{person.name}!" end Testes complicados > Mágicos
  53. @camposmilaa Testes mágicos let(:person) { Person.new(name: 'any-name') } let(:messenger) {

    Messenger.new(person) } it 'does something' do # .... end it 'does something else' do # .... end it 'does any other thing' do # .... end it 'does nothing sometimes' do # .... end it 'does an entirely different thing' do # .... end it 'greets a person' do expect(messenger.greet).to eq "Hello, #{person.name}" end it 'gracefully greets a person' do expect(messenger.fancy_greet).to eq "Good afternoon, ma'am #{person.name}!" end Testes complicados > Mágicos
  54. @camposmilaa Testes mágicos let(:person) { Person.new(name: 'any-name') } let(:messenger) {

    Messenger.new(person) } it 'does something' do # .... end it 'does something else' do # .... end it 'does any other thing' do # .... end it 'does nothing sometimes' do # .... end it 'does an entirely different thing' do # .... end it 'greets a person' do expect(messenger.greet).to eq "Hello, #{person.name}" end it 'gracefully greets a person' do expect(messenger.fancy_greet).to eq "Good afternoon, ma'am #{person.name}!" end Testes complicados > Mágicos
  55. @camposmilaa Mystery Guest it 'gracefully greets a person' do expect(messenger.fancy_greet).to

    eq "Good afternoon, ma'am #{person.name}!" end Testes complicados > Mágicos
  56. @camposmilaa Mystery Guest it 'gracefully greets a person' do expect(messenger.fancy_greet).to

    eq "Good afternoon, ma'am #{person.name}!" end Testes complicados > Mágicos
  57. @camposmilaa Mystery Guest it 'greets a person' do person =

    Person.new(name: 'any-name') response = Messenger.new(person).greet expect(response).to eq 'Hello, any-name' end it 'gracefully greets a person' do person = Person.new(name: 'any-name') response = Messenger.new(person).fancy_greet expect(response).to eq "Good afternoon, ma'am any-name!" end Testes complicados > Mágicos
  58. @camposmilaa Hora de refatorar!! Setup complexo/grande Múltiplas verificações Muitos passos

    de "exercise" Muitas dependências Muitas responsabilidades API complexa
  59. @camposmilaa Hora de refatorar!! Setup complexo/grande Múltiplas verificações Código complexo

    no test (ex. Loops, métodos privados) Muitos passos de "exercise" Muitas dependências Muitas responsabilidades API complexa
  60. @camposmilaa Hora de refatorar!! Muitos passos de "exercise" Setup complexo/grande

    Múltiplas verificações Código complexo no test (ex. Loops, métodos privados) Muitos passos de "exercise" Muitas dependências Muitas responsabilidades Código complexo API complexa
  61. @camposmilaa fases do teste usado 1x + nome bosta usado

    1x + de onde veio? o quê é esperado?