-
Notifications
You must be signed in to change notification settings - Fork 2
Tests de l'application
[Méthodologie globale, liste des types de test (unitaire, intégration, ...), et pour chacun, quelle technologie de test a été utilisée + justification]
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:
Cette article de Sebastián Pérez Etchandy nous a servi de base pour la mise en place de ceux-ci.
- 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.
Comme repris tout en haut la base de données de test est popularisé bien avant le lancement donc:
- 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);
});
});- 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);
});
});- 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/adminscette 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é",
});
});
});- 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", } |
[Analyse de la qualité de la validation du projet]
[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]
Test de la route POST http://localhost:3001/api/cars:
Test de la route POST http://localhost:3001/api/car/1/images:
[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 } |
[Bilan personnel de la réalisation des tests de l'US implémentée. ] [Lien vers le code de test produit par l'étudiant]
Test de la route GET http://localhost:3001/api/cars:
[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" } } ] |
[Bilan personnel de la réalisation des tests de l'US implémentée. ] [Lien vers le code de test produit par l'étudiant]
[Tableau de valeurs input/output utilisés pour chaque test]
[Bilan personnel de la réalisation des tests de l'US implémentée. ] [Lien vers le code de test produit par l'étudiant]
Test de la route GET http://localhost:3001/api/orders
[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", } |