Commit 147567f8 authored by noel5550's avatar noel5550

fin du rapport

parent 0be53cd4
......@@ -2,12 +2,90 @@
= Rapport
== Testabilité
== Mutations
= A very simple game
== Analyse de testabilité
Le code du jeu est assez bien couvert pour les tests, mais la manque de setters et de getters dans les classes peut rendre difficile pour tester des cas des classes. Par exemple, sans des setters de gold, nous ne pouvons pas voir comment le jeu réagira une fois qu'un joueur ait 3 gold sans jouer le jeu. Si nous devons jouer le jeu pour tester si le jeu se terminera nous pouvons avoir des cas où il y a des erreurs dans la démarche du simulation. Par exemple, c'est possible d'avoir des erreurs lors de mouvement des pawns lors de la simulation pour obtenir 3 pièces. Avec des accesseurs, nous pouvons directemment voir si le jeu terminera avec 3 golds. Le test deviendra donc atomique. Pour cela, des accesseurs ont été mis dans ces classes pour améliorer leur testabilités.
Les classes sont bien découpées, ce qui nous permet de bien voir les fonctionnalités de chaque partie du jeu. Les méthodes des classes sont controllables et facilement observable en manipulant les arguments des méthodes. Le fait que les classes soient bien découpées permet une meilleur observabilité lorsque qu'on test les parties du jeu.
Le jeu n'utilise pas de fonctions aléatoires, donc les classes sont assez stables pour tester, et on n'a pas besoin d'effectuer plusieurs tests avec les mêmes paramètres pour observer les comportements aléatoires potentiels.
== Tests fonctionnels
=== isGameOver()
Test pour la fin du jeu avec la méthode isGameOver() de Game. Entrée implicite est le nombre de pawns obtenu via la méthode numberOfPawns() de l'attribut board de Game, ce qui retourne un entier. Une autre entrée implicite est le nombre de gold max obtenu via la méthode maxGold() de l'attribut board de Game, qui retourne un entier. La sortie est un booléen, true si le jeu est fini, false sinon.
Nous avons donc deux types de classes d'équivalence: le nombre de pawns, et le nombre de gold.
* CE1: pawns en jeu = 1
* CE2: pawns en jeu = >1
* CE3: nombre de gold = <3
* CE4: nombre de gold = >=3
Table de décisions
* Entrée : pawns en jeu = 1, sortie : game over = true
* Entrée : pawns en jeu = [2, +inf], sortie : game over = false
* Entrée : gold en jeu = [0, 2], sortie : game over = false
* Entrée : gold en jeu = [3, +inf], sortie : game over = true
=== moveNextPawn()
Pour cette méthode nous allons voir si lorsque les pions sont bougés, nous avons les bons comportements dans le jeu. L'entrée est constituée du paramètre d de type Direction et d'un Pawn de l'attribut board accessible via la méthode getNextPawn() de la classe Board, qui sera bougé vers d avec la méthode move(Direction) de la classe Pawn. La sortie est constituée de la position du pawn qui est déplacé, les points de vies des pawns, le String que moveNextPawn affiche, et une sortie d'erreur out of bounds.
* CE1: coordonnées de pawn1 = (x,y) coordonnées de pawn2 = (x,y-1) et pawn1 se déplace pour que ses coordonnées soient (x,y-1)
* CE2: coordonnées de pawn1 = (x,y) coordonnées de pawn2 = (x,y-1) et pawn2 se déplace pour que ses coordonnées soient (x,y-2)
* CE3: coordonnées de pawn1 = (x,y) avec y = 0, pawn1 se déplace pour que son y soit <0
Table de décisions
* CE1
** Entrée : coordonnées de pawn1 = (x,y) coordonnées de pawn2 = (x,y-1) et pawn1 se déplace pour que ses coordonnées soient (x,y-1)
** Sortie :
*** coordonnées pawn1 = (x,y)
*** coordonnées pawn2 = (x,y-1)
*** PV pawn1 = PV initial
*** PV pawn2 = PV initial - 1
*** String de sortie = "pawn1 attacks! pawn2 loses 1 hitpoints."
*** Erreur out of bounds = false
* CE2
** Entrée : coordonnées de pawn1 = (x,y) coordonnées de pawn2 = (x,y-1) et pawn2 se déplace pour que ses coordonnées soient (x,y-2)
** Sortie :
*** coordonnées pawn1 = (x,y)
*** coordonnées pawn2 = (x,y-2)
*** PV pawn1 = PV initial
*** PV pawn2 = PV initial
*** String de sortie = ""
*** Erreur out of bounds = false
* CE3
** Entrée : coordonnées de pawn1 = (x,y) avec y = 0, pawn1 se déplace pour que son y soit <0
** Sortie :
*** coordonnées pawn1 = (x,y)
*** PV pawn1 = PV initial
*** String de sortie = ""
*** Erreur out of bounds = true
== Couverture des tests et analyse de mutation
Je n'ai pas effectué de tests pour les classes CLIMain, OutOfBoardException, StringColoring et Direction. CLIMain ne contient seulement la partie main qui sera exécuté lors du déroulement du jeu, et n'est dont pas intéressant de tester (car le but est de tester ce que cette classe appelera). La classe OutOfBoardException est une classe d'exception et ne contient que l'ID de la version et ce que l'exception affichera. La classe StringColoring ne contient que les couleurs à afficher lors du jeu. La classe Direction n'est qu'une énumération des direction des pions.
Je n'ai donc effectué des tests de mutations dans les classes Board, Game et Pawn, car ce sont ces classes où des variables peuvent changer le comportement de ses méthodes et du jeu. L'image ci desous indique les pourcentages de couverture pour chacun de ces classes :
image:tests.PNG[]
J'a bien couvert la classe Game, et assez bien couvert la classe Board. La classe Pawn est un peu moins couvert car je n'ai pas pu trouver comment déterminer si un Board a encore un pawn à 0PV en jeu. La partie
if (hitpoints <= 0) {
this.board.removePawn(this);
message += this.letter+" is dead.";
}
de la méthode suffer(String) de la classe Pawn ne peut pas être bien déterminée.
== Difficultés rencontrés
Ma première difficulté était la mise en place de l'environnement. Je n'ai pas pu au début lancer PIT avec les plugins Maven récupérés sur l'internet, j'ai donc utilisé le pom du tp measures fait en cours avin d'obtenir les bonnes versions du plugins.
Ceci dit, même en utilisant le pom du tp, je n'ai pas pu activer jaCoCo et je recevais l'erreur Errorgenerating maven-javadoc-plugin:3.2.0:aggregate-no-fork report lorsque j'effectue la commande mvn site. Je ne trouve pas cela un si grand problème car avec Pit j'ai pu trouver l'étendue de mes couvertures et des mutations de mes tests.
L'erreur vient sans doute de la version de Java et de maven de mon oddier .m que j'utilise, mais en ayant changé la version, j'ai eu d'autres erreurs qui m'empeche de lancer jaCoCo, PIT et JUnit.
== Conclusion
Ceci dit, j'ai pu bien effectuer les objectifs du tp avec ce que j'ai pu faire fonctionner dans ma machine, et ce projet m'a parmis de mieux comprendre le fonctionnement des couvertures des tests et des mutations, et qu'il faut ajouter des tests utiles et pas surcharger les fichiers tests avec des tests redondantes et évidentgs (comme tester chaque getter simples des classes, par exemple).
== A very simple game
== Introduction
......
......@@ -29,18 +29,17 @@ public class BoardT {
@Test
public void boardThrowExceptionNoPawnTest() throws IndexOutOfBoundsException {
assertThrows(IndexOutOfBoundsException.class, () -> {
public void boardThrowExceptionPawnTest() throws IndexOutOfBoundsException {
//pas de Pawn
assertThrows(IndexOutOfBoundsException.class, () -> {
board = new Board(0,40,40,4,4);
});
}
@Test
public void boardThrowExceptionTooMuchPawnTest() throws IndexOutOfBoundsException {
assertThrows(NullPointerException.class, () -> {
assertThrows(NullPointerException.class, () -> {
//Un Board avec nbPions > 27 est null car getCharForNumber est null avec nbPions>27
board = new Board(27,400,400,3,3);
});
}
@Test
......@@ -59,7 +58,6 @@ public class BoardT {
board.addPawn(pawn1);
squarePawn = board.getSquareContent(1, 1);
assertEquals(pawn1,squarePawn);
assertNotNull(squarePawn);
}
@Test
......
tests.PNG

20.1 KB

Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment