Você está na página 1de 28

IC-UNICAMP

Eliane Martins

Componentes de Teste

lt. Atualiz.: set/2010

IC-UNICAMP

Eliane Martins

Tpicos
Noo de drivers, stubs e mock objects Estrutura da implementao de um caso de teste Padres para construo de stubs e mocks

Componentes de Teste

IC-UNICAMP

Eliane Martins

Referncias
R.Binder. Testing OO Systems. Addison Wesley, 1999, c.16-19. Onde encontrar tutoriais sobre JUnit:
http://open.ncsu.edu/se/tutorials/junit/ www.cs.uoregon.edu/education/classes/05S/cis410sm/lectureslides/JUnitTutorial.ppt www.cs.wm.edu/~noonan/cs301/labs/junit/tutorial.html supportweb.cs.bham.ac.uk/documentation/tutorials/docsystem/build/tuto rials/junit/junit.pdf www.cs.wm.edu/~noonan/cs301/labs/junit/tutorial.html ...

Componentes de Teste

IC-UNICAMP

Eliane Martins

Mais referncias
Vincent Massol e Ted Husted. Junit in Action, cap7. Manning Publications, 2003. Martin Fowler. Mocks aren't stubs. Atualizado em jul/2004 no seguinte endereo: /www.martinfowler.com/articles/mocksArentStubs.html Sobre padres para definir mocks: G. Meszaros. : A Pattern Language for Automated Testing of Indirect Inputs and Outputs using XUnit. PLOP 2004. Obtained in jan/2006 at: http://testautomationpatterns.com/TestingIndirectIO.html S. Gorts. Unit testing with hand crafted mocks. Last updated on sept/2004. Obtained at: http://refactoring.be.

Setembro/2001

Qualidade_V&V Componentes de Teste

IC-UNICAMP

Eliane Martins

Componentes de teste (1)


Driver
Programa ou classe que aplica os casos de teste ao componente em teste

Faz o papel de cliente do componente em teste (CeT).

Stub
Implementao temporria, mnima, de um componente usado pelo CeT, com o objetivo de melhorar a controlabilidade e observabilidade do CeT durante os testes. Faz o papel de servidor do CeT.

Test Harness
Sistema que compreende os drivers, stubs, CeT e outras ferramentas de apoio aos testes.
Componentes de Teste 5

IC-UNICAMP

Eliane Martins

Componentes de testes (2)


Driver Cliente Implementao Casos de teste Implementao em Teste Servidor 1 Servidor 2 Servidor 3 Stub 1 Stub 2 Stub 3 Resul tados

Componentes de Teste

IC-UNICAMP

Eliane Martins

Componentes de testes (3)


Devem ser mais simples e mais rpidos de desenvolver do que as unidades substitudas Grau de facilidade ou dificuldade de constru-los depende da qualidade do projeto:
acoplamento dificuldade coeso

Componentes de Teste

IC-UNICAMP

Eliane Martins

Exemplo

CriarTabela( ) LerItem( ) InserirItem( ) RemoverItem( ) MostrarTabela( )

Tabela

Componentes de Teste

IC-UNICAMP

Eliane Martins

Exemplo - Driver
CriarTabela( ) LerItem( ) InserirItem( ) RemoverItem( ) MostrarTabela( )

Driver

Tabela

type TabInt = array [ 1 .. N, 1 .. M ] of integer; ... var Tabela: TabInt, x: integer; ... criaTab ; leItem ( x ); insereItem (x ); mostraTab ; ....

Componentes de Teste

IC-UNICAMP

Eliane Martins

Tabela
Ordena_Vetor( )

Componentes de Teste

10

IC-UNICAMP

Eliane Martins

Exemplo: stub
type VetorInt = array [1 .. N] of integer; ... procedure Ordena_Vetor (a : VetorInt); ... begin write (Valores fornecidos); for i := 1 to N do write (a [ i ] ); write (Fornea os valores ordenados); for i := 1 to N do read (a [ i ] ); end;
Componentes de Teste 11

Tabela

Stub

IC-UNICAMP

Eliane Martins

Estrutura de testes (xUnit)


Servidores
cria
configura instala

caso de teste

Prepara (set up) Executa Verifica Termina (clean up)

CeT

Stub

Componentes de Teste

13

IC-UNICAMP

Eliane Martins

Fases da execuo de um caso de teste


Preparao (set up):
Cria o que for necessrio, configurando os stubs de acordo para que o caso de teste execute conforme o esperado.

