Slide 1

Slide 1 text

Boa noite!

Slide 2

Slide 2 text

Quem sou eu? ulissesalmeida

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

http://www.plataformatec.com.br

Slide 6

Slide 6 text

Testes Automatizados Reduzindo erros de manutenção no código

Slide 7

Slide 7 text

Hoje iremos estudar como o programador faz seus testes

Slide 8

Slide 8 text

Na faculdade

Slide 9

Slide 9 text

Exercício bacana

Slide 10

Slide 10 text

Codificamos

Slide 11

Slide 11 text

As ferramentas nos ajudam

Slide 12

Slide 12 text

Porém na hora de usar o programa

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

Minimizando esse risco

Slide 16

Slide 16 text

Código modular

Slide 17

Slide 17 text

Nomes significativos int a, b, fCont; float mTeZ(float b)

Slide 18

Slide 18 text

Testar cedo e frequente

Slide 19

Slide 19 text

Sucesso na entrega do exercício!

Slide 20

Slide 20 text

Tá pronto! Valeu professor até semana que vem!

Slide 21

Slide 21 text

Semana seguinte: novo exercício

Slide 22

Slide 22 text

Sem evolução e manutenção do código antigo.

Slide 23

Slide 23 text

Mas no dia-a-dia

Slide 24

Slide 24 text

É todo dia

Slide 25

Slide 25 text

Não trabalha sozinho

Slide 26

Slide 26 text

Requisitos novos

Slide 27

Slide 27 text

O código fica maior

Slide 28

Slide 28 text

Dúvidas surgem

Slide 29

Slide 29 text

Conflitos de requisitos e interesses

Slide 30

Slide 30 text

Bugs novos e velhos

Slide 31

Slide 31 text

Difícil adicionar algo novo

Slide 32

Slide 32 text

Software Engineering Economics, Barry Boehm Só fica pior

Slide 33

Slide 33 text

A culpa é...

Slide 34

Slide 34 text

Software Engineering Economics, Barry Boehm Melhorias!

Slide 35

Slide 35 text

Como o desenvolvedor fez os testes?

Slide 36

Slide 36 text

Manualmente!

Slide 37

Slide 37 text

Testes manuais são apagados

Slide 38

Slide 38 text

Sujam o código fonte

Slide 39

Slide 39 text

Não existe um padrão

Slide 40

Slide 40 text

Trabalhoso de se repetir

Slide 41

Slide 41 text

O desenvolvedor precisa melhorar seus testes!

Slide 42

Slide 42 text

Como melhorar? • Automatizar os testes manuais • Um espaço no código fonte para escrever os testes • Uma forma padrão de escrever • Que seja simples de executar

Slide 43

Slide 43 text

Automatizar um teste? Escrever código que confirma os resultados previstos do software.

Slide 44

Slide 44 text

Desenvolvimento Ágil

Slide 45

Slide 45 text

Ferramentas para todas linguagens RSpec Cucumber JUnit MSpec unittest PHPUnit SimpleTest Jasmine

Slide 46

Slide 46 text

Vamos aprender escrever os testes

Slide 47

Slide 47 text

Passo a passo

Slide 48

Slide 48 text

Exemplo simples

Slide 49

Slide 49 text

Quero um sistema de conta bancária

Slide 50

Slide 50 text

Ferramentas

Slide 51

Slide 51 text

Ruby • Uma linguagem dinâmica, open source com foco na simplicidade e na produtividade. Tem uma sintaxe elegante de leitura natural e fácil escrita. https://www.ruby-lang.org/pt/

Slide 52

Slide 52 text

puts 'Olá mundo'

Slide 53

Slide 53 text

TestUnit • Uma ferramenta de testes para ruby. • Segue o design xUnit criado por Kent Beck(XP e TDD)

Slide 54

Slide 54 text

Criando o esboço do programa

Slide 55

Slide 55 text

Saldo 0 Depósito de R$ 100 Saldo 100

Slide 56

Slide 56 text

Saldo 100 Saque de R$ 80 Saldo 20

