![](https://i.imgur.com/r2Upi0M.png) ## Verificação e Validação de Software ### Professor: José Campos ### Alunos: João Lopes nº55812 Filipe Martins nº55814 # Assignment #5 Seguindo o camino dos *assignments* passados, este *assignment* passa por realizar testes ao projeto JPass. JPass é uma aplicação *desktop* que visa apresentar uma forma simples e portátil com a qual um utilizador consegue fazer a gestão das suas palavras-passes. Juntamente com as palavras-passes guardadas é possível associar as mesmas a um nome e um URL entre muitas outras opções. Este *assignment* passa pela realização de testes através da técnica *Line Coverage* e *Branch level*, que são técnicas de *White-Box testing*. *White-testing*, tal como a técnica *Black-testing*, passa por fazer testes ao código, sendo que a única diferença é que existe conhecimento sobre a código a ser testado, o *tester* tem acesso aos vários métodos e pode assim fazer testes mais específicos e personalizados. ## Line Coverage *Line coverage* trata-se de um critério que representa o número de linhas de código que é coberto pelos testes realizados. Este critério é o mais básico, pois uma elevada percentagem de cobertura não significa que o projeto esteja bem testado. De modo a calcular a *Line coverage* de um conjunto de testes é utilizada a seguinte fórmula: ![](https://i.imgur.com/VrKYbkI.png =300x) ## Branch Coverage O *Branch coverage* é também um critério de cobertura, mas, ao invés do *line coverage*, este representa o número de decisões possíveis. De forma a representar as decisões possíveis num método é frequentemente utilizado um *Control-Flow Graph*, onde facilmente é possível identificar quais as decisões e quais os testes a realizar. ![](https://i.imgur.com/uuoww6H.png =350x) ## JaCoCo JaCoCo é uma ferramenta *open source* que permite medir a cobertura de código num projeto e relatá-lo através de relatórios visuais. A ferramenta permite aos programadores não só verificarem os resultados num relatório exportado, como permite verificar no código quais as linhas que são cobertas pelo código e quais não, permitindo uma visão mais concreta do que necessita de ser testado. ## Line and branch coverage relativos ao Assignment 2 e 3 Este *assignment* inicialmente passava por verificar tanto a *line coverage* como a *branch coverage* dos *assignments* 2 e 3. O *assignment* 2 correspondia a realização de testes utilizando o método *Category-Partition*, e o *assignment* 3 correspondia a utilização do método *Boundary Value Analysis*. Em ambos os *assignments* o método utilizado representa um *Black-Box testing*, testes estes onde não tínhamos conhecimento do que foi testado. Após a execução dos testes realizados utilizando a ferramenta JaCoCo, a *line coverage* obtida foi de 59% e o *branch coverage* foi de 65%. Este valor acaba por representar o facto de os testes realizados serem do tipo *Black-box testing*, pois não existe conhecimento dos métodos a testar, e não sabemos quais as decisões existentes. De referir que estas percentagens de cobertura não incluem o pacote *jpass.ui* e a class *jpass.util.SprintUtilities* visto que ambas lidam com o GUI. Incluindo este pacote e classe, a cobertura obtida foi de 16% de *line coverage* e 15% de *branch coverage*. ## Aumento da Cobertura obtida De forma a aumentar a cobertura no projeto foram feitas duas coisas: 1. Elaborar mais testes sobre os métodos testados nos *assigments* 2 e 3, de modo a cobrir as linhas e decisões em falta. Para tal, foi analisado o relatório gerado pelo JaCoCo, e verificado quais as linhas e decisões que não estavam a ser testadas, tendo sido realizados testes de modo a cobri-las. Assim conseguimos obter uma maior cobertura sobre os pacotes e classes já testadas e conseguindo aumentar bastante a percentagem de cobertura. 2. Elaborar testes sobre os pacotes e classes que não foram testadas. Inicialmente só foram realizados testes sobre os pacotes *jpass.crypt* e *jpass.util*, cobrindo uma pequena parte do projeto. De modo a aumentar a cobertura foram também realizados testes para os pacotes *jpass.xml* e *jpass.data*. * Pacotes onde foram criados testes: * *jpass.xml* - Este pacote está encarregue de fazer as conversões de ficheiros para *streams* em XML. * Para este pacote foi criada uma classe de testes para testar o modelo `Entry`. Todos os testes deram positivo, o que permitiu, por um lado validar este pedaço de código e aumentar a *coverage* ao projeto. Assim foram adicionados mais sete testes ao conjunto existente. * *jpass.data* - Uma vez que a aplicação lida com ficheiros, é necessário ter uma maneira de gerir e trabalhar com os mesmos, este pacote tem as classes que são responsáveis por definir o *data model* da aplicação, da escrita e leitura de ficheiro. * Para este pacote foram realizados testes às classes `Data Model` e `EntriesRepository`, de modo a obter o máximo de *coverage* possível, foram realizados testes a todos os métodos de ambas as classes, adicionando mais vinte e um testes à nossa bateria de testes. * *jpass.crypt* - Este pacote lida com a encriptação e desencriptação das palavras-passes. * Inicialmente este pacote já continha vários testes, mas ainda assim foi possível a adição de mais um teste, de modo a cobrir o restante do pacote. * *jpass.util* - Por fim temos o pacote que tinha sido alvo dos testes dos *assignments* 2 e 3, pacote este que fornece diversos métodos utilitários ao projeto. * Visto que apenas 43% do pacote estava coberto pelos testes realizados anteriormente, foi verificada a cobertura dos testes ja realizados e quais as classes que não continham testes. Desta forma foram adicionados testes às classes `StringUtils`, `DateUtils` e `ClipboardUtils`, por fim realizamos testes sobre as classes `CryptUtils` e `Configuration`. Desta forma foram adicionados à bateria de testes dezassete testes. ## Resultados finais Após a realização dos testes referidos acima, foi possível gerar um novo relatório, onde verificamos que a cobertura aumentou substancialmente. Inicialmente, como indicado no primeiro ponto, a *line coverage* foi de 59% e a *branch coverage* foi de 65% (não incluindo as classes e pacotes relativos ao UI). No final conseguimos aumentar a *line coverage* para 91% e a *branch coverage* 83% Assim conseguimos verificar que desta forma o projeto ficou com uma cobertura muito maior, aumentando a confiança de que o projeto está bem testado. De frisar que ainda que tenhamos esta elevada percentagem de cobertura, a mesma não nos garante de que o projeto está realmente bem testado.