README.md 42.2 KB
Newer Older
clguilbert's avatar
clguilbert committed
1
2
# Forges_Logicielles_Guilbert_TP3

clguilbert's avatar
clguilbert committed
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# TP 3

Le but de ce TP est de mettre en place un processus d'intégration continue en se basant sur le projet précédent.

## 1 Création d'un espace projet dédié sous gitlab
1. Pour mettre en place une chaine d'intégration continue initialisez un nouveau projet sous [GitLab](https://gitlab.isima.fr).
1. Ajouter dans la liste des développeurs votre binôme. (Settings/Members)
1. Ajouter en reporter `tjouve` et `iia_samorel`.
1. Ajoutez ce compte rendu comme readme de votre projet.
    * Vous pouvez le faire directement depuis l'interface avec *new File*
    * Copier le code markdown, il est possible d'editer le document via l'interface web directement sur gitlab
    * **Renseignez vos noms en haut du compte rendu**
1. Ajoutez une licence pour indiquer sous quels termes votre production est disponible
    * Cliquez sur **Add License**, il est possible de rédiger soi-même le contenu, ou de selectionner une licence existante (Apache, MIT, GNU ...). Le site [choose a license](https://choosealicense.com/licenses/) propose un comparatif entre les différentes liences les plus courantes.


## 2 Initialisation du projet
Pour prendre en charge la gestion des dépendances et l'automatisation de la construction de l'application nous utiliserons `Maven`.
Pour démarrer rapidement le projet nous allons faire du *scaffolding*. Pour ce faire nous utiliserons [Spring Boot](https://projects.spring.io/spring-boot/). Et plus particuliérement [Spring initializr](https://start.spring.io/).

### 2.1 Spring Initializer
1. Créer un squelette d'application avec [Spring initializr](https://start.spring.io/) :
    1. choisissez comme groupe id **isima.F2**
    2. comme nom d'artefact vous saisirez **TP3.`nom binome`**
    3. téléchargez ce template de projet.
1. clonez votre nouveau projet localement
    1. dézippez l'archive dans votre repo local, ce dernier ne devrait contenir que l'arborescence des sources, le pom et votre readme
    1. commitez et pushez sur le serveur


### 2.2 Utilisation de maven
Avant de reporter le code du TP2 nous allons nous familiariser avec *Maven*

#### 2.2.1 Convention over configuration
Pour permettre de développer plus rapidement des applications une bonne pratique est de respecter certaines normes.

Dans notre cas en utilisant **Spring Initializer** nous avons rapidement généré un squelette d'application utilisant maven et fournissant un certain nombre de fonctionnalitées transverses.
Notamment un framework de test **JUnit** et un framework de logging **Logback**


* A quoi correspondent les fichiers présents dans le zip ?
    * pom.xml
    * .gitignore
    * décrire l'arborescence de répertoire

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
48
49
50
51
`pom.xml : Project Object Model est un fichier essentiel à Maven. C'est un document XML qui contient des infos sur le projet et sa configuration et est utilisé pour le build de celui ci.`
`.gitignore : fichier contenant les noms des fichiers à ne pas push sur le git.`
`Arborescence du repo : TP3.Guilbert (Nom de groupe) > src > main : contient ressources (qui possède application.properties) et java > isima > f2 > TP3 > Guilbert > Application.java`

clguilbert's avatar
clguilbert committed
52
53
54
55
56
57
58

#### 2.2.2 Gestion des dépendances

Dans le nouveau projet on retrouve une classe *Application.java* sous *src/main/java* dans le package *isima.F2.TP3.`nom binome`*
* Dans cette classe créez un logger et loggez un `Hello Word` en *warning*

```java
Clément Guilbert's avatar
yaml    
Clément Guilbert committed
59
60
61
62
63
64
	private static final Logger logger = Logger.getLogger(String.valueOf(DemoApplication.class));
	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
		logger.setLevel(Level.WARNING);
		logger.warning("Hello World");
	}
clguilbert's avatar
clguilbert committed
65
66
67
68
```

* Exécutez votre programme

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
69
70
`
[2020-02-17 13:59:14.484] - 13484 INFO [main] --- isima.f2.TP3.Guilbert.Application: Starting Application on DESKTOP-14G9Q7S with PID 13484 (started by Clement in C:\Users\Clement\Desktop\Forges Logicielle\TP3\forges_logicielles_guilbert_tp3\TP3.Guilbert)
Clément Guilbert's avatar
Clément Guilbert committed
71

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
72
[2020-02-17 13:59:14.505] - 13484 INFO [main] --- isima.f2.TP3.Guilbert.Application: No active profile set, falling back to default profiles: default
Clément Guilbert's avatar
Clément Guilbert committed
73

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
74
[2020-02-17 13:59:15.193] - 13484 INFO [main] --- isima.f2.TP3.Guilbert.Application: Started Application in 1.118 seconds (JVM running for 1.628)
Clément Guilbert's avatar
Clément Guilbert committed
75

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
76
77
[2020-02-17 13:59:15.195] - 13484 WARNING [main] --- class isima.f2.TP3.Guilbert.Application$DemoApplication: Hello World
`
clguilbert's avatar
clguilbert committed
78
79
80
81
82
83
84
85
86
87

Vous remarquerez qu'il n'est pas nécessaire d'ajouter la dépendance vers un logger (ici *logback*). C'est une dépendance classique d'un projet java. Elle est déjà présente dans le pom de *spring boot*.

Pour illustrer la gestion des dépendances automatiques vous ajouterez une dépendance vers la librairie **commons-lang3** de **apache**
* Ajout de la dépendance *Apache commons lang3*
    * Pour ce faire recherche `commons-lang3` sur [MVNrepository](https://mvnrepository.com).
    * selectionnez la derniére version
    * copiez la déclaration et collez là dans votre *pom.xml*
    * Décrivrez rapidement le fonctionnement de la résolution de dépendance

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
88
`Il suffit d'ajouter les informations fournies par le site de maven au pom.xml, et intelliJ reimportera les dépendances nécessaires.`
clguilbert's avatar
clguilbert committed
89
90
91
92
93
94
95

* Utilisez la classe utilitaire `StringUtils` et sa méthode `reverse` pour afficher dans la log au niveau *debug* vos noms à la suite du Hello Word.
    * La ligne de log n'apparait pas dans la console car le niveau de trace par defaut est `WARN`.
    * [Spring boot logging](https://docs.spring.io/spring-boot/docs/current/reference/html/howto-logging.html) indique comment changer le niveau de trace. (Il n'est pas nécessaire d'ajouter la dépendance elle est déjà présente).
    * Un fois le niveau de trace par defaut changé vous devriez voir le résultat de votre commande.
    * Quel fichier de configuration est modifié ?

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
96
97
98
99
100
101
102
103
`D'après la documentation, le fichier à modifier est org/logback.xml`
```java
	logger.warning(StringUtils.reverse("Clément Guilbert"));
```   

```
[2020-02-17 14:13:07.358] - 4728 WARNING [main] --- class isima.f2.TP3.Guilbert.Application$DemoApplication: trebliuG tnemélC
```   
clguilbert's avatar
clguilbert committed
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119

#### 2.2.3 Gestion du cycle de vie

Dans cette partie nous allons utiliser les commandes de build de manven. Ces commandes permettentent d'automatiser certaines taches.
[Maven Lyfe Cycle](https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html) décrit l'ensemble des instructions et l'enchainement des différentes phases de **Maven**.

L'archive générée via spring initializer contient un répertoire `.mvn` et 2 scripts `mvnw` et `mvnw.bat`. Le projet contient par defaut un *wrapper* qui permet d'avoir une installation locale de maven pour ne pas être dépendant du systéme sur lequel on développe.

Il est possible de lancer directement des taches maven en appellant le script (`mvnw` pour *linux* et `mvnw.bat` pour *windows* ).

Par example `./mvnw.bat clean` permet de supprimer les classes compilées dans le repertoire target.

En utilisant la ligne de commande nous allons compiler, tester et packager l'application sous la forme d'un jar.

##### 2.2.3.1 Compilation
* Quelle est la commande à lancer pour compiler l'application ?
Clément Guilbert's avatar
yaml    
Clément Guilbert committed
120
121


clguilbert's avatar
clguilbert committed
122
123
124
* Quelle est la commande à lancer pour compiler & éxécuter les tests ?
* Quel sont les fichiers / répertoires générés par cette commande ?

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
125
126
127
128
129
`./mvnw.bat compile`
`./mvnw.bat test`


`Le dossier target est rempli par ces commandes`
clguilbert's avatar
clguilbert committed
130
131
132
133
134

##### 2.2.3.2 Packaging
* Quelle est la commande à lancer ?
* Quel sont les fichiers / répertoires générés par cette commande ?

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
135
`./mvnw.bat package génère une snapshot du projet : TP3.Guilbert-0.0.1-SNAPSHOT.jar`
clguilbert's avatar
clguilbert committed
136
137
138
139
140
141
142
143


### 2.3 Reportez le code du TP2           
* Reportez vos classes d'implémentation et de test dans le nouveau projet
    * Votre implémentation dans le repertoire src/main/java/*pakcage_name*/*Application*
    * Votre classe de test dans le repertoire src/test/java/*pakcage_name*/*ApplicationTests*
* Effectuez le packaging de votre application pour lancer la compilation et les tests.

Clément Guilbert's avatar
Clément Guilbert committed
144
```./mvnw compile
Clément Guilbert's avatar
yaml    
Clément Guilbert committed
145
[INFO] Scanning for projects...
Clément Guilbert's avatar
Clément Guilbert committed
146

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
147
[INFO]
Clément Guilbert's avatar
Clément Guilbert committed
148

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
149
[INFO] -----------------------< isima.f2:TP3.Guilbert >------------------------
Clément Guilbert's avatar
Clément Guilbert committed
150

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
151
[INFO] Building TP3.Guilbert 0.0.1-SNAPSHOT
Clément Guilbert's avatar
Clément Guilbert committed
152

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
153
[INFO] --------------------------------[ jar ]---------------------------------
Clément Guilbert's avatar
Clément Guilbert committed
154

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
155
[INFO]
Clément Guilbert's avatar
Clément Guilbert committed
156

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
157
[INFO] --- maven-resources-plugin:3.1.0:resources (default-resources) @ TP3.Guilbert ---
Clément Guilbert's avatar
Clément Guilbert committed
158

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
159
[INFO] Using 'UTF-8' encoding to copy filtered resources.
Clément Guilbert's avatar
Clément Guilbert committed
160

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
161
[INFO] Copying 1 resource
Clément Guilbert's avatar
Clément Guilbert committed
162

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
163
[INFO] Copying 0 resource
Clément Guilbert's avatar
Clément Guilbert committed
164

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
165
[INFO]
Clément Guilbert's avatar
Clément Guilbert committed
166

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
167
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ TP3.Guilbert ---
Clément Guilbert's avatar
Clément Guilbert committed
168

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
169
[INFO] Nothing to compile - all classes are up to date
Clément Guilbert's avatar
Clément Guilbert committed
170

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
171
[INFO] ------------------------------------------------------------------------
Clément Guilbert's avatar
Clément Guilbert committed
172

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
173
[INFO] BUILD SUCCESS
Clément Guilbert's avatar
Clément Guilbert committed
174

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
175
[INFO] ------------------------------------------------------------------------
Clément Guilbert's avatar
Clément Guilbert committed
176

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
177
[INFO] Total time:  1.557 s
Clément Guilbert's avatar
Clément Guilbert committed
178

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
179
[INFO] Finished at: 2020-02-17T14:45:23+01:00
Clément Guilbert's avatar
Clément Guilbert committed
180

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
181
182
183
184
185
[INFO] ------------------------------------------------------------------------

./mvnw test

[INFO] Scanning for projects...
Clément Guilbert's avatar
Clément Guilbert committed
186

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
187
[INFO]
Clément Guilbert's avatar
Clément Guilbert committed
188

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
189
[INFO] -----------------------< isima.f2:TP3.Guilbert >------------------------
Clément Guilbert's avatar
Clément Guilbert committed
190

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
191
[INFO] Building TP3.Guilbert 0.0.1-SNAPSHOT
Clément Guilbert's avatar
Clément Guilbert committed
192

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
193
[INFO] --------------------------------[ jar ]---------------------------------
Clément Guilbert's avatar
Clément Guilbert committed
194

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
195
[INFO]
Clément Guilbert's avatar
Clément Guilbert committed
196

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
197
[INFO] --- maven-resources-plugin:3.1.0:resources (default-resources) @ TP3.Guilbert ---
Clément Guilbert's avatar
Clément Guilbert committed
198

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
199
[INFO] Using 'UTF-8' encoding to copy filtered resources.
Clément Guilbert's avatar
Clément Guilbert committed
200

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
201
[INFO] Copying 1 resource
Clément Guilbert's avatar
Clément Guilbert committed
202

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
203
[INFO] Copying 0 resource
Clément Guilbert's avatar
Clément Guilbert committed
204

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
205
[INFO]
Clément Guilbert's avatar
Clément Guilbert committed
206

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
207
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ TP3.Guilbert ---
Clément Guilbert's avatar
Clément Guilbert committed
208

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
209
[INFO] Nothing to compile - all classes are up to date
Clément Guilbert's avatar
Clément Guilbert committed
210

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
211
[INFO]
Clément Guilbert's avatar
Clément Guilbert committed
212

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
213
[INFO] --- maven-resources-plugin:3.1.0:testResources (default-testResources) @ TP3.Guilbert ---
Clément Guilbert's avatar
Clément Guilbert committed
214

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
215
[INFO] Using 'UTF-8' encoding to copy filtered resources.
Clément Guilbert's avatar
Clément Guilbert committed
216

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
217
[INFO] skip non existing resourceDirectory C:\Users\Clement\Desktop\Forges Logicielle\TP3\forges_logicielles_guilbert_tp3\TP3.Guilbert\src\test\resources
Clément Guilbert's avatar
Clément Guilbert committed
218

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
219
[INFO]
Clément Guilbert's avatar
Clément Guilbert committed
220

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
221
[INFO] --- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ TP3.Guilbert ---
Clément Guilbert's avatar
Clément Guilbert committed
222

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
223
[INFO] Nothing to compile - all classes are up to date
Clément Guilbert's avatar
Clément Guilbert committed
224

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
225
[INFO]
Clément Guilbert's avatar
Clément Guilbert committed
226

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
227
[INFO] --- maven-surefire-plugin:2.22.2:test (default-test) @ TP3.Guilbert ---
Clément Guilbert's avatar
Clément Guilbert committed
228

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
229
[INFO]
Clément Guilbert's avatar
Clément Guilbert committed
230

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
231
[INFO] -------------------------------------------------------
Clément Guilbert's avatar
Clément Guilbert committed
232

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
233
[INFO]  T E S T S
Clément Guilbert's avatar
Clément Guilbert committed
234

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
235
[INFO] -------------------------------------------------------
Clément Guilbert's avatar
Clément Guilbert committed
236

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
237
[INFO] Running isima.f2.TP3.Guilbert.ApplicationTests
Clément Guilbert's avatar
Clément Guilbert committed
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308

14:45:31.636 [main] DEBUG org.springframework.test.context.BootstrapUtils - Instantiating CacheAwareContextLoaderDelegate from class [org.springframework.test.context.
cache.DefaultCacheAwareContextLoaderDelegate]

14:45:31.648 [main] DEBUG org.springframework.test.context.BootstrapUtils - Instantiating BootstrapContext using constructor [public org.springframework.test.context.
support.DefaultBootstrapContext(java.lang.Class,org.springframework.test.context.CacheAwareContextLoaderDelegate)]

14:45:31.675 [main] DEBUG org.springframework.test.context.BootstrapUtils - Instantiating TestContextBootstrapper for test class [isima.f2.TP3.Guilbert.ApplicationTests] 
from class [org.springframework.boot.test.context.SpringBootTestContextBootstrapper]

14:45:31.690 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Neither @ContextConfiguration nor @ContextHierarchy found for test 
class [isima.f2.TP3.Guilbert.ApplicationTests], using SpringBootContextLoader

14:45:31.694 [main] DEBUG org.springframework.test.context.support.AbstractContextLoader - Did not detect default resource location for test class [isima.f2.TP3.Guilbert.
ApplicationTests]: class path resource [isima/f2/TP3/Guilbert/ApplicationTests-context.xml] does not exist

14:45:31.694 [main] DEBUG org.springframework.test.context.support.AbstractContextLoader - Did not detect default resource location for test class [isima.f2.TP3.Guilbert.
ApplicationTests]: class path resource [isima/f2/TP3/Guilbert/ApplicationTestsContext.groovy] does not exist

14:45:31.694 [main] INFO org.springframework.test.context.support.AbstractContextLoader - Could not detect default resource locations for test class [isima.f2.TP3.
Guilbert.ApplicationTests]: no resource found for suffixes {-context.xml, Context.groovy}.

14:45:31.695 [main] INFO org.springframework.test.context.support.AnnotationConfigContextLoaderUtils - Could not detect default configuration classes for test class 
[isima.f2.TP3.Guilbert.ApplicationTests]: ApplicationTests does not declare any static, non-private, non-final, nested classes annotated with @Configuration.

14:45:31.724 [main] DEBUG org.springframework.test.context.support.ActiveProfilesUtils - Could not find an 'annotation declaring class' for annotation type [org.
springframework.test.context.ActiveProfiles] and class [isima.f2.TP3.Guilbert.ApplicationTests]

14:45:31.809 [main] DEBUG org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider - Identified candidate component class: file 
[C:\Users\Clement\Desktop\Forges Logicielle\TP3\forges_logicielles_guilbert_tp3\TP3.Guilbert\target\classes\isima\f2\TP3\Guilbert\Application.class]

14:45:31.814 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Found @SpringBootConfiguration isima.f2.TP3.Guilbert.Application for 
test class isima.f2.TP3.Guilbert.ApplicationTests

14:45:32.002 [main] DEBUG org.springframework.boot.test.context.SpringBootTestContextBootstrapper - @TestExecutionListeners is not present for class [isima.f2.TP3.
Guilbert.ApplicationTests]: using defaults.

14:45:32.002 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Loaded default TestExecutionListener class names from location 
[META-INF/spring.factories]: [org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener, org.springframework.boot.test.mock.mockito.
ResetMocksTestExecutionListener, org.springframework.boot.test.autoconfigure.restdocs.RestDocsTestExecutionListener, org.springframework.boot.test.autoconfigure.web.
client.MockRestServiceServerResetTestExecutionListener, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcPrintOnlyOnFailureTestExecutionListener, org.
springframework.boot.test.autoconfigure.web.servlet.WebDriverTestExecutionListener, org.springframework.test.context.web.ServletTestExecutionListener, org.
springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener, org.springframework.test.context.support.DependencyInjectionTestExecutionListener, 
org.springframework.test.context.support.DirtiesContextTestExecutionListener, org.springframework.test.context.transaction.TransactionalTestExecutionListener, org.
springframework.test.context.jdbc.SqlScriptsTestExecutionListener, org.springframework.test.context.event.EventPublishingTestExecutionListener]

14:45:32.011 [main] DEBUG org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Skipping candidate TestExecutionListener [org.springframework.test.
context.web.ServletTestExecutionListener] due to a missing dependency. Specify custom listener classes or make the default listener classes and their required 
dependencies available. Offending class: [javax/servlet/ServletContext]

14:45:32.012 [main] DEBUG org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Skipping candidate TestExecutionListener [org.springframework.test.
context.transaction.TransactionalTestExecutionListener] due to a missing dependency. Specify custom listener classes or make the default listener classes and their 
required dependencies available. Offending class: [org/springframework/transaction/interceptor/TransactionAttributeSource]

14:45:32.013 [main] DEBUG org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Skipping candidate TestExecutionListener [org.springframework.test.
context.jdbc.SqlScriptsTestExecutionListener] due to a missing dependency. Specify custom listener classes or make the default listener classes and their required 
dependencies available. Offending class: [org/springframework/transaction/interceptor/TransactionAttribute]

14:45:32.014 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Using TestExecutionListeners: [org.springframework.test.context.
support.DirtiesContextBeforeModesTestExecutionListener@1b2abca6, org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener@6392827e, org.springframework.
boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener@2ed2d9cb, org.springframework.test.context.support.
DirtiesContextTestExecutionListener@d5b810e, org.springframework.test.context.event.EventPublishingTestExecutionListener@43dac38f, org.springframework.boot.test.mock.
mockito.ResetMocksTestExecutionListener@342c38f8, org.springframework.boot.test.autoconfigure.restdocs.RestDocsTestExecutionListener@c88a337, org.springframework.boot.
test.autoconfigure.web.client.MockRestServiceServerResetTestExecutionListener@5d0a1059, org.springframework.boot.test.autoconfigure.web.servlet.
MockMvcPrintOnlyOnFailureTestExecutionListener@485966cc, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverTestExecutionListener@1de76cc7]

14:45:32.018 [main] DEBUG org.springframework.test.context.support.AbstractDirtiesContextTestExecutionListener - Before test class: context [DefaultTestContext@4803b726 
testClass = ApplicationTests, testInstance = [null], testMethod = [null], testException = [null], mergedContextConfiguration = [MergedContextConfiguration@ffaa6af 
testClass = ApplicationTests, locations = '{}', classes = '{class isima.f2.TP3.Guilbert.Application}', contextInitializerClasses = '[]', activeProfiles = '{}', 
propertySourceLocations = '{}', propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true}', contextCustomizers = set[org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@3e92efc3, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@2e4b8173, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@31d7b7bf, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@3427b02d], contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]], attributes = map[[empty]]], class annotated with @DirtiesContext [false] with mode [null].

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
309
14:45:32.031 [main] DEBUG org.springframework.test.context.support.DependencyInjectionTestExecutionListener - Performing dependency injection for test context [[DefaultTestContext@4803b726 testClass = ApplicationTests, testInstance = isima.f2.TP3.Guilbert.ApplicationTests@273e7444, testMethod = [null], testException = [null], mergedContextConfiguration = [MergedContextConfiguration@ffaa6af testClass = ApplicationTests, locations = '{}', classes = '{class isima.f2.TP3.Guilbert.Application}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true}', contextCustomizers = set[org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@3e92efc3, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@2e4b8173, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@31d7b7bf, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@3427b02d], contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]], attributes = map[[empty]]]].
Clément Guilbert's avatar
Clément Guilbert committed
310
311
312

14:45:32.060 [main] DEBUG org.springframework.test.context.support.TestPropertySourceUtils - Adding inlined properties to environment: {spring.jmx.enabled=false, org.
springframework.boot.test.context.SpringBootTestContextBootstrapper=true, server.port=-1}
Clément Guilbert's avatar
yaml    
Clément Guilbert committed
313
314
315
316
317
318
319
320
321

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.2.4.RELEASE)

Clément Guilbert's avatar
Clément Guilbert committed
322
323
324
325

2020-02-17 14:45:32.380  INFO 8620 --- [           main] isima.f2.TP3.Guilbert.ApplicationTests   : Starting ApplicationTests on DESKTOP-14G9Q7S with PID 8620 (started 
by Clement in C:\Users\Clement\Desktop\Forges Logicielle\TP3\forges_logicielles_guilbert_tp3\TP3.Guilbert)

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
326
2020-02-17 14:45:32.382  INFO 8620 --- [           main] isima.f2.TP3.Guilbert.ApplicationTests   : No active profile set, falling back to default profiles: default
Clément Guilbert's avatar
Clément Guilbert committed
327

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
328
2020-02-17 14:45:32.920  INFO 8620 --- [           main] isima.f2.TP3.Guilbert.ApplicationTests   : Started ApplicationTests in 0.857 seconds (JVM running for 1.953)
Clément Guilbert's avatar
Clément Guilbert committed
329

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
330
[INFO] Tests run: 17, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.688 s - in isima.f2.TP3.Guilbert.ApplicationTests
Clément Guilbert's avatar
Clément Guilbert committed
331

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
332
[INFO]
Clément Guilbert's avatar
Clément Guilbert committed
333

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
334
[INFO] Results:
Clément Guilbert's avatar
Clément Guilbert committed
335

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
336
[INFO]
Clément Guilbert's avatar
Clément Guilbert committed
337

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
338
[INFO] Tests run: 17, Failures: 0, Errors: 0, Skipped: 0
Clément Guilbert's avatar
Clément Guilbert committed
339

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
340
[INFO]
Clément Guilbert's avatar
Clément Guilbert committed
341

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
342
[INFO] ------------------------------------------------------------------------
Clément Guilbert's avatar
Clément Guilbert committed
343

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
344
[INFO] BUILD SUCCESS
Clément Guilbert's avatar
Clément Guilbert committed
345

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
346
[INFO] ------------------------------------------------------------------------
Clément Guilbert's avatar
Clément Guilbert committed
347

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
348
[INFO] Total time:  5.328 s
Clément Guilbert's avatar
Clément Guilbert committed
349

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
350
[INFO] Finished at: 2020-02-17T14:45:33+01:00
Clément Guilbert's avatar
Clément Guilbert committed
351

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
352
353
354
[INFO] ------------------------------------------------------------------------

./mvnw package
Clément Guilbert's avatar
Clément Guilbert committed
355

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
356
[INFO] Scanning for projects...
Clément Guilbert's avatar
Clément Guilbert committed
357

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
358
[INFO]
Clément Guilbert's avatar
Clément Guilbert committed
359

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
360
[INFO] -----------------------< isima.f2:TP3.Guilbert >------------------------
Clément Guilbert's avatar
Clément Guilbert committed
361

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
362
[INFO] Building TP3.Guilbert 0.0.1-SNAPSHOT
Clément Guilbert's avatar
Clément Guilbert committed
363

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
364
[INFO] --------------------------------[ jar ]---------------------------------
Clément Guilbert's avatar
Clément Guilbert committed
365

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
366
[INFO]
Clément Guilbert's avatar
Clément Guilbert committed
367

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
368
[INFO] --- maven-resources-plugin:3.1.0:resources (default-resources) @ TP3.Guilbert ---
Clément Guilbert's avatar
Clément Guilbert committed
369

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
370
[INFO] Using 'UTF-8' encoding to copy filtered resources.
Clément Guilbert's avatar
Clément Guilbert committed
371

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
372
[INFO] Copying 1 resource
Clément Guilbert's avatar
Clément Guilbert committed
373

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
374
[INFO] Copying 0 resource
Clément Guilbert's avatar
Clément Guilbert committed
375

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
376
[INFO]
Clément Guilbert's avatar
Clément Guilbert committed
377

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
378
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ TP3.Guilbert ---
Clément Guilbert's avatar
Clément Guilbert committed
379

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
380
[INFO] Nothing to compile - all classes are up to date
Clément Guilbert's avatar
Clément Guilbert committed
381

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
382
[INFO]
Clément Guilbert's avatar
Clément Guilbert committed
383

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
384
[INFO] --- maven-resources-plugin:3.1.0:testResources (default-testResources) @ TP3.Guilbert ---
Clément Guilbert's avatar
Clément Guilbert committed
385

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
386
[INFO] Using 'UTF-8' encoding to copy filtered resources.
Clément Guilbert's avatar
Clément Guilbert committed
387

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
388
[INFO] skip non existing resourceDirectory C:\Users\Clement\Desktop\Forges Logicielle\TP3\forges_logicielles_guilbert_tp3\TP3.Guilbert\src\test\resources
Clément Guilbert's avatar
Clément Guilbert committed
389

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
390
[INFO]
Clément Guilbert's avatar
Clément Guilbert committed
391

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
392
[INFO] --- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ TP3.Guilbert ---
Clément Guilbert's avatar
Clément Guilbert committed
393

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
394
[INFO] Nothing to compile - all classes are up to date
Clément Guilbert's avatar
Clément Guilbert committed
395

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
396
[INFO]
Clément Guilbert's avatar
Clément Guilbert committed
397

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
398
[INFO] --- maven-surefire-plugin:2.22.2:test (default-test) @ TP3.Guilbert ---
Clément Guilbert's avatar
Clément Guilbert committed
399

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
400
[INFO]
Clément Guilbert's avatar
Clément Guilbert committed
401

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
402
[INFO] -------------------------------------------------------
Clément Guilbert's avatar
Clément Guilbert committed
403

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
404
[INFO]  T E S T S
Clément Guilbert's avatar
Clément Guilbert committed
405

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
406
[INFO] -------------------------------------------------------
Clément Guilbert's avatar
Clément Guilbert committed
407

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
408
[INFO] Running isima.f2.TP3.Guilbert.ApplicationTests
Clément Guilbert's avatar
Clément Guilbert committed
409
410
411
412
413
414
415
416
417
418
419
420
421

14:45:46.431 [main] DEBUG org.springframework.test.context.BootstrapUtils - Instantiating CacheAwareContextLoaderDelegate from class [org.springframework.test.context.
cache.DefaultCacheAwareContextLoaderDelegate]

14:45:46.442 [main] DEBUG org.springframework.test.context.BootstrapUtils - Instantiating BootstrapContext using constructor [public org.springframework.test.context.
support.DefaultBootstrapContext(java.lang.Class,org.springframework.test.context.CacheAwareContextLoaderDelegate)]

14:45:46.472 [main] DEBUG org.springframework.test.context.BootstrapUtils - Instantiating TestContextBootstrapper for test class [isima.f2.TP3.Guilbert.ApplicationTests] 
from class [org.springframework.boot.test.context.SpringBootTestContextBootstrapper]

14:45:46.488 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Neither @ContextConfiguration nor @ContextHierarchy found for test 
class [isima.f2.TP3.Guilbert.ApplicationTests], using SpringBootContextLoader

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
422
14:45:46.492 [main] DEBUG org.springframework.test.context.support.AbstractContextLoader - Did not detect default resource location for test class [isima.f2.TP3.Guilbert.ApplicationTests]: class path resource [isima/f2/TP3/Guilbert/ApplicationTests-context.xml] does not exist
Clément Guilbert's avatar
Clément Guilbert committed
423

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
424
14:45:46.492 [main] DEBUG org.springframework.test.context.support.AbstractContextLoader - Did not detect default resource location for test class [isima.f2.TP3.Guilbert.ApplicationTests]: class path resource [isima/f2/TP3/Guilbert/ApplicationTestsContext.groovy] does not exist
Clément Guilbert's avatar
Clément Guilbert committed
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493

14:45:46.493 [main] INFO org.springframework.test.context.support.AbstractContextLoader - Could not detect default resource locations for test class [isima.f2.TP3.
Guilbert.ApplicationTests]: no resource found for suffixes {-context.xml, Context.groovy}.


14:45:46.493 [main] INFO org.springframework.test.context.support.AnnotationConfigContextLoaderUtils - Could not detect default configuration classes for test class 
[isima.f2.TP3.Guilbert.ApplicationTests]: ApplicationTests does not declare any static, non-private, non-final, nested classes annotated with @Configuration.

14:45:46.524 [main] DEBUG org.springframework.test.context.support.ActiveProfilesUtils - Could not find an 'annotation declaring class' for annotation type [org.
springframework.test.context.ActiveProfiles] and class [isima.f2.TP3.Guilbert.ApplicationTests]

14:45:46.588 [main] DEBUG org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider - Identified candidate component class: file 
[C:\Users\Clement\Desktop\Forges Logicielle\TP3\forges_logicielles_guilbert_tp3\TP3.Guilbert\target\classes\isima\f2\TP3\Guilbert\Application.class]

14:45:46.590 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Found @SpringBootConfiguration isima.f2.TP3.Guilbert.Application for 
test class isima.f2.TP3.Guilbert.ApplicationTests

14:45:46.679 [main] DEBUG org.springframework.boot.test.context.SpringBootTestContextBootstrapper - @TestExecutionListeners is not present for class [isima.f2.TP3.
Guilbert.ApplicationTests]: using defaults.

14:45:46.679 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Loaded default TestExecutionListener class names from location 
[META-INF/spring.factories]: [org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener, org.springframework.boot.test.mock.mockito.
ResetMocksTestExecutionListener, org.springframework.boot.test.autoconfigure.restdocs.RestDocsTestExecutionListener, org.springframework.boot.test.autoconfigure.web.
client.MockRestServiceServerResetTestExecutionListener, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcPrintOnlyOnFailureTestExecutionListener, org.
springframework.boot.test.autoconfigure.web.servlet.WebDriverTestExecutionListener, org.springframework.test.context.web.ServletTestExecutionListener, org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener, org.springframework.test.context.support.DependencyInjectionTestExecutionListener, org.springframework.test.context.support.DirtiesContextTestExecutionListener, org.springframework.test.context.transaction.TransactionalTestExecutionListener, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener, org.springframework.test.context.event.EventPublishingTestExecutionListener]

14:45:46.691 [main] DEBUG org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Skipping candidate TestExecutionListener [org.springframework.test.
context.web.ServletTestExecutionListener] due to a missing dependency. Specify custom listener classes or make the default listener classes and their required 
dependencies available. Offending class: [javax/servlet/ServletContext]

14:45:46.693 [main] DEBUG org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Skipping candidate TestExecutionListener [org.springframework.test.
context.transaction.TransactionalTestExecutionListener] due to a missing dependency. Specify custom listener classes or make the default listener classes and their 
required dependencies available. Offending class: [org/springframework/transaction/interceptor/TransactionAttributeSource]

14:45:46.694 [main] DEBUG org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Skipping candidate TestExecutionListener [org.springframework.test.
context.jdbc.SqlScriptsTestExecutionListener] due to a missing dependency. Specify custom listener classes or make the default listener classes and their required 
dependencies available. Offending class: [org/springframework/transaction/interceptor/TransactionAttribute]

14:45:46.694 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Using TestExecutionListeners: [org.springframework.test.context.
support.DirtiesContextBeforeModesTestExecutionListener@1b2abca6, org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener@6392827e, org.springframework.
boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener@2ed2d9cb, org.springframework.test.context.support.
DirtiesContextTestExecutionListener@d5b810e, org.springframework.test.context.event.EventPublishingTestExecutionListener@43dac38f, org.springframework.boot.test.mock.
mockito.ResetMocksTestExecutionListener@342c38f8, org.springframework.boot.test.autoconfigure.restdocs.RestDocsTestExecutionListener@c88a337, org.springframework.boot.
test.autoconfigure.web.client.MockRestServiceServerResetTestExecutionListener@5d0a1059, org.springframework.boot.test.autoconfigure.web.servlet.
MockMvcPrintOnlyOnFailureTestExecutionListener@485966cc, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverTestExecutionListener@1de76cc7]

14:45:46.700 [main] DEBUG org.springframework.test.context.support.AbstractDirtiesContextTestExecutionListener - Before test class: context [DefaultTestContext@4803b726 
testClass = ApplicationTests, testInstance = [null], testMethod = [null], testException = [null], mergedContextConfiguration = [MergedContextConfiguration@ffaa6af 
testClass = ApplicationTests, locations = '{}', classes = '{class isima.f2.TP3.Guilbert.Application}', contextInitializerClasses = '[]', activeProfiles = '{}', 
propertySourceLocations = '{}', propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true}', contextCustomizers = set[org.
springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@3e92efc3, org.springframework.boot.test.json.
DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@2e4b8173, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.
springframework.boot.test.web.client.TestRestTemplateContextCustomizer@31d7b7bf, org.springframework.boot.test.autoconfigure.properties.
PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@3427b02d], contextLoader = 'org.
springframework.boot.test.context.SpringBootContextLoader', parent = [null]], attributes = map[[empty]]], class annotated with @DirtiesContext [false] with mode [null].

14:45:46.716 [main] DEBUG org.springframework.test.context.support.DependencyInjectionTestExecutionListener - Performing dependency injection for test context [[DefaultTestContext@4803b726 testClass = ApplicationTests, testInstance = isima.f2.TP3.Guilbert.ApplicationTests@273e7444, testMethod = [null], testException = [null], 
mergedContextConfiguration = [MergedContextConfiguration@ffaa6af testClass = ApplicationTests, locations = '{}', classes = '{class isima.f2.TP3.Guilbert.Application}', 
contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{org.springframework.boot.test.context.
SpringBootTestContextBootstrapper=true}', contextCustomizers = set[org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@3e92efc3, org.
springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@2e4b8173, org.springframework.boot.test.mock.mockito.
MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@31d7b7bf, org.springframework.boot.test.autoconfigure.properties.
PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@3427b02d], contextLoader = 'org.
springframework.boot.test.context.SpringBootContextLoader', parent = [null]], attributes = map[[empty]]]].

14:45:46.744 [main] DEBUG org.springframework.test.context.support.TestPropertySourceUtils - Adding inlined properties to environment: {spring.jmx.enabled=false, org.
springframework.boot.test.context.SpringBootTestContextBootstrapper=true, server.port=-1}


Clément Guilbert's avatar
yaml    
Clément Guilbert committed
494
495
496
497
498
499
500
501
502

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.2.4.RELEASE)

Clément Guilbert's avatar
Clément Guilbert committed
503

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
504
2020-02-17 14:45:47.173  INFO 9952 --- [           main] isima.f2.TP3.Guilbert.ApplicationTests   : Starting ApplicationTests on DESKTOP-14G9Q7S with PID 9952 (started by Clement in C:\Users\Clement\Desktop\Forges Logicielle\TP3\forges_logicielles_guilbert_tp3\TP3.Guilbert)
Clément Guilbert's avatar
Clément Guilbert committed
505

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
506
2020-02-17 14:45:47.176  INFO 9952 --- [           main] isima.f2.TP3.Guilbert.ApplicationTests   : No active profile set, falling back to default profiles: default
Clément Guilbert's avatar
Clément Guilbert committed
507

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
508
2020-02-17 14:45:47.772  INFO 9952 --- [           main] isima.f2.TP3.Guilbert.ApplicationTests   : Started ApplicationTests in 1.023 seconds (JVM running for 2.271)
Clément Guilbert's avatar
Clément Guilbert committed
509

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
510
[INFO] Tests run: 17, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.729 s - in isima.f2.TP3.Guilbert.ApplicationTests
Clément Guilbert's avatar
Clément Guilbert committed
511

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
512
[INFO]
Clément Guilbert's avatar
Clément Guilbert committed
513

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
514
[INFO] Results:
Clément Guilbert's avatar
Clément Guilbert committed
515

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
516
[INFO]
Clément Guilbert's avatar
Clément Guilbert committed
517

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
518
[INFO] Tests run: 17, Failures: 0, Errors: 0, Skipped: 0
Clément Guilbert's avatar
Clément Guilbert committed
519

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
520
[INFO]
Clément Guilbert's avatar
Clément Guilbert committed
521

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
522
[INFO]
Clément Guilbert's avatar
Clément Guilbert committed
523

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
524
[INFO] --- maven-jar-plugin:3.1.2:jar (default-jar) @ TP3.Guilbert ---
Clément Guilbert's avatar
Clément Guilbert committed
525

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
526
[INFO] Building jar: C:\Users\Clement\Desktop\Forges Logicielle\TP3\forges_logicielles_guilbert_tp3\TP3.Guilbert\target\TP3.Guilbert-0.0.1-SNAPSHOT.jar
Clément Guilbert's avatar
Clément Guilbert committed
527

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
528
[INFO]
Clément Guilbert's avatar
Clément Guilbert committed
529

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
530
[INFO] --- spring-boot-maven-plugin:2.2.4.RELEASE:repackage (repackage) @ TP3.Guilbert ---
Clément Guilbert's avatar
Clément Guilbert committed
531

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
532
[INFO] Replacing main artifact with repackaged archive
Clément Guilbert's avatar
Clément Guilbert committed
533

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
534
[INFO] ------------------------------------------------------------------------
Clément Guilbert's avatar
Clément Guilbert committed
535

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
536
[INFO] BUILD SUCCESS
Clément Guilbert's avatar
Clément Guilbert committed
537

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
538
[INFO] ------------------------------------------------------------------------
Clément Guilbert's avatar
Clément Guilbert committed
539

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
540
[INFO] Total time:  6.996 s
Clément Guilbert's avatar
Clément Guilbert committed
541

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
542
[INFO] Finished at: 2020-02-17T14:45:50+01:00
Clément Guilbert's avatar
Clément Guilbert committed
543

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
544
545
[INFO] ------------------------------------------------------------------------

Clément Guilbert's avatar
Clément Guilbert committed
546
```   
clguilbert's avatar
clguilbert committed
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564

## 3 Intégration continue

Gitlab permet de faire de l'intégration continue sur votre code.
Nous allons mettre en place un job permettant de réaliser la compilation,les test et le packaging à chaque commit en utilisant [Gitlab CI](https://about.gitlab.com/features/gitlab-ci-cd/)

### 3.1 Mettre en place une intégration continue en utilisant gitlab-ci

Liens utiles:
* [Gitlab CI](https://docs.gitlab.com/ce/ci/yaml/README.html#gitlab-ci-yml)

Sur la page d'acceuil de votre projet, à coté du bouton pour ajouter une licence, il y a un acces rapide pour créer à partir d'un template un fichier `.gitlab-ci.yml`.
On utilisera un template maven pour initialiser le descriptif des actions à réaliser.

* Désormais dans la partie CI/CD de votre projet vous pouvez voir vos pipelines en cours d'éxécution ou passé et leurs status.
* Le yml par defaut devrait faire echouer votre pipeline.
* Quelles est l'erreur ?

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
565
`pas d'erreur`   
clguilbert's avatar
clguilbert committed
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609

* Le script template proposé par defaut est relativement complexe.
* Pour la suite nous utiliserons le template suivant :

```yaml
variables:
  # This will supress any download for dependencies and plugins or upload messages which would clutter the console log.
  # `showDateTime` will show the passed time in milliseconds. You need to specify `--batch-mode` to make this work.
  MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN -Dorg.slf4j.simpleLogger.showDateTime=true -Djava.awt.headless=true"
  # As of Maven 3.3.0 instead of this you may define these options in `.mvn/maven.config` so the same config is used
  # when running from the command line.
  # `installAtEnd` and `deployAtEnd` are only effective with recent version of the corresponding plugins.
  MAVEN_CLI_OPTS: "--batch-mode --errors --fail-at-end --show-version -DinstallAtEnd=true -DdeployAtEnd=true"

# Cache downloaded dependencies and plugins between builds.
# To keep cache across branches add 'key: "$CI_JOB_REF_NAME"'
cache:
  paths:
    - .m2/repository

#Definition des différentes étapes présent dans le pipeline
stages:
  - build
  - test

#Définition du job de compilation
compilation:
  image: maven:3.3.9-jdk-8
  stage: build
  script:
    - echo "A Completer";exit 1


validation:
  image: maven:3.3.9-jdk-8
  stage: test
  script:
      - echo "A Completer";exit 1
```

* Remplacez le `.gitlab-ci.yml` par celui-ci et completez le avec les commandes maven précédement utilisées pour réaliser la phase de build et de test

* Completez le `.gitlab-ci.yml` pour inclure un nouveau stage de packaging qui vas construire le jar de votre application

Clément Guilbert's avatar
yaml    
Clément Guilbert committed
610
611
612
613
614
615
616
617
618
619
620
621
```yaml
#Definition des différentes étapes présent dans le pipeline
stages:
  - build
  - test
  - deploy

#Définition du job de compilation
compilation:
  image: maven:3.3.9-jdk-8
  stage: build
  script:
Clément Guilbert's avatar
Clément Guilbert committed
622
    TP3.Guilbert/mvnw compile
Clément Guilbert's avatar
yaml    
Clément Guilbert committed
623
624
625
626
627
628


validation:
  image: maven:3.3.9-jdk-8
  stage: test
  script:
Clément Guilbert's avatar
Clément Guilbert committed
629
      TP3.Guilbert/mvnw test
Clément Guilbert's avatar
yaml    
Clément Guilbert committed
630
631
632
      
deploy:
  image: maven:3.3.9-jdk-8
clguilbert's avatar
clguilbert committed
633
  stage: deploy
Clément Guilbert's avatar
yaml    
Clément Guilbert committed
634
  script:
Clément Guilbert's avatar
Clément Guilbert committed
635
      TP3.Guilbert/mvnw package
Clément Guilbert's avatar
yaml    
Clément Guilbert committed
636
637

```   
clguilbert's avatar
clguilbert committed
638
639
640
641
642
643
644

#### 3.1.1 Badge

**Gilab** permet d'afficher dans votre readme le status de votre pipeline dynamiquement pour celà :
* Rendez vous dans la partie [Settings > CI/CD > General pipelines settings](https://docs.gitlab.com/ee/user/project/pipelines/settings.html) de votre projet. A l'aide de la documentation sur les [badges](https://docs.gitlab.com/ee/user/project/pipelines/settings.html#badges)
rajoutez un bdage indiquant le status de votre pipeline de build dans votre readme.

Clément Guilbert's avatar
Clément Guilbert committed
645
646
647
648
[![pipeline status](http://gitlab.isima.fr/clguilbert/forges_logicielles_guilbert_tp3/badges/master/pipeline.svg)](http://gitlab.isima.fr/clguilbert/forges_logicielles_guilbert_tp3/commits/master)

##### Problème avec l'ajout de badge : url du pipeline ajoutée et image générée sur shields.io mais ajout non validé sans message d'erreur

clguilbert's avatar
clguilbert committed
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
### 3.2 Couverture de code

Nous allons ajouter un outil permettant de réaliser des statistiques sur la qualité des tests. Il sagit ici de [jacoco](http://www.eclemma.org/jacoco/) une librairie permettant de réaliser des statistiques sur le taux de couverture de code par les tests unitaires.

* Ce plugin lors de la compilation vas modifier votre code pour injecter du code permettant de savoir quelles lignes sont exécutées ou non.
    * Pour ce faire il faut rajouter dans votre **pom.xml**, dans la partie *build/pulgins*, la déclaration suivante :

```xml
<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.0</version>
    <executions>
        <execution>
            <id>default-prepare-agent</id>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
        </execution>
    </executions>
</plugin>
```

* Nous allons rajouter au readme du projet un badge indiquant le % de code couvert.
    * Sur gitlab, dans les settings de la partie CI/CD dans General pipeline settings, vous trouverez une zone de saisie pour **Test coverage parsing**.
En effet il est nécessaire d'indiquer à **Gitlab CI** où trouver l'information sur le pourcentage de code couvert : `A regular expression that will be used to find the test coverage output in the job trace.`
    * Cette information se trouve dans le rapport généré par jacoco. Par defaut le rapport n'est pas généré. Il faut donc modifier le paramètrage du plugin pour lui demander de générer le rapport.
Dans le code suivant on indique au plugin qu'il doit exécuter sa tache **report** lorsque de la phase **test** de maven.   

```xml
<execution>
    <id>default-report</id>
    <phase>test</phase>
    <goals>
        <goal>report</goal>
    </goals>
</execution>
```

* Le rapport est généré dans le repertoire target/site/jacoco sous la forme d'un fichier html.
    * Il faut dans la partie settings de votre CI indiquer l'expression réguliére permettant de retrouver le % de code couvert. Utilisez `Total.*?([0-9]{1,3})%`.
Clément Guilbert's avatar
Clément Guilbert committed
690
691
692
693
694
    

[![coverage report](http://gitlab.isima.fr/clguilbert/forges_logicielles_guilbert_tp3/badges/master/coverage.svg)](http://gitlab.isima.fr/clguilbert/forges_logicielles_guilbert_tp3/commits/master)


clguilbert's avatar
clguilbert committed
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
    * Ajoutez à votre `.gitlab-ci.yml` la commande permettant de faire apparaitre le contenu de ce fichier dans la log de votre job.

`Comment affichez vous l'information dans la log du job ?`

* Rajoutez en début de votre readme le badge indiquant le pourcentage de couverture de code.

### 3.3 Analyse de code avec Sonar
Nous allons mettre en place à chaque éxécution de notre pipeline une analyse sonar.

Le serveur sonar à utiliser se trouve à l'adresse suivante : [ISIMA Sonar](http://isima.westeurope.cloudapp.azure.com:9000)

Le compte permettant d'acceder à l'application est `isima`, le mot de passe `ISIMAF2`.

* à la suite de la phase de test ajoutez dans votre job une analyse Sonar.
* Pour exécuter une analyse sonar il suffit de lancer la commande :

```
mvn sonar:sonar -Dsonar.host.url=http://isima.westeurope.cloudapp.azure.com:9000 -Dsonar.login=TOKEN
```

* Le token pour le user `isima` est `f0bc5970454083e4c7c78b5b15d27744ada8220d`.
* Une fois la première analyse lancée, rendez vous sur l'application pour constater quels sont les anomalies détectées et les indicateurs de qualimétrie de votre code.
* Corrigez votre code en conséquence pour obtenir la meilleur note possible.
* Il est possible de spécifier directement dans le pom.xml l'adresse du serveur cible
    * pour ce faire on ajoutera dans la balise properties une entrée tel que :

    ```xml
    <sonar.host.url>http://isima.westeurope.cloudapp.azure.com:9000</sonar.host.url>
    ```
    * on peux alors appeler directement `mvn sonar:sonar -Dsonar.login=TOKEN` l'URL du serveur est prise dans les properties de votre projet maven

* Pour le login il est possible de faire de même, mais en terme de sécurité ce n'est pas une bonne idée d'indiquer le token d'acces dans vos sources
    * Gitlab-ci permet d'injecter de manière caché certaines propriétés [secret variables](https://gitlab.isima.fr/help/ci/variables/README#secret-variables)
    * Définissez une variable secrete contenant le login et utilisez la dans votre .gitlab-ci.yml