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

[CapiConf] Como não odiar seus testes

[CapiConf] 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

November 16, 2020
Tweet

More Decks by Camila Campos

Other Decks in Programming

Transcript

  1. @camposmilaa @camposmilaa Camila Campos Meu propósito de vida (WIP) é

    influenciar pessoas para reduzir desigualdades sócio-culturais dentro de tecnologia, através da educação e do bom humor.
  2. @camposmilaa Unidade Testes lentos controller service model model service repository

    model controller service model model service repository model
  3. @camposmilaa Unidade Testes lentos controller service model model service repository

    model controller service model model service repository model
  4. @camposmilaa Integração Testes lentos controller service model model service repository

    model controller service model model service repository model
  5. @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
  6. @camposmilaa Teste é uma parada que garante que o seu

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

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

    Simples Objetivo Teste é código não testado
  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 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 '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
  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 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
  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 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', last_name: 'Doe', age: 27) 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: 'John') response = Messenger.new(person).greet expect(response).to eq 'Hello, John' end Testes complicados > Sem clareza
  23. @camposmilaa Coisas falsamente importantes it 'greets a person' do person

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

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

    Verifica comportamento 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 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
  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 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
  30. @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
  31. @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
  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 = 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
  37. @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
  38. @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
  39. @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
  40. @camposmilaa Testes mágicos it 'greets a person' do # ...

    end it 'gracefully greets a person' do # ... 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 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
  44. @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
  45. @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
  46. @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
  47. @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
  48. @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
  49. @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
  50. @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
  51. @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
  52. @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
  53. @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
  54. @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
  55. @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
  56. @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
  57. @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
  58. @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
  59. @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
  60. @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
  61. @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
  62. @camposmilaa it 'greets a person' do person = Person.new( name:

    'any-name', att2: 'xpto', att3: 'xpto', att4: 'xpto', att5: 'xpto', att6: 'xpto', att7: 'xpto', att8: 'xpto', att9: 'xpto', att10: 'xpto', att11: 'xpto', att12: 'xpto', att13: 'xpto', att14: 'xpto', att15: 'xpto', att16: 'xpto', att17: 'xpto', att18: 'xpto', att19: 'xpto', att20: 'xpto', att21: 'xpto', att22: 'xpto', att23: 'xpto' ) response = Messenger.new(person).greet expect(response).to eq 'Hello, any-name' end Mystery Guest Testes complicados > Mágicos
  63. @camposmilaa it 'greets a person' do person = Person.new(person_attributes.merge(name: 'any-name'))

    response = Messenger.new(person).greet expect(response).to eq 'Hello, any-name' end Mystery Guest Testes complicados > Mágicos
  64. @camposmilaa Hora de refatorar!! Setup complexo/grande Múltiplas verificações Muitos passos

    de "exercise" Muitas dependências Muitas responsabilidades API complexa
  65. @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
  66. @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
  67. @camposmilaa Testes redundantes controller service model repository A B Testes

    desnecessários controller service model repository
  68. @camposmilaa Testes redundantes controller service model repository A B A

    B Testes desnecessários controller service model repository A B
  69. @camposmilaa Testes redundantes controller service model repository A B A

    B A B Testes desnecessários controller service model repository A B A B
  70. @camposmilaa Testes redundantes controller service model repository A B A

    B A B C Testes desnecessários controller service model repository A C A B A B
  71. @camposmilaa Testes redundantes controller service model repository A B A

    B A B C C Testes desnecessários controller service model repository A A A B
  72. @camposmilaa Testes redundantes controller service model repository A B A

    B A B C C C Testes desnecessários controller service model repository A A A
  73. @camposmilaa Testes redundantes controller service model repository A B A

    B A B C C C Testes desnecessários controller service model repository A A A
  74. @camposmilaa Testes redundantes controller service model repository A B A

    A C Testes desnecessários controller service model repository A A A