Slide 1

Slide 1 text

WTF to Test Qualidade de software na prática 4 de Fevereiro 2015 #qa #tdd #agile #ci #dev

Slide 2

Slide 2 text

Edson Hilios Engenheiro @ Centro de Inovação Telefónica | Vivo http://edson.hilios.com.br

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

Time ágil

Slide 5

Slide 5 text

Processo 1. Aprovação da história 2. Desenvolvimento 3. Code review 4. UX review 5. Test review 6. Aceitação

Slide 6

Slide 6 text

Quem aqui testa código?

Slide 7

Slide 7 text

Por quê testar? ● Manter sua sanidade mental; ● Ajuda a encontrar/resolver de bugs; ● Facilita refatoração; ● Documentação; ● Melhora o design do código; TL; DR: Garante um trabalho com qualidade.

Slide 8

Slide 8 text

Faça direito da primeira vez! – Crosby, P. B.

Slide 9

Slide 9 text

O mito do super-programador! https://www.youtube.com/watch?v=0SARbwvhupQ

Slide 10

Slide 10 text

Uma questão de processo ● Critérios de aceitação ● Test case ● Code review ● Test review ● Testes manuais ● Testes automáticos

Slide 11

Slide 11 text

Curva de produtividade Ínicio do projeto (poucas features) Maturação do projeto Muito tempo de projeto (muitas features) Produtividade Tempo

Slide 12

Slide 12 text

WTF#1 25 minutos de exec de testes! 12.326,228 seconds

Slide 13

Slide 13 text

Desenvolvimento "ágil"! 12.326,228 segundos são: 3 horas 42 min 43 seg e 228 ms

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

0 1 2 3 4 5 6 7 8 9 10 Test unitario test('fibonacci function', function() { expect(fibonacci(0)).to.be(0); expect(fibonacci(1)).to.be(1); expect(fibonacci(2)).to.be(1); expect(fibonacci(3)).to.be(2); expect(fibonacci(2)).to.be(3); expect(fibonacci(2)).to.be(5); // ... expect(fibonacci(10)).to.be(55); });

Slide 16

Slide 16 text

● Controllers / Activities ● Views / Fragments ● Models ● Rotas ● Serviços globais Software padrão 2015

Slide 17

Slide 17 text

Test case ● Faz a chamada do modelo correto? ● Expõe as váriavies corretas? ● Renderiza o template correto? ● Variaveis são exibidas no template?

Slide 18

Slide 18 text

Só que você não está testando a sua aplicação, e sim o framework!

Slide 19

Slide 19 text

0 1 2 3 4 5 6 7 8 9 10 View test test('element should render correctly', function() { var template = '' + '' + ''; expect(element.html()).to.be.equal(template); });

Slide 20

Slide 20 text

Cuidado para não gerar testes que no fundo não testam nada

Slide 21

Slide 21 text

Use com moderação Testes unitários só são uteis quando trabalham isolados, isto é, com poucas ou nenhuma dependencia e interação simples.

Slide 22

Slide 22 text

Mocks Fixtures ... Controller Views Models Scripts Resultado renderizado Testes E2E Prepara ambiente Executa pré-condições Executa teste

Slide 23

Slide 23 text

Fixtures e mocks Fixtures são os dados iniciais do seu app, necessários para a execução dos testes. Mocks são respostas ficticias para uma determinada função (ex: resposta de uma API).

Slide 24

Slide 24 text

Test case Como um usuário logado quando entro em LiveTV, eu vejo a lista de canais disponiveis, com nome, numero do canal, o programa atual e o próximo programa com hora de inicio e fim.

Slide 25

Slide 25 text

0 1 2 3 4 5 6 7 8 9 10 Teste E2E beforeTest('element should render', function() { loginAs('userWithHBO'); }); test('element should render correctly', function() { var channel = 'HBO HD'; var currentShow = 'Game of Thrones'; expect(element.html()).contains(orderNum); expect(element.html()).contains(status); });

Slide 26

Slide 26 text

Automatização E2E ● Selenium ● Protractor ● Sikuli Script

Slide 27

Slide 27 text

0 1 2 3 4 5 6 7 8 9 10 Teste E2Fail test('element should render correctly', function() { expect(element.html()).have.element('h1.main'); expect(element.html()).have .element('ul.channel-list'); var channelList = element.html().find('ul.channel-list'); expect(channelList).to.have.length.gt(0); expect(channelList.html()) .contains('HBO HD') });

Slide 28

Slide 28 text

Alterou o componente da view e todos os testes quebram

Slide 29

Slide 29 text

0 1 2 3 4 5 6 7 8 9 10 Teste E2E automatizado startApp(); # Login clickLink('login'); fill('Usuario', '[email protected]'); fill('Senha', '1234'); clickButton('Login'); # Pedidor clickLink('Meus pedidos'); findText('Pedido 1', 'Pedido 2', ...); findText('Status: Aprovado'); findText('Status: Em andamento');

Slide 30

Slide 30 text

Testes E2E geralmente são lentos ...e são executados na nuvem

Slide 31

Slide 31 text

O que testar? Teste apenas o caminho crítico do seu negócio e/ou cliente: ● Pipeline de pagamento ● Registro de usuários ● Regra de negócio importante ● Login ● ...

Slide 32

Slide 32 text

Mas como manter a qualidade sem testar?

Slide 33

Slide 33 text

Visita todos as views de um app procurando por erros comuns: ● Campo vazio ● Erro nos scripts ● Página não carregou ● Nenhuma imagem quebrada ● ... Smoke test

Slide 34

Slide 34 text

0 1 2 3 4 5 6 7 8 9 10 links = ['/'] visited = [] # Visita todos os links e verifica se há erros while len(links) > 0: uri = links.pop(0) visited.append(uri) assert page_is_ok(uri) for a in get_all_links(): if a.get('href') not in visited: links.append(a.get('href')) One test to rule them all!

Slide 35

Slide 35 text

De repente sua UI...

Slide 36

Slide 36 text

0 1 2 3 4 5 6 7 8 9 10 Teste de interface test('element should render correctly', function() { expect(element).to.have .css('background-color', '#ff0000'); expect(element).to.have .css('font', 'Arial'); ... });

Slide 37

Slide 37 text

Owwwwww!!!

Slide 38

Slide 38 text

Visual diffs

Slide 39

Slide 39 text

Ferramentas UI/E2E ● Huxley (facebook) ● Dpxdt (Google) ● Wraith (BBC) ● PhantomCSS ● ImageMagick

Slide 40

Slide 40 text

A falácia do Code Coverage Code coverage como métrica de qualidade é uma mentira, pois nos leva a crêr que escrever um teste por si só, já é o suficiente.

Slide 41

Slide 41 text

Regra do dedão Testes, assim como funcionalidades, tem que ter prioridade e objetivo, que representem os requisitos dos stackholders.

Slide 42

Slide 42 text

Cenário ideal ● Caminho critíco coverage de 100% ● Teste de formulários ● Smoke test ● Regressão de layout ● 1 bug = 1 teste

Slide 43

Slide 43 text

A definição de qualidade é conformidade com os requerimentos do projeto (tanto do ponto de vista de produto quanto do consumidor) – Crosby, P. B.

Slide 44

Slide 44 text

Tks! Twitter: @hilios Site: http://edson.hilios.com.br Apresentação: http://speakerdeck.com/hilios GitHub: http://github.com/hilios