Testing sucks
date post
17-May-2015Category
Technology
view
930download
2
Embed Size (px)
description
Transcript of Testing sucks
Testing SucksLeo Balter - BrazilJS 2012 JS
Testar chato!
Testes vs Testar!
Testes humanos Repetitivos Estressantes Cansativos
Concentrao polarizada
Nos concentramos em um nico ponto No vemos os demais falsa sensao de segurana
Olhar Viciado
Testes de Trollagem
Pare de ficar testando seu cdigo
JSHint/JSLint no testa cdigo!
Conveno de estilo Erros comuns As Boas Partes
Mito do Compilador
Pnico vs Benefcios
Muito fcil criar testes para algo que ainda no existe
No to simples quando a aplicao j existe e est no ar.
Aplicao no testada
A Sndrome do o que est
funcionando no se deve mexer.
Quebre a aplicao! Criamos testes simples que passem Teste o que est em produo Cobertura de testes O que crtico? Especificao O que falta testar? Testes de Trollagem
Acredite:Sua aplicao vai falhar!
J viu essa sndrome?
No vai ao mdico pra evitar descobrir um mal grave
Pode haver um problema latente que vai falhar em um momento crtico
Pode acabar em morte
Na aplicao
No testamos para no descobrir o que falha
H problemas latentes que vo falhar em momentos crticos (Por exemplo: um sistema de pagamento do seu e-commerce)
Sua empresa morre (vai a falncia)
Estabelea o que crtico
Quo crtico cada parte do seu sistema? Se no funcionar, quais as consequncias?
Impacto
Ocorrncia
Baixo
Baixo Alto
Alto
Risco de baixo nvel
Risco de nvel mdio
Risco Crtico
http://bit.ly/11tTwNGerenciamento de Risco
http://bit.ly/11tTwNhttp://bit.ly/11tTwNAutomatizao
--Retrabalho --Surpresas Mais tempo para o que interessante Menos tempo para testar tudo novamente
Automatizao
--Retrabalho --Surpresas Mais tempo para o que interessante Menos tempo para testar tudo novamente
Metodologias geis
Aplicar testes uma rotina contida em Metodologias geis
Testes no dependem de metodologias geis Ex.: jQuery
Funciona
Faz o que deveria
Esse cdigo funciona!
Um cdigo pode funcionar perfeitamente
Estar 100% testado e no cumprir 10%
do seu papel
Fluxo
Especificao
Fluxo
Especificao
Plano de Testes
Fluxo
Especificao
Plano de Testes
TestesFluxo
Validao
Plano de Testes
Validao
Especificao
Plano de Testes
Validao
Especificao
Plano de Testes Testes
Validao
Especificao
Plano de Testes Testes
Aplicao
Validao
Testes no validam especificao!
Testes no criam especificao!
Testes vs Especificao
Se os testes validassem especificao, no poderiamos prever correes de bugs e comportamentos de ambientes.
Bugs no fazem parte de uma especificao.
Baby Steps (Testes Unitrios)
Teste que Falha Cdigo Refatorar
Sempre em Baby Steps
timo para pegar o ritmo funo 1, 2, 3, pin Treino do Lutador
Coberturade
Cdigo
function foo( bar ) { if ( bar ) { console.log( 'yes!' ); else { console.log( 'no!' ); }}
function foo( bar ) { if ( bar ) { console.log( 'yes!' ); else { console.log( 'no!' ); }}
function foo( bar ) { if ( bar ) { console.log( 'yes!' ); else { console.log( 'no!' ); }}
function foo( bar ) { if ( bar ) { console.log( 'yes!' ); else { console.log( 'no!' ); }}
function foo( bar ) { if ( bar ) { console.log( 'yes!' ); else { console.log( 'no!' ); }}
function foo( bar ) { if ( bar ) { console.log( 'yes!' ); else { console.log( 'no!' ); }}
Cdigo 100% cobertopor testes!
JSCoverage CoverJS
Tudo testvel
Complexidade vs Criticidade window.location.replace()
Testes em JavaScript
JS
Testes
Unitrios
FuncionaisInterface
IntegraoDesempenho
Open Web
vrios ambientes
Chrome
Firefox
Opera
IE 8, 9[, 10, ...]
Chrome
Firefox
Opera
IE 8, 9[, 10, ...]
Mobile
PhantomJS
Webkit
Ferramentas
QUnit
JasmineMocha
NodeUnit
Vows
Estilos de Testes
TDD BDD Exports
module( "Basics" );
test( "hello test", function() {ok( 1 == "1", "Passed!" );});
http://qunitjs.com/
TDD
http://qunitjs.comhttp://qunitjs.commodule( "Basics" );
test( "hello test", function() {ok( 1 == "1", "Passed!" );});
http://qunitjs.com/
TDD
http://qunitjs.comhttp://qunitjs.commodule( "Basics" );
test( "hello test", function() {ok( 1 == "1", "Passed!" );});
http://qunitjs.com/
TDD
http://qunitjs.comhttp://qunitjs.commodule( "Basics" );
test( "hello test", function() {ok( 1 == "1", "Passed!" );});
http://qunitjs.com/
TDD
http://qunitjs.comhttp://qunitjs.commodule( "Basics" );
test( "hello test", function() {ok( 1 == "1", "Passed!" );});
http://qunitjs.com/
TDD
http://qunitjs.comhttp://qunitjs.commodule( "Basics" );
test( "hello test", function() {ok( 1 == "1", "Passed!" );});
http://qunitjs.com/
TDD
http://qunitjs.comhttp://qunitjs.commodule( "Basics" );
test( "hello test", function() {ok( 1 == "1", "Passed!" );});
http://qunitjs.com/
TDD
http://qunitjs.comhttp://qunitjs.commodule( "Basics" );
test( "hello test", function() {ok( 1 == "1", "Passed!" );});
http://qunitjs.com/
TDD
http://qunitjs.comhttp://qunitjs.commodule( "Basics" );
test( "hello test", function() {ok( 1 == "1", "Passed!" );});
http://qunitjs.com/
TDD
http://qunitjs.comhttp://qunitjs.comQUnit Example
QUnit Example
QUnit Example
QUnit Example
QUnit Example
QUnit Example
QUnit Example
QUnit Example
QUnit Example
describe("A suite", function() { it("spec with an expectation",
function(){ expect(true).toBe(true); });
});
BDD
describe("A suite", function() { it("spec with an expectation",
function(){ expect(true).toBe(true); });
});
BDD
describe("A suite", function() { it("spec with an expectation",
function(){ expect(true).toBe(true); });
});
BDD
describe("A suite", function() { it("spec with an expectation",
function(){ expect(true).toBe(true); });
});
BDD
describe("A suite", function() { it("spec with an expectation",
function(){ expect(true).toBe(true); });
});
BDD
describe("A suite", function() { it("spec with an expectation",
function(){ expect(true).toBe(true); });
});
BDD
Exports
module.exports = { test1: function (test) { test.equals(this.foo, 'bar'); test.done(); }};
Exports
module.exports = { test1: function (test) { test.equals(this.foo, 'bar'); test.done(); }};
Exports
module.exports = { test1: function (test) { test.equals(this.foo, 'bar'); test.done(); }};
Exports
module.exports = { test1: function (test) { test.equals(this.foo, 'bar'); test.done(); }};
Exports
module.exports = { test1: function (test) { test.equals(this.foo, 'bar'); test.done(); }};
Como comear?
HTML Esttico
JavaScript
Testes
QUnit Example bar
QUnit Example bar
Cdigo testado tem bom desempenho?
Testes unitrios no medem desempenho Existem testes de desempenho Cdigo sem erros pode evitar lentido
DexterJS
Dexter.spy
http://jsbin.com/osijuq/7/edit
function carly( crazy ) { if ( typeof ( crazy ) === 'number' ) { return 'Call me maybe?'; } else { return 'Hey, I just met you!, and this is ' + crazy; }}
function meSad( maybe ) { return carly( maybe ? 5555555 : 'crazy!' );}
http://jsbin.com/osijuq/3http://jsbin.com/osijuq/3http://jsbin.com/osijuq/7/edit
function carly( crazy ) { if ( typeof ( crazy ) === 'number' ) { return 'Call me maybe?'; } else { return 'Hey, I just met you!, and this is ' + crazy; }}
function meSad( maybe ) { return carly( maybe ? 5555555 : 'crazy!' );}
http://jsbin.com/osijuq/3http://jsbin.com/osijuq/3http://jsbin.com/osijuq/7/edit
function carly( crazy ) { if ( typeof ( crazy ) === 'number' ) { return 'Call me maybe?'; } else { return 'Hey, I just met you!, and this is ' + crazy; }}
function meSad( maybe ) { return carly( maybe ? 5555555 : 'crazy!' );}
http://jsbin.com/osijuq/3http://jsbin.com/osijuq/3http://jsbin.com/osijuq/7/edit
function carly( crazy ) { if ( typeof ( crazy ) === 'number' ) { return 'Call me maybe?'; } else { return 'Hey, I just met you!, and this is ' + crazy; }}
function meSad( maybe ) { return carly( maybe ? 5555555 : 'crazy!' );}
http://jsbin.com/osijuq/3http://jsbin.com/osijuq/3