como nÃo testar o seu projeto de software. devday 2014

106
Como NÃO testar SW? uma palestra da

Upload: alexandre-freire

Post on 14-Jun-2015

920 views

Category:

Technology


1 download

DESCRIPTION

Em primeiro lugar, teste seu projeto. Depois aprenda como NÃO testá-lo. Palestra cheia de exemplos de testes que hoje em dia não escrevemos mais, para nos lembrar dos testes que temos continuar automatizando. Dev Day 2014

TRANSCRIPT

Page 1: Como NÃO testar o seu projeto de Software. DevDay 2014

Como NÃO testar SW?

uma palestra da

Page 2: Como NÃO testar o seu projeto de Software. DevDay 2014

@freire_da_silva

• Director of Product Safety @IndustrialLogic

• Agil desde 2001, lean desde a 1ª série

• Founder: AgilCoop, AgilBits e ).(

• Mestrado na USP: “Reflexões sobre o Ensino de Metodologias Ágeis na Academia, Indústria e Governo”

• Gosto de nadar e construir casas

• Experiência e sucesso com muitos amigos: [email protected]

Page 3: Como NÃO testar o seu projeto de Software. DevDay 2014
Page 4: Como NÃO testar o seu projeto de Software. DevDay 2014

Você TESTA?

Page 5: Como NÃO testar o seu projeto de Software. DevDay 2014

TODO SW TEM BUG?

Page 6: Como NÃO testar o seu projeto de Software. DevDay 2014
Page 7: Como NÃO testar o seu projeto de Software. DevDay 2014
Page 8: Como NÃO testar o seu projeto de Software. DevDay 2014

TODO SW TEM BUG!

Page 9: Como NÃO testar o seu projeto de Software. DevDay 2014

/1947

Page 10: Como NÃO testar o seu projeto de Software. DevDay 2014
Page 11: Como NÃO testar o seu projeto de Software. DevDay 2014

1999: !Imperial instead of metric units !cause Mars Climate Orbiter…

to disintegrate!

Page 12: Como NÃO testar o seu projeto de Software. DevDay 2014
Page 13: Como NÃO testar o seu projeto de Software. DevDay 2014
Page 14: Como NÃO testar o seu projeto de Software. DevDay 2014

if((err=SSLFreeBuffer(&hashCtx))!=0) goto fail; if((err=ReadyHash(&SHA1,&hashCtx))!=0) goto fail; if((err=SHA1.update(&hashCtx,&rand))!=0) goto fail; goto fail; if((err=SHA1.update(&hashCtx,&sign))!=0) goto fail; if((err=SHA1.final(&hashCtx,&hsOut))!=0) goto fail; err = sslRawVerify(…);

sslKeyExchange.c

Page 15: Como NÃO testar o seu projeto de Software. DevDay 2014

if((err=SSLFreeBuffer(&hashCtx))!=0) goto fail; if((err=ReadyHash(&SHA1,&hashCtx))!=0) goto fail; if((err=SHA1.update(&hashCtx,&rand))!=0) goto fail; goto fail; if((err=SHA1.update(&hashCtx,&sign))!=0) goto fail; if((err=SHA1.final(&hashCtx,&hsOut))!=0) goto fail; err = sslRawVerify(…);

sslKeyExchange.c

Page 16: Como NÃO testar o seu projeto de Software. DevDay 2014
Page 17: Como NÃO testar o seu projeto de Software. DevDay 2014
Page 18: Como NÃO testar o seu projeto de Software. DevDay 2014

/* Read type & payload length first */

hbtype = *p++; n2s(p,payload); p1 = p; !/* Enter response type, length & copy payload */

*bp++ = TLS1_HB_RESPONSE; s2n(payload, bp); memcpy(bp, p1, payload);

Page 19: Como NÃO testar o seu projeto de Software. DevDay 2014

/* Read type & payload length first */

hbtype = *p++; n2s(p,payload); if (1+2+payload+16 > s->s3->rrec.length) return 0; /* silently discard per RFC 6520 sec. 4 */ p1 = p; !/* Enter response type, length & copy payload */

*bp++ = TLS1_HB_RESPONSE; s2n(payload, bp); memcpy(bp, p1, payload);

Page 20: Como NÃO testar o seu projeto de Software. DevDay 2014
Page 21: Como NÃO testar o seu projeto de Software. DevDay 2014

Você AUTOMATIZA SEUS TESTES?

Page 22: Como NÃO testar o seu projeto de Software. DevDay 2014

?

Page 23: Como NÃO testar o seu projeto de Software. DevDay 2014
Page 24: Como NÃO testar o seu projeto de Software. DevDay 2014

#1e5d91

Page 25: Como NÃO testar o seu projeto de Software. DevDay 2014

#1e5d91

Page 26: Como NÃO testar o seu projeto de Software. DevDay 2014

1describe “test” do 2 it “should do nothing” do 3 fail 4 end 5 end

Page 27: Como NÃO testar o seu projeto de Software. DevDay 2014
Page 28: Como NÃO testar o seu projeto de Software. DevDay 2014

1describe “test” do 2 it “should do nothing” do 3 fail 4 end 5 end

Page 29: Como NÃO testar o seu projeto de Software. DevDay 2014

1describe “test” do 2 it “should do nothing” do 3 true 4 end 5 end

Page 30: Como NÃO testar o seu projeto de Software. DevDay 2014
Page 31: Como NÃO testar o seu projeto de Software. DevDay 2014

1describe “test” do 2 it “should do nothing” do 3 true 4 end 5 end ?

Page 32: Como NÃO testar o seu projeto de Software. DevDay 2014
Page 33: Como NÃO testar o seu projeto de Software. DevDay 2014

NON-FUNCTIONAL REQUIREMENTS

SCALABILITY

RELIABILITY

SECURITYUSABILITY

ACCESSIBILITY

MAINTAINABILITY

Page 34: Como NÃO testar o seu projeto de Software. DevDay 2014

#1e5d91

Page 35: Como NÃO testar o seu projeto de Software. DevDay 2014

por James Reason

RISCOS

FALHAS

Page 36: Como NÃO testar o seu projeto de Software. DevDay 2014
Page 37: Como NÃO testar o seu projeto de Software. DevDay 2014
Page 38: Como NÃO testar o seu projeto de Software. DevDay 2014

Você APAGA seus testes?

Page 39: Como NÃO testar o seu projeto de Software. DevDay 2014

?

Page 40: Como NÃO testar o seu projeto de Software. DevDay 2014
Page 41: Como NÃO testar o seu projeto de Software. DevDay 2014

100% COVERED CODE.

OF CODE YOU COVERLINE

Page 42: Como NÃO testar o seu projeto de Software. DevDay 2014

60@Test 61public void setPrice() { 62 Item item = new 63 BasicItem(0.0, true); 64 65 assertEquals(0.0, 66 item.getPrice()); 67 68 //set new price 69 item.setPrice(1.0); 70 assertEquals(1.0, 71 item.getPrice()); 72}

Page 43: Como NÃO testar o seu projeto de Software. DevDay 2014

74@Test 75public void isImported_true(){ 76 Item item = new 77 BasicItem(0.0, true); 78 79 assertTrue(item.isImported()); 80}

Page 44: Como NÃO testar o seu projeto de Software. DevDay 2014

74@Test 75public void isImported_false(){ 76 Item item = new 77 BasicItem(0.0, false); 78 79 assertFalse(item.isImported()); 80}

Page 45: Como NÃO testar o seu projeto de Software. DevDay 2014

28public Double getPrice(){ 25 return price; 26} 27 28public boolean isImported(){ 29 return imported; 30}

Page 46: Como NÃO testar o seu projeto de Software. DevDay 2014

WHY DO WE TEST?

Page 47: Como NÃO testar o seu projeto de Software. DevDay 2014

1while true do 2 print “vou parar?” 3end

Page 48: Como NÃO testar o seu projeto de Software. DevDay 2014
Page 49: Como NÃO testar o seu projeto de Software. DevDay 2014

!Murphy’s  law

Page 50: Como NÃO testar o seu projeto de Software. DevDay 2014

PAIN

Page 51: Como NÃO testar o seu projeto de Software. DevDay 2014
Page 52: Como NÃO testar o seu projeto de Software. DevDay 2014

FLOW

Page 53: Como NÃO testar o seu projeto de Software. DevDay 2014

Cost of Quality Assurance (QA)

Analysis Design Coding Unit Tests Acceptance Tests Production

Page 54: Como NÃO testar o seu projeto de Software. DevDay 2014

freqüencia de Uso Das Funcionalidades

RARO 19%

Nunca 45%

Algumas VEZES 16%

Frequente 13%

Sempre 7%

Page 55: Como NÃO testar o seu projeto de Software. DevDay 2014
Page 56: Como NÃO testar o seu projeto de Software. DevDay 2014

Pair Programming

Page 57: Como NÃO testar o seu projeto de Software. DevDay 2014

?

Page 58: Como NÃO testar o seu projeto de Software. DevDay 2014
Page 59: Como NÃO testar o seu projeto de Software. DevDay 2014

feedback vs

noise

Page 60: Como NÃO testar o seu projeto de Software. DevDay 2014

Speed Robustness

Page 61: Como NÃO testar o seu projeto de Software. DevDay 2014
Page 62: Como NÃO testar o seu projeto de Software. DevDay 2014

non-deterministic

flakycode

Page 63: Como NÃO testar o seu projeto de Software. DevDay 2014

Test  failed  21  -mes  locally  &  36  -mes  in  dev  build  in  the  last  6  months.  

Page 64: Como NÃO testar o seu projeto de Software. DevDay 2014
Page 65: Como NÃO testar o seu projeto de Software. DevDay 2014

@google If they fail we simply run flaky tests 3x (and keep statistics). Developer time is much more valuable than server time.

Page 66: Como NÃO testar o seu projeto de Software. DevDay 2014

1@Test 2public void errorExerciseUploadTooBig { 3 goToExerciseIntroPage(); 4 goToNextPage(); 5 6 type(“labArchive”, path() + TOO_BIG); 7 pause(1000L); 8 assertText(“error: Upload too big!”); 9}

Page 67: Como NÃO testar o seu projeto de Software. DevDay 2014

sleep() demais

Page 68: Como NÃO testar o seu projeto de Software. DevDay 2014

How much QUALITY is ENOUGH?

Page 69: Como NÃO testar o seu projeto de Software. DevDay 2014

Bugs/1KLOC

0

1

3

4

5

Indústria Nasa

0,004

Page 70: Como NÃO testar o seu projeto de Software. DevDay 2014

Cost($/LOC)

0

225

450

675

900

Indústria Nasa

5

850

Page 71: Como NÃO testar o seu projeto de Software. DevDay 2014

It will only run once

Page 72: Como NÃO testar o seu projeto de Software. DevDay 2014

VS

<- costumer facing

back office ->

Page 73: Como NÃO testar o seu projeto de Software. DevDay 2014

@martinfowler you’re doing enough testing if the following is true: ■You rarely get bugs that escape

into production ■You are rarely hesitant to change

some code for fear it will cause production bugs

Page 74: Como NÃO testar o seu projeto de Software. DevDay 2014

@joshuakerievsky Test first/after misses the point that TDD is more about emergent design than it is about testing. Do you practice emergent design?

Page 75: Como NÃO testar o seu projeto de Software. DevDay 2014

@kentbeck If I don’t typically make a mistake(...), I don’t test for it. !

Wish there were more examples of “what not to test and how not to test”.

Page 76: Como NÃO testar o seu projeto de Software. DevDay 2014
Page 77: Como NÃO testar o seu projeto de Software. DevDay 2014

2def create_name(fname, lname): 3 if not isInstance(fname, basestring): 4 raise TypeError(“fname must be a String”) 5 if not isInstance(lname, basestring): 6 raise TypeError(“lname must be a String”) 7 name = fname + lname

Page 78: Como NÃO testar o seu projeto de Software. DevDay 2014

1 require ‘spec_helper‘ 2 describe Candidate do 3 context ‘associations‘ do 4 it { should have_many(:proposals) } 5 end 6 7 context ‘validations‘ do 8 it { should validate_presence_of :name } 9 10 it { should ensure_lenght_of(:phone). 11 is_at_least(7). 12 is_at_most(14) 13 } 14 15 it { should_not 16 allow_value(‘blah‘).for(:site) } 17 18 it { should 19 allow_value(‘http://www.blah.com‘) 20 .for(:site) } 21 end 22end

Page 79: Como NÃO testar o seu projeto de Software. DevDay 2014

1 require ‘valid_url‘ 2 class Candidate < ActiveRecord::Base 3 has_many :proposals 4 5 validates :name, presence: true 6 7 validates :phone, :length => 8 {:in => 8..14}, 9 :allow_blank 10 11 validates :site, :url => true, 12 :allow_nil => true 13 14end

Page 80: Como NÃO testar o seu projeto de Software. DevDay 2014

1 require ‘spec_helper‘ 2 describe Candidates do 3 4 let(:candidate) {double ‘candidate‘} 5 6 before :each do 7 Candidate 8 .should_receive(:find) 9 .with(1).and_return(candidate) 10 end 11 12 it ‘should find the candidate‘ do 13 c = Candidate.find(1) 14 c.should eql candidate 15 end 16end

Page 81: Como NÃO testar o seu projeto de Software. DevDay 2014

1Feature: Create proposal 2 As a candidate 3 I want to post my proposals 4 So that voters can evaluate them 5 6 Scenario: 7 Given I am logged in 8 And I am posting a proposal 9 When 10 I fill all fields of the proposal 11 Then 12 I should see a success message

Page 82: Como NÃO testar o seu projeto de Software. DevDay 2014

1Scenario: Client sees tooltip for plan 2 Given 3 I select the ‘light‘ plan 4 When 5 I mouse over ‘tooltip‘ 6 Then 7 I should see ‘tooltip‘ content 8 And 9 I mouse out ‘tooltip‘ 10 Then 11 I should not see ‘tooltip‘ content

Page 83: Como NÃO testar o seu projeto de Software. DevDay 2014

1require ‘spec_helper‘ 2describe ShoppingCart do 3 4 let(:user) {double ‘user‘} 5 let(:product) {double ‘product‘} 6 7 before :each do 8 Authenticator.should_receive(:auth) 9 .and_return(true) 10 end 11 12 it ‘should addProduct & getTotal‘ do 13 Authenticator.auth(user) 14 cart = ShoppingCart.new 15 cart.add_product(product) 16 cart.get_total 17 end 18end

Page 84: Como NÃO testar o seu projeto de Software. DevDay 2014

50@Test 51public void changeMarks() { 52 bot.leftClickAt(view, 53 800, 508); 54 addMarkAt(‘drama’, 1); 55 56 bot.leftClickAt(view, 57 900, 508); 58 addMarkAt(‘act’, 3); 59 60 bot.verifyTooltipAt(30, 190); 61}

Page 85: Como NÃO testar o seu projeto de Software. DevDay 2014

PIXEL NAZI

Page 86: Como NÃO testar o seu projeto de Software. DevDay 2014
Page 87: Como NÃO testar o seu projeto de Software. DevDay 2014
Page 88: Como NÃO testar o seu projeto de Software. DevDay 2014
Page 89: Como NÃO testar o seu projeto de Software. DevDay 2014

1 require ‘spec_helper‘ 2 describe AddressController do 3 4 it ‘should calculate shipping‘ do 5 get :shipping, :zipcode => ‘90210‘ 6 assigns(:shipping).should == ‘8.2‘ 7 end 8 9 end

Page 90: Como NÃO testar o seu projeto de Software. DevDay 2014

external dependencies:

Page 91: Como NÃO testar o seu projeto de Software. DevDay 2014

DRY

Page 92: Como NÃO testar o seu projeto de Software. DevDay 2014

WET

Page 93: Como NÃO testar o seu projeto de Software. DevDay 2014

fixtures considered harmful?

Page 94: Como NÃO testar o seu projeto de Software. DevDay 2014

JAVASCRIPT?

Page 95: Como NÃO testar o seu projeto de Software. DevDay 2014

module('MultiSelectQuizTests',{ setup: function() { var container = document.getElementById("qunit-fixture"); var question = "Which foods are Mexican?"; var answers = [ { 'answerText': 'Tacos', 'value': true }, { 'answerText': 'Sushi', 'value': false } ]; ! this.myQuiz = new MultiSelectQuiz ( container, question, answers ); }, }); !test( "One correct", function() { checkRadio(0, true); checkRadio(1, true); deepEqual(this.myQuiz.grade(), 1, "just 1"); });

Page 96: Como NÃO testar o seu projeto de Software. DevDay 2014

CSS?

Page 97: Como NÃO testar o seu projeto de Software. DevDay 2014

it(‘centers logo at top of page’, function() { expect(isConTenteCenteredInPage(logo)).toBe(true); expect(elementPicelsFromTopOfPage(logo)).toBe(12); expect(fontSizeOf(logo)).toBe(22); expect(textColorOf(logo)).toBe(WHITE); });

Page 98: Como NÃO testar o seu projeto de Software. DevDay 2014
Page 99: Como NÃO testar o seu projeto de Software. DevDay 2014

Students(Can’t(Access(Service(

New(Produc5on(Server(

Ok(To(Toggle((Test(Passes(

Immune(System(Fails(

No(Auto?(Rollback(

No(SMS(

No(Policy(

Non?Standard(Tomcat(Runner(

Nginx(Points(To(Down(Service(

Non?Standard(Java(Version( JRE(Crash(

No(Policy(

And$

And$ And$ And$

análise de uma falha

Page 100: Como NÃO testar o seu projeto de Software. DevDay 2014
Page 101: Como NÃO testar o seu projeto de Software. DevDay 2014
Page 102: Como NÃO testar o seu projeto de Software. DevDay 2014
Page 103: Como NÃO testar o seu projeto de Software. DevDay 2014

Test journeys

Page 104: Como NÃO testar o seu projeto de Software. DevDay 2014

NÃO É BUG É FEATURE

Page 105: Como NÃO testar o seu projeto de Software. DevDay 2014
Page 106: Como NÃO testar o seu projeto de Software. DevDay 2014

JAVASCRIPT

80% só até amanhã!código de desconto: DEVDAY2014

HTTP://industriallogic.com/shop

PYTHON