Skip to content

Tests de l'application

Patson edited this page May 4, 2022 · 46 revisions

Présentation globale des tests

[Méthodologie globale, liste des types de test (unitaire, intégration, ...), et pour chacun, quelle technologie de test a été utilisée + justification]

Tests unitaires : Bilan

Nombre de test

Choix des valeur d'input

Tableaux input/oput utilisés pour la construction des tests

Couverture des tests

Lien vers le code des tests en question

Tests d'intégration : Bilan

Nombre de test

Nous disposons pour l'instant de 22 tests d'intégration pour les différentes routes en backend : /api/users, /api/orders , /api/cars. Les tests sont répertoriés dans le dossier test qui se trouve dans le dossier backend.

Les tests s'effectue de la façon suivante:

  1. Nous rédigeons tout d'abord les tests a l'aide des modules Mochajs, chai et supertest.

Cette article de Sebastián Pérez Etchandy nous a servi de base pour la mise en place de ceux-ci.

  1. Dans un fichier .yml nous créons un base de données de test à chaque fois que l'on lance la commande npm run test,

Grâce au seeders on insère des données temporaires à l'intérieur de celle-ci. ces données seront utilisés pour effectuer certains tests qui nécessitent des données au préalale.

Choix des valeurs d'input

Comme repris tout en haut la base de données de test est popularisé bien avant le lancement donc:

  1. Nous vérifions les requêtes GET sur base des données que contient déjà la base de données de test mais aussi des données que l'on insère lors des tests
  • Exemple : Pour une requête sur la route GET /api/cars

On va s'assurer que notre reponse contient bien l'objet shouldGetCars qui est déjà au préalable dans le db de test

const shouldGetCars = {
	id: 3,
	name: "okooo",
	price: 500,
	brand_id: 2,
	color: "okooo",
	doors: 5,
	boot_size: 140,
	type: "okooo",
	energy: "okooo",
	is_automatic: true,
	air_conditioning: true,
	is_available: true,
	passengers: 5,
	description: "okooo",
	number_plate: null,
	year: null,
	mileage: null,
	cars_brands: { id: 2, brand: "mercedes", model: "1996" },
};

describe("GET /api/cars/images", async () => {
	it("Should return all cars images", async () => {
		const response = await request(server).get(`/api/cars/images`);
		expect(response.status).to.equal(200);
		expect(response.body).to.deep.include(shouldGetCarsImages);
	});
});
  1. pour une requête GET qui nécessite des paramètres on s'assure que les paramètres qu'on passe correspond bien à ce que doit recevoir le controlleur qui effectue la requête dans le code.
  • Exemple : Un requête de filtre vers la route /api/orders ou la on à choisis des valeurs d'input en fonction de ce que contient déjà la base de données
describe("GET /api/orders", async () => {
       it("Should return orders filter on date", async () => {
		//Try to insert parameters
		const shouldFilterOrders = {
			startDate: "2022-04-30",
			startTime: "12:00",
			endDate: "2022-05-10",
			endTime: "08:00",
		};
		const response = await request(server)
			.get("/api/orders/")
			.query(shouldFilterOrders);
		expect(response.status).to.equal(200);
		expect(response.body.orders).to.deep.include(shouldGetOrders1);
	});
});
  1. Nous vérifions des requêtes POST en envoyant dans le corps de la requête les éléments dont chaque controlleurs à besoin soit pour bien effectué une insertion soit pour retourner une erreur bien précise
  • Exemple : Une requête pour insérer un administrateur dans la base de données sur la route /api/admins cette route nécessite non seulement la présence d'un admin dans la db de test mais aussi que l'utilisateur en question soit dans la table des utilisateurs
describe("POST /api/admins", async () => {
	it("Should add admin", async () => {
		const response = await request(server)
			.post("/api/admins")
			.send({
				emailAdmin: "test.toto@gmail.com",
				emailUser: "test.titi@gmail.com",
				passwordAdmin: "Toto1234",
			})
			.set(
				"Authorization",
				`Bearer ${jwt.sign(
					{ user: "test.toto@gmail.com" },
					"SHORT_HASH_PHRASE",
					{
						expiresIn: "24h",
					}
				)}`
			);
		expect(response.status).to.equal(200);
		expect(response.body).to.deep.include({
			result: "Le nouvel administrateur à bien été enregistré",
		});
	});
});

les tableaux input/output utilisés pour construire les tests

  1. GET /api/cars
