---
# System prepended metadata

title: 'Assignment #5'

---

![](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.