Slide 57

Slide 57 text

conta_bancaria.rb saldo = 0 deposito = 100 saldo = saldo + deposito puts saldo

Slide 58

Slide 58 text

terminal ruby conta_bancaria.rb 100

Slide 59

Slide 59 text

conta_bancaria.rb def deposita(saldo, valor) return saldo + valor end def saca(saldo, valor) return saldo - valor end

Slide 60

Slide 60 text

conta_bancaria.rb saldo = 0 saldo = deposita(saldo, 100) puts saldo saldo = saca(saldo, 80) puts saldo

Slide 61

Slide 61 text

terminal ruby conta_bancaria.rb 100 20

Slide 62

Slide 62 text

conta_bancaria.rb saldo = 0 saldo = deposita(saldo, 100) puts saldo saldo = saca(saldo, 50) puts saldo

Slide 63

Slide 63 text

Ta pronto!

Slide 64

Slide 64 text

Quero fazer transferência entre contas!

Slide 65

Slide 65 text

conta_bancaria.rb def deposita(saldo, valor) return saldo + valor end def saca(saldo, valor) return saldo - valor end

Slide 66

Slide 66 text

Not good :(

Slide 67

Slide 67 text

conta_bancaria.rb class ContaBancaria def initialize(saldo) @saldo = saldo end end

Slide 68

Slide 68 text

conta_bancaria.rb def saldo return @saldo end

Slide 69

Slide 69 text

conta_bancaria.rb def deposita(valor) @saldo = @saldo + valor end

Slide 70

Slide 70 text

conta_bancaria.rb def saca(valor) @saldo = @saldo - valor end

Slide 71

Slide 71 text

Testar tudo novamente :/

Slide 72

Slide 72 text

Vamos automatizar :D

Slide 73

Slide 73 text

conta_bancaria_test.rb require 'test/unit' require 'conta_bancaria' class ContaBancariaTeste < Test::Unit::TestCase end

Slide 74

Slide 74 text

conta_bancaria_test.rb def test_deposita conta = ContaBancaria.new(0) conta.deposita(100) assert_equal 100, conta.saldo end

Slide 75

Slide 75 text

terminal ruby -I . conta_bancaria_test.rb 1 tests, 1 assertions, 0 failures, 0 errors, 0 skips

Slide 76

Slide 76 text

conta_bancaria_test.rb def test_saca conta = ContaBancaria.new(100) conta.saca(100) assert_equal 0, conta.saldo end

Slide 77

Slide 77 text

terminal ruby -I . conta_bancaria_test.rb 2 tests, 2 assertions, 0 failures, 0 errors, 0 skips

Slide 78

Slide 78 text

conta_bancaria.rb def deposita(valor) @saldo = @saldo + valor + 1 end

Slide 79

Slide 79 text

terminal ruby -I . conta_bancaria_test.rb [1/2] ContaBancariaTeste#test_deposita = 0.00 s 1) Failure: ContaBancariaTeste#test_deposita [conta_bancaria_test.rb:10]: <100> expected but was <101>. 2 tests, 2 assertions, 1 failures, 0 errors, 0 skips

Slide 80

Slide 80 text

terminal ContaBancariaTeste#test_deposita: <100> expected but was <101>.

Slide 81

Slide 81 text

No content

Slide 82

Slide 82 text

Testes unitários Testes de funções do código independente de outras partes do sistema

Slide 83

Slide 83 text

A transferência

Slide 84

Slide 84 text

Conta de Origem Saldo = 150 Transferência de R$ 50 Conta de Destino Saldo = 200 Conta de Origem Saldo = 100 Conta de Destino Saldo = 250

Slide 85

Slide 85 text

transferencia.rb class Transferencia def initialize(conta_origem, conta_destino) @conta_origem = conta_origem @conta_destino = conta_destino end end

Slide 86

Slide 86 text

transferencia.rb def transfere(valor) @conta_destino.deposita(valor) @conta_origem.saca(valor) end

Slide 87

Slide 87 text

transferencia_test.rb require 'test/unit' require 'conta_bancaria' require 'transferencia' class TransferenciaTest < Test::Unit::TestCase end

Slide 88

Slide 88 text

transferencia_test.rb def test_transferencia conta_origem = ContaBancaria.new(150) conta_destino = ContaBancaria.new(200) transferencia = Transferencia.new( conta_origem, conta_destino ) transferencia.transfere(50) assert_equal 100, conta_origem.saldo assert_equal 250, conta_destino.saldo end

Slide 89

Slide 89 text

transferencia.transfere(50) assert_equal 100, conta_origem.saldo assert_equal 250, conta_destino.saldo

Slide 90

Slide 90 text

terminal ruby -I . transferencia_test.rb 1 tests, 2 assertions, 0 failures, 0 errors, 0 skips

Slide 91

Slide 91 text

Testes de integração Testes da interação entre as funções e objetos do sistema

Slide 92

Slide 92 text

BUG! É possível ter saques maiores que o saldo!

Slide 93

Slide 93 text

Abordagem diferente

Slide 94

Slide 94 text

conta_bancaria_test.rb def test_saca_com_saldo_insuficiente conta = ContaBancaria.new(100) assert_raises(Exception) { conta.saca(200) } end

Slide 95

Slide 95 text

terminal ruby -I . conta_bancaria_test.rb ContaBancariaTeste#test_saca_com_saldo_insuficiente Exception expected but nothing was raised. 3 tests, 3 assertions, 1 failures, 0 errors, 0 skips

Slide 96

Slide 96 text

conta_bancaria.rb def saca(valor) if saldo >= valor @saldo = @saldo - valor else raise Exception, 'Saldo insuficiente' end end

Slide 97

Slide 97 text

terminal ruby -I . conta_bancaria_test.rb 3 tests, 3 assertions, 0 failures, 0 errors, 0 skips

Slide 98

Slide 98 text

Corrigimos o bug, garantimos que ele não volte

Slide 99

Slide 99 text

Mas ainda temos a transferência!

Slide 100

Slide 100 text

transferencia_test.rb def test_transferencia_origem_sem_saldo conta_origem = ContaBancaria.new(150) conta_destino = ContaBancaria.new(200) transferencia = Transferencia.new( conta_origem, conta_destino ) assert !transferencia.transfere(200) assert_equal 150, conta_origem.saldo assert_equal 200, conta_destino.saldo end

Slide 101

Slide 101 text

transferencia_test.rb assert !transferencia.transfere(200) assert_equal 150, conta_origem.saldo assert_equal 200, conta_destino.saldo

Slide 102

Slide 102 text

terminal ruby -I . transferencia_test.rb TransferenciaTest#test_transferencia_origem_sem_saldo: Exception: Saldo insuficiente 3 tests, 3 assertions, 0 failures, 1 errors, 0 skips

Slide 103

Slide 103 text

transferencia.rb def transfere(valor) @conta_destino.deposita(valor) @conta_origem.saca(valor) rescue Exception return false end

Slide 104

Slide 104 text

terminal ruby -I . transferencia_test.rb TransferenciaTest#test_transferencia_origem_sem_saldo: <200> expected but was <400>. 2 tests, 5 assertions, 1 failures, 0 errors, 0 skips

Slide 105

Slide 105 text

No content

Slide 106

Slide 106 text

transferencia_test.rb assert_equal 200, conta_destino.saldo

Slide 107

Slide 107 text

transferencia.rb @conta_destino.deposita(valor) @conta_origem.saca(valor)

Slide 108

Slide 108 text

transferencia.rb @conta_origem.saca(valor) @conta_destino.deposita(valor)

Slide 109

Slide 109 text

terminal ruby -I . transferencia_test.rb 2 tests, 5 assertions, 0 failures, 0 errors, 0 skips

Slide 110

Slide 110 text

Descobrimos um bug e garantimos que não volte

Slide 111

Slide 111 text

Melhorando o design

Slide 112

Slide 112 text

The value returned by a Ruby method is the value of the last expression evaluated, so we can get rid of the return statement altogether. http://ruby-doc.com/docs/ProgrammingRuby/

Slide 113

Slide 113 text

def saldo return @saldo end def transfere(valor) @conta_origem.saca(valor) @conta_destino.deposita(valor) rescue Exception return false end

Slide 114

Slide 114 text

Você teria coragem de remover?

Slide 115

Slide 115 text

Não mexa no que está funcionando

Slide 116

Slide 116 text

Mas com testes automatizados

Slide 117

Slide 117 text

É trivial checar se o sistema continua funcionando

Slide 118

Slide 118 text

def saldo @saldo end def transfere(valor) @conta_origem.saca(valor) @conta_destino.deposita(valor) rescue Exception false end

Slide 119

Slide 119 text

terminal ruby -I . conta_bancaria_test.rb 3 tests, 3 assertions, 0 failures, 0 errors, 0 skips ruby -I . transferencia_test.rb 2 tests, 5 assertions, 0 failures, 0 errors, 0 skips

Slide 120

Slide 120 text

Here we've defined three accessor methods to return the values of the three instance attributes. Because this is such a common idiom, Ruby provides a convenient shortcut: attr_reader creates these accessor methods for you. http://ruby-doc.com/docs/ProgrammingRuby/

Slide 121

Slide 121 text

def saldo @saldo end attr_reader :saldo

Slide 122

Slide 122 text

terminal ruby -I . conta_bancaria_test.rb 3 tests, 3 assertions, 0 failures, 0 errors, 0 skips ruby -I . transferencia_test.rb 2 tests, 5 assertions, 0 failures, 0 errors, 0 skips

Slide 123

Slide 123 text

Temos segurança de mudar

Slide 124

Slide 124 text

Pois é rápido verificar

Slide 125

Slide 125 text

Sistemas possuem interface

Slide 126

Slide 126 text

É possível automatizar! visit root_path click_link 'Sign up' within('form') do fill_in 'Name', with: 'Billy' fill_in 'Email', with: '[email protected]' fill_in 'Password', with: 'strong_password' fill_in 'Confirm password', with: 'strong_password' click_button('Sign up!') end

Slide 127

Slide 127 text

Testes de aceitação Testes do ponto de vista do usuário

Slide 128

Slide 128 text

Você não trabalha sozinho

Slide 129

Slide 129 text

Servidores de testes Usando os testes como apoio para comunicação da equipe

Slide 130

Slide 130 text

Servidor dedicado a executar os testes

Slide 131

Slide 131 text

Concluindo...

Slide 132

Slide 132 text

Os testes automatizados

Slide 133

Slide 133 text

Descrevem o comportamento do software

Slide 134

Slide 134 text

São executáveis

Slide 135

Slide 135 text

Contribuem para

Slide 136

Slide 136 text

Reduzir o número de bugs

Slide 137

Slide 137 text

Adição de melhorias

Slide 138

Slide 138 text

Comunicação

Slide 139

Slide 139 text

Velocidade de desenvolvimento

Slide 140

Slide 140 text

Time is money!

Slide 141

Slide 141 text

Cuidado • Devem ser mantidos com zelo • Não removem a necessidade de QA e testes manuais

Slide 142

Slide 142 text

Exemplos https://github.com/ ulissesalmeida/bank- account-sample

Slide 143

Slide 143 text

Slides https://speakerdeck.com/ ulissesalmeida

Slide 144

Slide 144 text

Testes te dão confiança para mudança!

Slide 145

Slide 145 text

Referências • https://www.ruby-lang.org • http://rubyonrails.org/ • http://www.casadocodigo.com.br/products/livro- cucumber-rspec-tdd-bdd

Slide 146

Slide 146 text

Referências • http://pragprog.com/book/jvrails2/crafting-rails-4- applications • http://www.amazon.com/Clean-Code-Handbook- Software-Craftsmanship/dp/0132350882 • http://en.wikipedia.org/wiki/Test_automation

Slide 147

Slide 147 text

Obrigado!