Input data Output status Output data
startDate: "2022-04-30",
startTime: "12:00",
endDate: "2022-05-10",
endTime: "08:00"
200 {
id: 1,
car_id: 1,
user_id: 1,
date_order: "2022-04-30T12:00:00.000Z",
departure_date: "2022-05-05T13:00:00.000Z",
return_date: "2022-05-10T08:00:00.000Z",
total_price: 800
};
startDate: "",
startTime: "12:00",
endDate: "2022-05-10",
endTime: "08:00"
500 { message: "Internal server error", }

Tests end-to-end : Bilan

Bilan général des tests

[Analyse de la qualité de la validation du projet]

Tests individuels

Michaël - US02 Ajouter des voitures

[Bilan personnel de la réalisation des tests de l'US implémentée. ]

Pour l'API et ses routes, nous avons utilisé Postman pour les tester. En testant les différentes routes, j'essaye de couvrir le plus de cas possible. La route http://localhost:3001/api/cars présente un cas plus particulier car il faut aussi vérifier les données quelle renvoie.

[Lien vers le code de test produit par l'étudiant]

Tests effectués

Test de la route POST http://localhost:3001/api/cars:

Lien du test sur Postman

Test de la route POST http://localhost:3001/api/car/1/images:

Lien du test sur Postman

[Tableau de valeurs input/output utilisés pour chaque test]

[Tableau de valeurs input/output utilisés pour chaque test]

Input data Output status Output data
{ "brand": "Renault", "model": "Clio", "year": "2015", "price": "12000", "description": "Coupe", "color": "Blanc", "seats": "5", "doors": "5", "transmission": "Manuelle", "fuel": "Essence", "mileage": "100", "available": "true", "location": "Paris", "images": [ "https://www.renault.fr/medias/sys_master/root/h1b/h1c/h00/1089724681849/renault-clio-2015-blanc-1-1.jpg", "https://www.renault.fr/medias/sys_master/root/h1b/h1c/h00/1089724681849/renault-clio-2015-blanc-1-1.jpg" ] } 201 { "id": 20 }

Rachid US-01 Afficher les voitures

[Bilan personnel de la réalisation des tests de l'US implémentée. ] [Lien vers le code de test produit par l'étudiant]

Tests effectués

Test de la route GET http://localhost:3001/api/cars:

Lien du test sur Postman

[Tableau de valeurs input/output utilisés pour chaque test]

Input data Output status Output data
/ 200 [ { "id": 2, "name": "RS3_Gris-Nardo", "price": 100, "brand_id": 2, "color": "Gris Nardo", "doors": 5, "boot_size": 143, "type": "Sportive", "energy": "Essence", "is_automatic": true, "air_conditioning": true, "is_available": true, "passengers": 5, "description": "hello", "number_plate": null, "year": null, "mileage": null, "cars_brands": { "id": 2, "brand": "Audi", "model": "RS 3" } }, { "id": 1, "name": "test50", "price": 50, "brand_id": 7, "color": "test50", "doors": 5, "boot_size": 50, "type": "test50", "energy": "test50", "is_automatic": true, "air_conditioning": true, "is_available": true, "passengers": 5, "description": "testsss50", "number_plate": null, "year": null, "mileage": null, "cars_brands": { "id": 7, "brand": "test50", "model": "test50" } } ]

Aymar US06 Choisir la marque de la voiture

[Bilan personnel de la réalisation des tests de l'US implémentée. ] [Lien vers le code de test produit par l'étudiant]

Tests effectués

[Tableau de valeurs input/output utilisés pour chaque test]

Patson US05 Choisir la plage horaire de location

[Bilan personnel de la réalisation des tests de l'US implémentée. ] [Lien vers le code de test produit par l'étudiant]

Tests effectués

Test de la route GET http://localhost:3001/api/orders

Lien du test sur Postman

[Tableau de valeurs input/output utilisés pour chaque test]

Input data Output status Output data
startDate: "2022-04-30",
startTime: "12:00",
endDate: "2022-05-10",
endTime: "08:00"
200 {
name: "okooo",
price: 500,
brand: "mercedes",
model: "1996",
color: "okooo",
doors: 5,
bootSize: 140,
type: "okooo",
energy: "okooo",
isAutomatic: true,
isAvailable: true,
passengers: 5,
airConditioning: true,description: "okooo"
};
startDate: "",
startTime: "12:00",
endDate: "2022-05-10",
endTime: "08:00"
500 { message: "Internal server error", }

Clone this wiki locally