Guide Robot Framework — PerfShop¶
Ce guide vous apprend à écrire des scripts Robot Framework pour tester PerfShop dans le contexte de la stack QA pédagogique (Squash TM + Orchestrateur + Test Runner).
Infrastructure disponible¶
Votre script est exécuté sur le container perfshop-test-runner par l'orchestrateur Squash.
Ce container dispose des outils suivants :
Bibliothèques Robot Framework installées¶
| Bibliothèque | Usage |
|---|---|
RequestsLibrary |
Tests API HTTP |
SeleniumLibrary |
Tests navigateur (Chrome) |
JsonLibrary |
Manipulation JSON |
Collections |
Manipulation de listes/dicts |
OperatingSystem |
Lecture de fichiers, variables env |
BuiltIn |
Keywords natifs RF (toujours disponible) |
Outils système disponibles¶
| Outil | Version |
|---|---|
| Python | 3.11 |
| robot | 7.0 |
| pytest | 8.0 |
| git | installé (clone auto par l'orchestrateur) |
| Chrome | via Selenium Grid (perfshop-selenium) |
URLs disponibles dans vos scripts¶
Les URLs sont disponibles via les variables d'environnement du container. Vous pouvez les coder en dur — c'est tout à fait correct pour débuter.
URLs recommandées¶
| Cible | URL interne Docker | URL publique (prod NAS) |
|---|---|---|
| API backend | http://perfshop-app:8080 |
https://perfshop-api.perfshop.io |
| Frontend | http://perfshop-frontend |
https://perfshop.perfshop.io |
| Selenium Grid | http://perfshop-selenium:4444/wd/hub |
— (interne uniquement) |
💡 En local (Docker Desktop), utilisez les URLs internes Docker. En prod NAS, le formateur configure les URLs publiques automatiquement.
Lire l'URL depuis l'environnement (optionnel, avancé)¶
*** Test Cases ***
Mon Test
${api_url}= Evaluate os.environ.get('PUBLIC_API_URL', 'http://perfshop-app:8080') modules=os
Log URL API : ${api_url}
Structure minimale d'un script¶
*** Settings ***
Library RequestsLibrary
*** Variables ***
${API_URL} http://perfshop-app:8080
*** Test Cases ***
Mon premier test PerfShop
[Documentation] Description du test
[Tags] smoke api
Create Session perfshop ${API_URL}
${resp}= GET On Session perfshop url=/api/products params=page=0&size=5
Should Be Equal As Integers ${resp.status_code} 200
Log Réponse : ${resp.text}
Exemples de tests API¶
Vérifier que l'API répond¶
*** Settings ***
Library RequestsLibrary
*** Variables ***
${API_URL} http://perfshop-app:8080
*** Test Cases ***
CT-API-01 API produits repond
[Tags] smoke api
Create Session perfshop ${API_URL}
${resp}= GET On Session perfshop url=/api/products params=page=0&size=1
Should Be Equal As Integers ${resp.status_code} 200
${body}= Convert To String ${resp.content}
Should Contain ${body} price
Tester l'authentification¶
*** Settings ***
Library RequestsLibrary
Library Collections
*** Variables ***
${API_URL} http://perfshop-app:8080
${USER_EMAIL} user1@perfshop.com
${USER_PASS} password1
*** Test Cases ***
CT-AUTH-01 Login utilisateur
[Tags] auth
Create Session perfshop ${API_URL}
${payload}= Create Dictionary email=${USER_EMAIL} password=${USER_PASS}
${resp}= POST On Session perfshop url=/api/auth/login json=${payload}
Should Be Equal As Integers ${resp.status_code} 200
${body}= Set Variable ${resp.json()}
Should Be True ${body}[success]
Log Login OK pour ${USER_EMAIL}
Tester l'ajout au panier¶
*** Settings ***
Library RequestsLibrary
Library Collections
*** Variables ***
${API_URL} http://perfshop-app:8080
${USER_EMAIL} user1@perfshop.com
${USER_PASS} password1
*** Test Cases ***
CT-PANIER-01 Ajouter produit au panier
[Tags] panier fonctionnel
Create Session perfshop ${API_URL}
# Login
${creds}= Create Dictionary email=${USER_EMAIL} password=${USER_PASS}
${login}= POST On Session perfshop url=/api/auth/login json=${creds}
Should Be Equal As Integers ${login.status_code} 200
# Ajouter au panier (pas d authentification requise)
${item}= Create Dictionary productId=${1} quantity=${1}
${resp}= POST On Session perfshop url=/api/cart/add json=${item}
Should Be Equal As Integers ${resp.status_code} 200
Log Produit ajouté au panier
Vérifier un prix spécifique¶
*** Settings ***
Library RequestsLibrary
*** Variables ***
${API_URL} http://perfshop-app:8080
*** Test Cases ***
CT-PRIX-01 Prix produit 1 coherent
[Tags] prix regression
Create Session api ${API_URL}
${resp}= GET On Session api url=/api/products/1
Should Be Equal As Integers ${resp.status_code} 200
${product}= Set Variable ${resp.json()}
Should Be True ${product}[price] > 0
Log Prix du produit 1 : ${product}[price] €
Exemples de tests Selenium (navigateur)¶
⚠️ Les tests Selenium nécessitent que le container
perfshop-seleniumsoit démarré. Le formateur s'en charge — vous n'avez rien à configurer.
Ouvrir la page produits et vérifier le chargement¶
*** Settings ***
Library SeleniumLibrary
*** Variables ***
${SELENIUM_URL} http://perfshop-selenium:4444/wd/hub
${FRONTEND_URL} http://perfshop-frontend
*** Test Cases ***
CT-UI-01 Page produits charge correctement
[Tags] ui selenium
Open Browser ${FRONTEND_URL}/products browser=chrome
... remote_url=${SELENIUM_URL}
... options=add_argument("--no-sandbox");add_argument("--disable-dev-shm-usage")
Wait Until Page Contains Catalogue Produits timeout=15s
Page Should Contain produit
Close All Browsers
Se connecter via l interface¶
*** Settings ***
Library SeleniumLibrary
*** Variables ***
${SELENIUM_URL} http://perfshop-selenium:4444/wd/hub
${FRONTEND_URL} http://perfshop-frontend
*** Test Cases ***
CT-UI-02 Connexion utilisateur
[Tags] ui auth
Open Browser ${FRONTEND_URL}/login browser=chrome
... remote_url=${SELENIUM_URL}
... options=add_argument("--no-sandbox");add_argument("--disable-dev-shm-usage")
Input Text css:input[type="email"] user1@perfshop.com
Input Text css:input[type="password"] password1
Click Button css:button[type="submit"]
Wait Until Page Contains Catalogue timeout=10s
Close All Browsers
Prérequis à connaître pour PerfShop¶
1. Le Selenium Grid est interne¶
Le navigateur Chrome tourne dans le container perfshop-selenium, pas sur votre machine.
→ Toujours utiliser remote_url=http://perfshop-selenium:4444/wd/hub
2. Le frontend est une SPA React¶
La page React charge les données après le rendu initial.
→ Toujours utiliser Wait Until Element Is Visible ou Wait Until Page Contains
→ Ne jamais utiliser Get Text immédiatement après Open Browser
# Mauvais — trop rapide
Open Browser ${FRONTEND_URL}/products browser=chrome remote_url=${SELENIUM_URL}
${text}= Get Text css:.product-card # FAIL : pas encore chargé
# Correct
Open Browser ${FRONTEND_URL}/products browser=chrome remote_url=${SELENIUM_URL}
Wait Until Page Contains Catalogue Produits timeout=15s
Sleep 1s # laisser React finir de rendre
${text}= Get Text css:.product-name
3. Le panier est en mémoire React¶
Le panier PerfShop est un state React local (pas de localStorage).
→ Si vous naviguez avec Go To (rechargement de page), le panier se vide
→ Utiliser le lien navbar React pour conserver le panier
# Mauvais — recharge l app React et vide le panier
Go To ${FRONTEND_URL}/cart
# Correct — navigation SPA (préserve le state React)
Click Element xpath=//a[contains(text(),'Panier')]
4. L'API panier ne nécessite pas d'authentification¶
5. Comptes de test disponibles¶
| Mot de passe | |
|---|---|
user1@perfshop.com |
password1 |
user2@perfshop.com |
password2 |
| ... | ... |
user10@perfshop.com |
password10 |
perf.test1@perfshop.com |
TestPerf123! |
Déposer et exécuter votre script¶
Option 1 — Via Filebrowser (recommandé)¶
- Ouvrir Filebrowser (URL fournie par le formateur)
- Déposer votre fichier
.robotdans le dossier/scripts - Dans Squash TM → créer un cas de test avec la référence
perfshop-tests/votre-script.robot
Option 2 — Via Git¶
- Cloner le dépôt
perfshop-testsdepuis le GitLab PerfShop - Ajouter votre script dans le dossier racine
- Committer et pousser sur la branche
main - Squash TM récupérera automatiquement le nouveau script
Option 3 — Test direct (sans Squash TM)¶
Depuis le NAS ou en SSH sur le formateur :
Nomenclature recommandée¶
| Élément | Convention | Exemple |
|---|---|---|
| Fichier | CT-XXX-nom-court.robot |
CT-003-auth-login.robot |
| Nom du test | Description en clair | CT-003 Authentification utilisateur |
| Tags | minuscules, sans espace | smoke, api, ui, auth, panier |
| Variables | MAJUSCULES | ${API_URL}, ${TIMEOUT} |
| Keywords custom | Verbe + Nom | Verifier Prix Produit, Se Connecter |
Erreurs fréquentes¶
Element not found after Xs¶
L'élément n'est pas encore visible — React charge les données en asynchrone.
→ Augmenter le timeout : Wait Until Element Is Visible css:.mon-element timeout=20s
Connection refused sur l'API¶
L'URL de l'API est incorrecte ou le container perfshop-app n'est pas démarré.
→ Vérifier avec le formateur que les containers sont up
Session does not exist¶
Le navigateur Chrome a crashé ou la session Selenium a expiré.
→ Toujours utiliser [Teardown] Close All Browsers dans vos tests
StaleElementReferenceException¶
React a re-rendu le DOM entre deux actions Selenium.
→ Ajouter Sleep 1s ou re-récupérer l'élément après chaque action lente
Template complet prêt à l'emploi¶
*** Settings ***
# Mon test PerfShop
# Reference Squash TM : perfshop-tests/CT-XXX-mon-test.robot
Library RequestsLibrary
Library Collections
*** Variables ***
${API_URL} http://perfshop-app:8080
*** Test Cases ***
CT-XXX Mon test
[Documentation] Description de ce que teste ce script
[Tags] mon-tag api
# Etape 1 - preparation
Create Session perfshop ${API_URL}
# Etape 2 - action
${resp}= GET On Session perfshop url=/api/products params=page=0&size=1
# Etape 3 - verification
Should Be Equal As Integers ${resp.status_code} 200
Log Test OK
Ressources¶
- Documentation Robot Framework officielle
- RequestsLibrary
- SeleniumLibrary
- Dépôt des scripts :
https://perfshop-gitlab.perfshop.io/perf/perfshop-tests