1 G e t I n s t r u m e n t e d P r o j e c t R e s p o n s e o u t p u t ;
2 o u t p u t = j a b u t i w s . g e t I n s t r u m e n t e d P r o j e c t ( i n p u t ) ; 3 d a t a h a n d l e r = o u t p u t . g e t _ r e t u r n ( ) . g e t F i l e ( ) ; 4 F i l e O u t p u t S t r e a m f o s ;
5 f o s = new F i l e O u t p u t S t r e a m ( new F i l e ( T e s t D i r + "package.jar" ) ) ; 6 d a t a h a n d l e r . w r i t e T o ( f o s ) ; 7 ( . . . ) 8 P r o c e s s p = Runtime . g e t R u n t i m e ( ) . e x e c ( "java -cp ..." ) ; 9 ( . . . ) 10 S e n d T r a c e F i l e i n p u t T r a c e = new S e n d T r a c e F i l e ( ) ; 11 i n p u t T r a c e . s e t P r o j e c t I d ( p r o j e c t i d ) ; 12 i n p u t T r a c e . s e t I d U s e r N a m e ( u s e r ) ;
13 f d s = new F i l e D a t a S o u r c e ( new F i l e ( T e s t D i r + "test.trc" ) ) ; 14 d a t a h a n d l e r = new D a t a H a n d l e r ( f d s ) ;
15 i n p u t T r a c e . s e t T r a c e f i l e ( d a t a h a n d l e r ) ; 16 S e n d T r a c e F i l e R e s p o n s e t r a c e R e s p ;
17 t r a c e R e s p = j a b u t i w s . s e n d T r a c e F i l e ( i n p u t T r a c e ) ;
A cobertura estrutural obtida pela execução dos casos de teste da biblioteca Apache-Commons- BeanUtils pode ser vista na Tabela 5.2. O relatório de cobertura apresentado considera todos os métodos das 62 classes do projeto. A primeira coluna mostra o critério considerado. A segunda coluna mostra a soma de todos os requisitos de teste de todos os métodos do projeto cobertos pelos casos de teste. A terceira coluna mostra a soma de todos os requisitos de teste de todos os métodos do projeto. A quarta coluna mostra a porcentagem de cobertura obtida com a execução dos casos de teste. Esse relatório também poderia ter sido mostrado para cada classe ou para cada método do projeto para que o testador tivesse uma idéia melhor sobre quais classes e/ou métodos teriam necessidade de ser testados mais extensivamente.
Tabela 5.2: Cobertura estrutural obtida com a execução dos casos de teste da biblioteca Apache-Commons-BeanUtils usando o JaBUTiWS
Critério Req. de teste cobertos Req. de teste Cobertura
Todos-nós 966 1571 61%
Todas-arestas 860 1583 54%
CAPÍTULO 5. UMA INSTÂNCIAÇÃO DA ABORDAGEM BISTWS 60
5.2.3
Aplicações
O JaBUTiWS está sendo usado atualmente em dois projetos não relacionados a esta tese de doutorado: ProgTest (Barbosa et al., 2008; de Souza et al., 2011) e Qualipso (QUALIPSO, 2012). ProgTest é uma ferramenta de apoio ao ensino de programação e de teste de software. O objetivo da ferramenta é fornecer apoio automatizado aos professores para a correção de exercícios de im- plementação de programas e criação de casos de teste submetidos por alunos. Para a correção, a ferramenta utiliza o JaBUTiWS para instrumentar, executar os casos de teste e avaliar a cobertura estrutural obtida pelos alunos. A cobertura estrutural obtida é comparada com um gabarito forne- cido pelo professor e estas informações são utilizadas para atribuir notas aos exercícios submetidos pelos alunos.
O projeto QualiPSo (Quality Platform for Open Source Software) "propõe-se a definir e im- plementar tecnologias, procedimentos, leis e políticas com o objetivo de potencializar as práticas de desenvolvimento de software livre, tornando-as confiáveis, reconhecidas e estabelecidas na in- dústria". Para isso, o projeto desenvolveu um repositório (factory) orientado a serviços que facilita a integração entre serviços, componentes e sistemas de informação de outras empresas. O repositório oferece serviços para combinar tanto ambientes de desenvolvimento quanto ambientes de compartilhamento de informações, tais como: VOIP, controle de versão, bug tracker, lista de emails, gerenciamento de documentos, etc. Neste contexto, o JaBUTiWS tem sido utilizado em um ambiente integrado com ferramentas de métrica de software e de monitoração de qualidades de serviço, como o Spago4Q (Engineering Group, 2012), por exemplo.
5.3
JaBUTiWS: uma instânciação do Serviço de Teste da
abordagem BISTWS
O serviço de teste estrutural JaBUTiWS foi estendido para atender aos requisitos da abordagem e desempenhar o papel do Serviço de Teste. Foi acrescentada a seguinte operação na interface do JaBUTiWS para receber um serviço comum implementado em Java e retornar um serviço testável com todas as características definidas pela abordagem:
• createBISTWS(name,package,implementation,level).
O parâmetro name refere-se ao nome do serviço a ser instrumentado. O parâmetro package é um arquivo .jar, .war ou .aar contendo as classes (bytecode) do serviço a ser instrumentado. O parâmetro implementation refere-se à classe que implementa as operações da interface do serviço. O parâmetro level é usado para definir em que níveis de detalhes os relatórios de cobertura serão gerados para o serviço testável (para o serviço todo, para cada operação da interface, para cada classe interna ou para cada método). O retorno desta operação é o mesmo pacote recebido, mas com a versão do serviço testável no lugar do serviço comum. Se o pacote enviado é do tipo .war ou .aar, o serviço já está pronto para ser publicado.
CAPÍTULO 5. UMA INSTÂNCIAÇÃO DA ABORDAGEM BISTWS 61 Nesta implementação optou-se por utilizar as tecnologias do Axis2 que geram as especificações WSDL automaticamente na publicação do serviço. Assim, quando um serviço testável é publicado, as operações adicionadas pela instrumentação do JaBUTiWS são automaticamente publicadas no WSDL para serem usadas externamente.
A seguir são apresentados alguns detalhes sobre como o JaBUTiWS transforma um serviço comum em um serviço testável e como são feitos os cálculos de cobertura estrutural e a geração dos metadados.
5.3.1
Instrumentação
Os desenvolvedores que desejam transformar um serviço comum escrito em Java em um ser- viço testáveldevem utilizar a operação createBISTWS do JaBUTiWS. Cada serviço enviado ao JaBUTiWS para ser instrumentado e transformado em testável dá origem a um projeto de teste. O projeto de teste é criado para armazenar as classes do serviço recebidas, as versões instrumentadas das classes, os requisitos de teste do serviço e as informações de execução de cada sessão de teste realizada desde que o cálculo de cobertura tenha sido requisitado para ela.
A instrumentação é feita com a biblioteca BCEL (Byte Code Engineering Library) e instruções são inseridas no código para registrar as informações necessárias para verificar a cobertura dos requisitos gerados pelos critérios todos-nós, todas-arestas, todos-usos e todos-p-usos. Nos exem- plos apresentados nesta tese somente são utilizados os três primeiros critérios. A instrumentação também insere as operações da interface de teste e suas implementações. A implementação das operações da interface de teste correspondem a uma chamada às operações de uma biblioteca de classes que é inserida no pacote de classes do serviço.
Após a instrumentação, um serviço testável gerado pelo JaBUTiWS recebe as seguintes opera- ções de teste:
• void startTrace(String userID, String sessionID): corresponde à ope- ração iniciarTeste definida pela abordagem BISTWS. Esta operação recebe como pa- râmetro o identificador de um usuário e o identificador de uma sessão de teste, que são usados pelo serviço testável para identificar os arquivos de rastreamento de sua execução. Note que, além de usar o identificador da sessão de teste, esta implementação definiu que a operação para iniciar a sessão de teste também deve receber o identificador do usuário que está iniciando a sessão de teste para evitar conflitos e duplicidade de identificadores de sessões de teste.
• void stopTrace(String userID, String sessionID): corresponde à ope- ração finalizarTeste definida pela abordagem BISTWS e é usada para encerrar uma sessão de teste. Os identificadores recebidos como parâmetros de entrada são usados para que o serviço saiba qual sessão de teste será encerrada para que os detalhes das execuções daquele usuário e naquela sessão não sejam mais registradas.
CAPÍTULO 5. UMA INSTÂNCIAÇÃO DA ABORDAGEM BISTWS 62 • XML getCoverage(String userID, String sessionID, String level):
corresponde à operação obterCoberturaEstrutural definida pela abordagem BISTWS e é usada para retornar o relatório de cobertura estrutural para uma determinada sessão de teste (sessionID) executada por um determinado usuário (userID). Repare que, além de incluir o parâmetro para identificar um usuário, esta implementação incluiu o parâmetro level na especificação desta operação. O parâmetro level é usado pelo serviço para saber em que nível de detalhes o integrador deseja obter o cálculo de cobertura. O retorno da operação é um arquivo .XML contendo o relatório de cobertura estrutural.
• XML getMetadata(String type): corresponde à operação obterMetadados() definida pela abordagem BISTWS e é utilizada para retornar os metados de teste publicados pelo desenvolvedor. O parâmetro type é utilizado para especificar qual tipo de metadado o integrador deseja obter (a priori ou sob demanda). O retorno da operação é um arquivo .XML contendo os metadados de teste.