Execuo:
Interage com o CeT, aplicando os testes gerados e observando os resultados obtidos.

Verificao:
Compara os resultados obtidos com os esperados.

Trmino (clean up ou tear down):


Termina a execuo do CeT e deixa o ambiente de execuo de testes no mesmo estado em que estava antes da realizao do caso de teste.
Componentes de Teste 14

IC-UNICAMP

Eliane Martins

Mock Objects
Criados pela comunidade XP (em 2000)
Tim Mackinnon, Steve Freeman, Philip Craig. Endo-Testing: Unit Testing with Mock Objects (www.cs.ualberta.ca/~hoover/cmput401/XP-

Notes/xp-conf/Papers/4_4_MacKinnon.pdf), apresentada no evento


XP2000.(disponvel emt www.mockobjects.com).

Objetivo: Sistematizar a gerao de stubs Desenvolver uma infra-estrutura para criao de mocks e incorporao dos mesmos aos Testes de Unidade.

Componentes de Teste

15

IC-UNICAMP

Eliane Martins

Bibliotecas
Mock Objects (ou mocks) servem para emular ou instrumentar o contexto (servios requeridos) de objetos da CeT. Devem ser simples de implementar e no duplicar a implementao do cdigo real. Bibliotecas de mocks podem ser usadas para criar stubs: existem vrias APIs para esse fim:
MockObjects (www.mockobjects.com) EasyMock (www.easymock.com) MockMaker (www.mockmaker.org ) djUnit (http://works.dgic.co.jp/djunit/) ...

Componentes de Teste

16

IC-UNICAMP

Eliane Martins

Porqu criar mocks


Adiar deciso sobre a plataforma a ser usada
Esta uma outra diferena entre mocks e stubs poder criar uma classe que tenha o comportamento esperado, sem se comprometer com nenhuma plataforma especfica. Ex.: para testar acesso a BD, cria-se um mock com a funcionalidade mnima que se espera do BD, sem precisar usar um BD especfico.

Lidar com objetos difceis de inicializar na fase de preparao (set up)


Testes de unidade que dependam de um estado do sistema que difcil de preparar, especialmente quando ainda no se tem o resto do sistema, podem usar mocks. O mock emula o estado de sistema, sem a complexidade do estado real. Dessa forma, o mock poderia ser utilizado por vrios casos de teste que necessitem que o sistema esteja neste estado.

Testar o objeto em condies difceis de serem reproduzidas


Por exemplo, para os testes em presena de falhas do servidor: o mock pode implementar um proxy do servidor, que apresente um defeito pr-estabelecido quando for usado em determinados casos de teste.

Componentes de Teste

17

IC-UNICAMP

Eliane Martins

Mocks x stubs
Mocks so voltados para testes classes. Stubs, em princpio, podem ser usados em qqr linguagem (OO ou no). Segundo Martin Fowler, mocks e stubs no so sinnimos:
Mocks podem servir para colocar o objeto da CeT no estado desejado para os testes. Um stub uma implementao alternativa da interface do objeto substitudo. Um stub mais passivo, geralmente retornando dados prestabelecidos pelos casos de teste para a CeT. Mocks podem verificar se o servidor foi chamado adequadamente contm verificao embutida (assertivas)

Componentes de Teste

18

IC-UNICAMP

Eliane Martins

Exemplo: classe em teste e uma servidora


classe ClasseEmTeste Servidora serv; metodo( ) serv.executa( ) end end classe Servidora executa( ) # cdigo complexo end

http://www.floehopper.org/articles/2006/09/11/the-difference-between-mocks-and-stubs Componentes de Teste 19

IC-UNICAMP

Eliane Martins

Exemplo de stub: pseudo-cdigo


classe ClasseDeTeste implementa Test::Unit::TestCase classe ServidoraStub executa( ) retorna X end end // exemplo_uso_Stub ServidoraStub servidora classeTeste = ClasseEmTeste.new(servidora) assert_equal X, classeTeste.metodo end end
http://www.floehopper.org/articles/2006/09/11/the-difference-between-mocks-and-stubs Componentes de Teste 20

IC-UNICAMP

Eliane Martins

Exemplo de mock: pseudo-cdigo


classe ClasseDeTeste implementa Test::Unit::TestCase classe ServidoraMock atributo: call_count ... call_count = 0 // mtodos execute( ) call_count +=1 end get_call_count ( ) ... end // exemplo_uso_Mock servidora = ServidoraMock.new classeTeste = ClasseEmTeste.new(servidora) assert_equal 1, servidora.get_call_count end http://www.floehopper.org/articles/2006/09/11/the-difference-between-mocks-and-stubs end Componentes de Teste 21

IC-UNICAMP

Eliane Martins

Outro exemplo : o mock


// Usado no teste do mtodo: canUserLogin( User, String ) , para substituir // o mtodo validatePassword, chamado pelo mtodo em teste. public class MockUser implements User { Interface da classe ... // Prepara o que retornar quando validatePassword for chamado substituda public void setValidatePasswordResult( boolean result ) { expectedCalls++; Determina n esperado de chamadas ao this.returnResult = result; }

mtodo substitudo
// Implementao do mock de validatePassword public boolean validatePassword( String password ) { actualCalls++; Conta chamadas ao mtodo substitudo return returnResult; } public boolean verify() { return expectedCalls == actualCalls; } ... }
Componentes de Teste

Verifica se chamadas de acordo com o esperado

22

IC-UNICAMP

Eliane Martins

Outro exemplo: o caso de teste


// Caso de teste usando o MockUser criado anteriormente public void testCanUserLogin() { MockUser user = new MockUser(); user.setValidatePasswordResult( true );
boolean result = um.canUserLogin( user, "foobar" );

preparao

execuo

assertTrue("Expected to validate user " + "password \"foobar\"", result ); assertTrue("MockUser not used as expected", user.verify();
verificao

}
Componentes de Teste 23

IC-UNICAMP

Eliane Martins

Padres
G. Meszaros definiu diversos padres de projeto para mocks. S.Gorst definiu vrios idiomas (padres de cdigo) para serem usados em stubs. Entre eles:
Responder:
Usado para fornecer entradas vlidas para o CeT.

Saboteur:
Usados para fornecer entradas invlidas ou lanar excees para o CeT.
Componentes de Teste 24

IC-UNICAMP

Eliane Martins

Responder
Problema: como fazer para que um objeto da CeT receba valores esperados de um servidor durante os testes. Soluo: uso de uma classe que pode ser configurada para responder com um objeto Responder a cada chamada de mtodo.

Componentes de Teste

25

IC-UNICAMP

Eliane Martins

import java.util.ArrayList; import java.util.List; public class ResponderCommunicator implements Communicator { private List _responses = new ArrayList( ); public void open( ) throws CommunicationException { }

Responder
Implementa mesma interface da classe servidora Contm lista de respostas a serem fornecidas a cada chamada da classe servidora

public void close( ) throws CommunicationException { }


public String communicate(String message) throws CommunicationException { if ( !_responses.isEmpty( ) ) return (String)_responses.remove(0); throw new CommunicationException("use setResponse to define responses"); } public void setResponse(String response) { _responses.add(response); } }

Verifica a cada chamada, se a lista de respostas = lana exceo

Mtodo que configura a lista de respostas


26

Componentes de Teste

IC-UNICAMP

Eliane Martins

Saboteur
Problema: como exercitar o comportamento do CeT em situaes de erro. Soluo: uso de um sabotador, i.e, mock que retorne condies de erro.

Componentes de Teste

27

IC-UNICAMP

Saboteur
Flags que indicam se para retornar erro ou no

A cada chamada, verifica o flag. Se true, lana exceo.

Mtodos usados pelos casos de teste para inicializar os flags.

public class SaboteurCommunicator implements Eliane Martins Communicator { private boolean _openIsSabotaged; private boolean _closeIsSabotaged; private boolean _communicateIsSabotaged; public void open( ) throws CommunicationException { if ( _openIsSabotaged ) throw new CommunicationException("open( ) sabotaged"); } public String communicate(String message) throws CommunicationException { if ( _communicateIsSabotaged ) throw new CommunicationException("communicate( ) sabotaged"); return null; } public void close( ) throws CommunicationException { if ( _closeIsSabotaged ) throw new CommunicationException("close( ) sabotaged"); } public void sabotageOpen( ) { _openIsSabotaged = true; } public void sabotageClose( ) { _closeIsSabotaged = true; } public void sabotageCommunicate( ) { Componentes de Teste 28 _communicateIsSabotaged = true; } }

IC-UNICAMP

Eliane Martins

Principais pontos aprendidos

Setembro/2001

Qualidade_V&V Componentes de Teste

29

Você também pode gostar