XI. HASTANEDE ORTA KADEMEDE ÇALIŞAN
XII.II. Karşılaştırma ve Sonuç
de produto, nossa abordagem provê suporte para gerenciar e derivar automaticamente os artefatos de teste considerando o contexto de uma estratégia de teste, tais como, teste do núcleo da LPS ou teste dos produtos da LPS. Esta seção descreve os passos da abordagem para garantir tal gerência e derivação automática de testes.
3.1.3.1 Anotar Artefatos de Teste
Na abordagem proposta, um dos primeiros passos para garantir a gerência dos testes, é anotar os artefatos de teste (passo 3 da Figura 5) com anotações que explicitam que tipos e estágios de teste são endereçados por esses artefatos. Isso permite que, posteriormente, tais anotações sejam lidas e processadas por uma ferramenta de derivação e que seja assim decidido que artefatos de teste devem ser carregados para realizar o teste de unidade, integração ou sistema do núcleo ou de um dos produtos da LPS.
Duas anotações já presentes na ferramenta GenArch são usadas pela nossa abordagem de teste, são elas: (i) @Feature – que atualmente é usada na ferramenta para explicitar que artefatos de implementação da arquitetura de uma LPS estão relacionados a determinadas características, esta anotação será usada na abordagem para indicar que artefatos de teste estão relacionados a que features; e (ii) @Variability – esta anotação indica que artefatos de implementação representam pontos de variação na implementação de uma arquitetura de LPS. Nesta dissertação, é objeto de trabalhos futuros o uso dessa anotação de forma a indicar classes ou interfaces que necessitam ter classes Mock Objects criadas.
Além de tais anotações, foi criada também uma nova anotação @Test para indicar a estratégia de teste, isto é, definir se os testes são para o núcleo ou para os produtos (configurações) da LPS, o estágio (unidade, integração, sistema), e o tipo (funcional) de teste a ser realizado. A Tabela 2 apresenta a anotação @Test e seus atributos.
Tabela 2 - Anotação @Test e seus atributos. @Test
Atributos
Strategy core, product
Stage unit, integration, system
Type functional
A anotação @Test é processada pela ferramenta GenArch para permitir a caracterização dos artefatos de teste e, posteriormente, a carga de determinados artefatos de teste de acordo com a estratégia em um dado instante. A funcionalidade básica do GenArch foi estendida para permitir o suporte à carga de artefatos de teste relacionados a determinadas estratégias. O Capítulo 4 detalha as adaptações realizadas na ferramenta GenArch para contemplar tais funcionalidades.
3.1.3.2 Configurar Templates de Teste
Outro aspecto fundamental na nossa abordagem diz respeito à correta configuração dos templates de teste funcional elaborados para uma dada LPS. Na abordagem, são adotados templates que lidam ou não com as variabilidades da linha de produto. Os templates que não precisam considerar as variações existentes em determinado produto, são aqueles usados nos testes de sistema para as páginas de aplicações que possuem apenas código comum e fixo (Seção 3.1.2.3). Nesse cenário, a configuração necessária é a definição do método da extensão do GenArch, responsável por inserir o nome do projeto do produto no script de teste criado a partir do template. Com relação aos templates que lidam com variações da LPS, podem ter a sua parte variável customizada seguindo duas técnicas: (i) código customizável que utiliza informações (parâmetros) provenientes do modelo de característica da LPS; e (ii) uso de fragmentos que representam trechos de código ou texto que estão associados a um determinado feature, o qual uma vez escolhido
durante a derivação ocasiona a inclusão do fragmento de texto dentro do template durante a sua customização. Os templates da nossa abordagem que podem usar essas duas técnicas de configuração são aqueles construídos para testar páginas dos produtos que apresentam uma parte fixa e outra variável (Seção 3.1.2.3) ou os que são direcionados para os testes de integração dos membros derivados de uma LPS (Seção 3.1.2.4).
Este passo da abordagem envolve a configuração e preparação dos
templates para serem customizados automaticamente durante a derivação de
determinado produto na engenharia de aplicação. Vale ressaltar que a adequada configuração dos templates não necessariamente implica em geração completa de código de teste, pois isso depende da complexidade de artefatos de teste a serem produzidos, assim como do detalhamento da análise do domínio sendo considerado.
3.1.3.3 Gerenciamento e Derivação Automática de Testes
A extensão do GenArch permite a organização dos artefatos de implementação e teste de uma linha de produto, de forma que é possível gerenciá- los a partir do uso de anotações. A presença de tais anotações permite que a ferramenta GenArch possa automaticamente gerar seus modelos de derivação (passo 4 da Figura 5), para que, posteriormente, possa derivar versões específicas dos artefatos relacionados aos produtos da LPS de maneira a promover a execução de diferentes estratégias de teste. Usando a extensão do GenArch é possível, portanto, derivar automaticamente as classes e interfaces que implementam determinado membro da LPS, assim como seus respectivos testes (passo 5 da Figura 5).
A derivação automática dos artefatos de teste foi implementada de forma idêntica a derivação para os artefatos de implementação, ou seja, artefatos de teste que foram anotados são automaticamente carregados em um projeto Java dependendo da estratégia de teste escolhida pelo engenheiro em questão. Além de permitir a carga das classes de teste de unidade ou integração, a ferramenta pode também customizar templates relacionados aos testes de sistema escritos em ferramentas, tais como, o Selenium IDE para aplicações web.
3.2 Sumário
Este capítulo apresentou a abordagem de teste para LPSs proposta neste trabalho. Tal abordagem possui cinco estratégias concretas de teste que são: (i) testes de unidade do núcleo, (ii) teste de integração do núcleo, (iii) teste de sistema do núcleo, (iv) teste de unidade e integração de produtos e (v) teste de sistema de produtos.
O capítulo também descreveu o uso do framework JUnit para auxiliar a implementação dos testes de unidade e integração do núcleo da LPS na engenharia de domínio, como também o uso de Mock Objects para simular determinadas classes em tais testes. Os testes de sistema do núcleo, elaborados também durante engenharia de domínio, são formados por templates que servem para a criação de
scripts de teste para a ferramenta Selenium IDE. Com relação aos testes dos
produtos derivados, os testes de unidade e integração do núcleo são reaproveitados ou adaptados. No caso específico dos de integração, são gerados casos de teste a partir de templates criados na fase de domínio, os quais tratam a entrada ou não de trechos de código variável quando dada variabilidade está presente ou não num membro da LPS. Por fim, os testes de sistema dos produtos são constituídos pelos
scripts definidos com base nos templates desenvolvidos na engenharia de domínio.
Por fim, O capítulo destacou o uso de anotações @Feature para relacionar artefatos de teste com características da LPS, assim como propôs como trabalho futuro empregar @Variability para especificar as classes e interfaces que precisam ter Mock Objects criados. Além disso, foi apresentada a nova anotação @Test da extensão do GenArch para indicar a estratégia, o estágio e o tipo que o teste se enquadra. Com o processamento de @Test e @Feature nas classes de teste, representações de tais artefatos são encontradas nos modelos de arquitetura e configuração da extensão do GenArch. Com os modelos prontos, o processo de derivação dos produtos e seus respectivos testes pode ser realizado.
4 Ferramenta para Derivação de Casos de Teste de LPS
Este capítulo apresenta a extensão proposta para o GenArch, destacando as mudanças realizadas na ferramenta para permitir a derivação de testes para linhas de produto de software. Nas seções seguintes é encontrado uma visão geral das adaptações do GenArch (Seção 4.1), a arquitetura da ferramenta e extensões realizadas na sua implementação (Seção 4.2), o projeto detalhado das adaptações (Seção 4.3), e as modificações elaboradas para o algoritmo de derivação do GenArch (Seção 4.4).