• Nenhum resultado encontrado

(QJHQKDULDGH6RIWZDUH. Testes. 2001, 2004 (QJHQKDULD GH6RIWZDUH Departamento de Engenharia Informática Instituto Superior Técnico.

N/A
N/A
Protected

Academic year: 2021

Share "(QJHQKDULDGH6RIWZDUH. Testes. 2001, 2004 (QJHQKDULD GH6RIWZDUH Departamento de Engenharia Informática Instituto Superior Técnico."

Copied!
9
0
0

Texto

(1)(QJHQKDULDGH6RIWZDUH. Testes © 2001, 2004 (QJHQKDULD GH6RIWZDUH Departamento de Engenharia Informática Instituto Superior Técnico. 1. Motivação „. Garantir comportamento pretendido Testes devem ser definidos à priori Desenvolvimento e testes em paralelo . „ „. Permite medir o progresso do desenvolvimento. Testes não garantem ausência de erros Construir uma bateria de testes permite garantir que erros anteriormente corrigidos não reaparecem. 2. 1.

(2) JUnit . JUnit . Define a estrutura dos testes Testes são implementados como subclasses de TestCase A prática comum é replicar a hierarquia de pacotes.   . Resultados de um teste . Teste executa-se como esperado Failure - falha detectada pelo teste Error - erro (excepção) de runtime.   . Caso de teste. . Definido numa subclasse de TestCase É um método sem parâmetros Condições são verificadas com assertXXXX().  . public void testStringConcat() { String expected = “Hello World!”;. // lógica do teste String result = _helloString.concat(_worldString); // verificação de resultados assertEquals(expected, result); }. . 3. Test Fixture. JUnit. . Contexto de execução de testes. . Definir uma Fixture comum a vários casos de teste:. . instâncias de objectos a utilizar num teste. . Criar uma subclasse de TestCase Criar uma variável de instância para cada objecto  Redefinição de setUp() para inicializar as variáveis e obter recursos  Redefinição de tearDown() para libertar recursos . public class StringTest extends TestCase { private String _helloString; private String _worldString; protected void setUp() { _helloString = “Hello ”; _worldString = “World!”; } }. 4. 2.

(3) JUnit Ant Task. < MXQLW haltonfailure= "true" printsummary= "yes" dir= "${ tests.data} " fork= "yes"> < IRUPDWWHU type= "plain" usefile= "false"/ > < EDWFKWHVW> < ILOHVHW dir= "${ tests.src.java} "> < LQFOXGH name= "* * / * .java"/ > < H[FOXGH name= "* * / ServiceTestCase.java"/ > < / ILOHVHW> < / EDWFKWHVW> < FODVVSDWK> < SDWKHOHPHQW path= "${ target.classes} "/ > < SDWKHOHPHQW path= "${ tests.target.classes} "/ > (…) < / FODVVSDWK> < / MXQLW>. 5. JUnit Ant Task Parâmetros principais: . printsummary – impressão de relatório de testes haltonfailure – pára a execução se um teste falhar . . . Sub-elementos: formatter – define o formato de apresentação dos resultados de testes test – define uma classe de testes a executar . . . . name – nome da classe de testes. batchtest – define um conjunto de classes de testes a executar . sub-elemento < fileset/ > para definir ficheiros com testes 6. 3.

(4) DbUnit „. „. „. Extensão ao JUnit para testar projectos que usam bases de dados Exportar/ Importar a informação de/ para bases de dados Permite utilizar asserts para verificar o conteúdo esperado da base de dados. . 7. IDataSet . Representa um conjunto de dados de várias tabelas Utilizado nas operações de configuração das tabelas e verificação do seu conteúdo. . . DbUnit API. FlatXmlDataSet . Descrição das tabelas em XML. < !DOCTYPE dataset SYSTEM "my-dataset.dtd"> < dataset> < PESSOA CODI GO_I NTERNO= "1" UTI LI ZADOR= "utilizador" PASSWORD= "pass"/ > < SECCAO CODI GO_I NTERNO= "1" NOME= "Anúncios" ORDEM= "0" CHAVE_SI TI O= "1"/ > < SI TI O CODI GO_I NTERNO= "1" NOME= "EP" ANO_CURRI CULAR= "4" SEMESTRE= "1" CURSO= "LEI C" DEPARTAMENTO= "DEI “ CHAVE_SECCAO_I NI CI AL= "1"/ > < SI TI O CODI GO_I NTERNO= "2" NOME= "PO" ANO_CURRI CULAR= "2" SEMESTRE= "1" CURSO= "LEI C" DEPARTAMENTO= "DEI "/ > < OJB_HL_SEQ/ > < / dataset>. 8. 4.

(5) DbUnit API „. IDatabaseConnection Interface DbUnit para aceder à base de dados. „. DataBaseOperation UPDATE INSERT DELETE DELETE_ALL CLEAN_INSERT … 9. Testes no GesDis Testes herdam de ServiceTestCase Cada classe só contém um caso de teste localSetUp() e localTearDown() podem ser redefinidos em cada classe de teste testMe() template de execução do teste doTest() implementação do caso de teste . . . . . . É possível redefinir DataSet de setup e de resultados esperados. 10. 5.

(6) gesdis.xml < ?xml version= ’1.0’ encoding= ’I SO-8859-1’?> < !DOCTYPE dataset SYSTEM "gesdis.dtd"> < dataset> < OJB_DLI ST/ > < OJB_DLI ST_ENTRI ES/ > < OJB_DMAP/ > < OJB_DMAP_ENTRI ES/ > < OJB_DSET/ > < OJB_DSET_ENTRI ES/ > < OJB_HL_SEQ/ > < OJB_LOCKENTRY/ > < OJB_NRM/ > < OJB_SEQ/ > < I TEM CODI GO_I NTERNO= "1" NOME= "1º Anúncio" ORDEM= "1" I NFORMACAO= "Bem vindos a EP!" URGENTE= "1" CHAVE_SECCAO= "1"/ > < I TEM CODI GO_I NTERNO= "2" NOME= "2º Anúncio" ORDEM= "2" I NFORMACAO= "+ 1 anúncio" URGENTE= "0" CHAVE_SECCAO= "1"/ > < PESSOA CODI GO_I NTERNO= "1" UTI LI ZADOR= "utilizador" PASSWORD= "pass"/ > < SECCAO CODI GO_I NTERNO= "1" NOME= "Anúncios" ORDEM= "0" CHAVE_SI TI O= "1"/ > < SECCAO CODI GO_I NTERNO= "2" NOME= "Material" ORDEM= "1" CHAVE_SI TI O= "1"/ > < SECCAO CODI GO_I NTERNO= "3" NOME= "Teóricas" ORDEM= "0" CHAVE_SECCAO_SUPERI OR= "2"/ > < SECCAO CODI GO_I NTERNO= "4" NOME= "Práticas" ORDEM= "1" CHAVE_SECCAO_SUPERI OR= "2"/ > < SECCAO CODI GO_I NTERNO= "5" NOME= "Anúncios" ORDEM= "0" CHAVE_SI TI O= "2"/ > < SECCAO CODI GO_I NTERNO= "6" NOME= "Planeamento" ORDEM= "1" CHAVE_SI TI O= "2"/ > < SI TI O CODI GO_I NTERNO= "1" NOME= "EP" ANO_CURRI CULAR= "4" SEMESTRE= "1" CURSO= "LEI C" DEPARTAMENTO= "DEI " CHAVE_SECCAO_I NI CI AL= "1"/ > < SI TI O CODI GO_I NTERNO= "2" NOME= "PO" ANO_CURRI CULAR= "2" SEMESTRE= "1" CURSO= "LEI C" DEPARTAMENTO= "DEI "/ > < / dataset>. 11. ServiceTestCase.java 

(7) 

(8)   

(9)     ! 

(10)  !#" $

(11)  ! 

(12)  !% &'

(13) ( )+*-,  $

(14)  ! {. }. Class driverClass = Class.forName("com.mysql.jdbc.Driver"); Connection jdbcConnection = DriverManager.getConnection("jdbc:mysql:/ / localhost:3306/ epXX", "epXX", ""); return new DatabaseConnection(jdbcConnection);.  .  /  -0 ! 1 

(15) 23 % &3

(16) ( )+*-,  $

(17)  ! {. super.setUp(); I DatabaseConnection connection = getConnection(); I DataSet dataSet = getDataSet();. }. try { DatabaseOperation.CLEAN_I NSERT.execute(connection, dataSet); } finally { connection.close(); } localSetUp();.  .  /  -0 ! 

(18) $  )1% &'

(19) ( )45*-,  $

(20)  ! { }. super.tearDown(); localTearDown();. 12. 6.

(21) ServiceTestCase.java. 

(22) 

(23)   6

(24) 

(25) 0 !  7 6

(26) % &'

(27) ( )+*-,  $

(28)  !8  .  /  -0 ! 

(29) 6

(30) 9/ % &3

(31) ( )+*-,  $

(32)  ! { try {  $7 6

(33) % & 8. String resultDataSetName = getResultDataSetName(); IDataSet expectedDataSet = new FlatXmlDataSet(getClass().getResourceAsStream(resultDataSetName)); IDataSet databaseDataSet = getConnection().createDataSet(); String tableNames[ ] = expectedDataSet.getTableNames(); for (int i= 0; i < tableNames.length; i+ + ) { I Table expectedTable = expectedDataSet.getTable(tableNames[ i] ); I Table actualTable = databaseDataSet.getTable(tableNames[ i] ); Assertion.assertEquals(expectedTable, new CompositeTable(expectedTable.getTableMetaData(), actualTable)); } } catch (Exception ex) { fail("ServiceTestCase: " + ex.getMessage()); }. }. 13. CriarSitioInexistente.java :3;3<3= > ?@?A= B'CC1D/E6> BFE GH> I> JFK$LAMANH> CIM3LAIMOMANIM3LAPFC1G3MFE QF> ? MAR3MCIDFB'CM UserView _userView;. :3E JIMA?IMAPSQJH> PT= J'? B3= G'M!IU5:'VW/I$X3E JYZC\[N'? M3:!I> JHL _userView = new UserView("utilizador");. }. {. {. :3E JIMA?IMAPSQJH> P]P3J'R'MCI-V6W+I$X3E JY]C^[N3? M3:!I> JHL. { SitioView sitioViewExpected = new SitioView(new Sitio("ES", 3, 2, "LEI C", "DEI "); SitioView sitioView; try { Object argsCriarSitio[ ] = { "ES", new I nteger(3), new I nteger(2), "LEI C", "DEI "} ; sitioView = (SitioView) _gestorServicos.executar(_userView, "CriarSitio", argsCriarSitio); assertEquals("CriarSitioI nexistente: ", sitioViewExpected, sitioView);. }. } catch (Exception e) { fail ("CriarSitioI nexistente: " + e); }. 14. 7.

(34) CriarSitioInexistente.xml < ?xml version= ’1.0’ encoding= ’I SO-8859-1’?> < !-- This file should not contain a DOCTYPE declaration --> < dataset>. _/` a\b !cd   e  Hf H

(35) $   H g3h$i@j jk. < I TEM CODI GO_I NTERNO= "1" NOME= "1º Anúncio" ORDEM= "1" I NFORMACAO= "Bem vindos a EP!" URGENTE= "1" CHAVE_SECCAO= "1"/ > < I TEM CODI GO_I NTERNO= "2" NOME= "2º Anúncio" ORDEM= "2" I NFORMACAO= "+ 1 anúncio" URGENTE= "0" CHAVE_SECCAO= "1"/ > < PESSOA CODI GO_I NTERNO= "1" UTI LI ZADOR= "utilizador" PASSWORD= "pass"/ > < SECCAO CODI GO_I NTERNO= "1" < SECCAO CODI GO_I NTERNO= "2" < SECCAO CODI GO_I NTERNO= "3" < SECCAO CODI GO_I NTERNO= "4" < SECCAO CODI GO_I NTERNO= "5" < SECCAO CODI GO_I NTERNO= "6". NOME= "Anúncios" ORDEM= "0" CHAVE_SI TI O= "1"/ > NOME= "Material" ORDEM= "1" CHAVE_SI TI O= "1"/ > NOME= "Teóricas" ORDEM= "0" CHAVE_SECCAO_SUPERI OR= "2"/ > NOME= "Práticas" ORDEM= "1" CHAVE_SECCAO_SUPERI OR= "2"/ > NOME= "Anúncios" ORDEM= "0" CHAVE_SI TI O= "2"/ > NOME= "Planeamento" ORDEM= "1" CHAVE_SI TI O= "2"/ >. < SI TI O CODI GO_I NTERNO= "1" NOME= "EP" ANO_CURRI CULAR= "4" SEMESTRE= "1" CURSO= "LEI C" DEPARTAMENTO= "DEI " CHAVE_SECCAO_I NI CI AL= "1"/ > < SI TI O CODI GO_I NTERNO= "2" NOME= "PO" ANO_CURRI CULAR= "2" SEMESTRE= "1" CURSO= "LEI C" DEPARTAMENTO= "DEI "/ >. _Hb  ! 7  g]!g/'l3g3m!n7A* o'n3g+pHqrqsn3gs94* pHq6* b q'tFn3g3mAA2Fo'oAA2Fu6tFoFpHqrq b * 94* b 7o'*pHq6v q A2Fo b g+pHq6u$*$AqsF* w$tFo7 tF94* n7!g+pHq6F*$6qx k. < / dataset>. 15. CriarSitioExistente.java  .  /  /A   b 

(36)  !*-,! 6

(37) 

(38) # $,

(39)   b  0  $7 6

(40) 6 { UserView _userView;. 

(41) 

(42) 40$ ! @  b 

(43) 23 % &'

(44) ( )+*-,  $

(45)  ! { }. _userView = new UserView("utilizador");. 

(46) 

(47)  b

(48)  "" 

(49) o! -.

(50) $

(51)  b $

(52) n'!c# % &3y }. return "/ gesdis-result.xml";. 

(53) 

(54) 40$ !  7 6

(55) % &'

(56) ( )+*-,  $

(57)  ! { SitioView sitioView = null;. try { Object argsCriarSitio[ ] = { "EP", new I nteger(4), new I nteger(1), "LEI C", "DEI "} ; sitioView = (SitioView) _gestorServicos.executar(_userView, "CriarSitio", argsCriarSitio); fail("CriarSitioExistente: Service should NOT have executed OK.");. }. } catch (NotExecutedException e) { / / empty } catch (Exception e) { fail ("CriarSitioExistente: " + e); }. 16. 8.

(58) Exercício . Escrever testes para o serviço AlterarSitio . AlterarSitioInexistente AlterarSitioExistente AlterarSitioIgual AlterarSitioSemUtilizador   . . Template de teste . Redefinir o localSetUp() Definir o doTest() . . Invocar o serviço Verificar estado esperado após execução .  . (Se necessário) redefinir o getResultDataSetName(). Não Esquecer! . Definir os DataSet s em XML com o resultado esperado na Base de Dados. 17. Dicas para o Eclipse „. Dentro de Window -> Preferences -> Ant -> Runtime: z. z. Em Properties definir a global property ant.home (não é ANT_HOME!) Em classpath adicionar junit.jar e tools.jar {. „. (o primeiro vem com o projecto. O segundo está em %JAVA_HOME%\ lib). Não colocar o projecto num directório que contenha espaços no caminho (ex. Desktop) 18. 9.

(59)

Referências

Documentos relacionados

O Ebitda RCA consolidado aumentou €103 m face ao período homólogo (YoY) para os €487 m, suportado pelo desempenho dos negócios de E&amp;P e de R&amp;D, que mais do que

A realização da estágio em saúde coletiva realizado no Centro de Referência Especializado de Assistência Social – CREAS, no desempenho de seu caráter

» Estamos em condições de fornecer consultoria e/ou informações especializada para o estudo e/ou a definição de novos artigos ou soluções coordenadas para problemas operativos,

O Código Civil acrescentou para os cônjuges, além desses deveres, os de fidelidade recíproca e de vida em comum, no domicílio conjugal (art. 1.566), que não

A finalidade do “Documento de Arquitetura de Software - DAS” é definir um modelo arquitetural para ser aplicado ao desenvolvimento dos jogos do Desafio SEBRAE, bem como

• A Revolução Industrial corresponde ao processo de industrialização que teve início na segunda metade do.. século XVIII no

Ao participar do Municipal Velho Oeste MTB 2021, o atleta aceita totalmente o Regulamento da Prova, participando por livre e espontânea vontade, assume as despesas de

importantes para a sua escolha: a primeira delas é que e Sims foi criado para ser facilmente modi cado pelos jogadores, e o jogo conseguiu estimular a criação de uma imensa