Skip to content

kyzer-android/WebApplicationTestAutomationTool

Repository files navigation

CautioNet Test Automation — Guide Développeur

Guide complet pour créer, maintenir et étendre les tests Playwright pour CautioNet.


🏗️ Architecture du projet

Packages et responsabilités

src/main/java/com/runner/
├── config/               # Configuration et initialisation
│   ├── ConfigManager           → Détection environnement (local/serveur)
│   ├── DataSourceReader        → Lecture CSV de données de test
│   ├── PlayWrigthConnection    → Initialisation Playwright/Browser
│   └── AllureBrowserListener   → Listeners Allure pour rapports
│
├── runner/               # Point d'entrée et orchestration
│   ├── TestRunnerApp           → Application Spring Boot
│   ├── controller/             → API REST pour interface web
│   │   ├── TestController      → POST /api/tests/run
│   │   ├── SuiteController     → GET /api/suites
│   │   ├── CsvController       → Gestion fichiers CSV
│   │   ├── BrowserController   → Navigateurs disponibles
│   │   └── ServerController    → Info serveur
│   ├── service/                → Logique métier
│   │   ├── TestRunnerService   → Exécution Maven/TestNG
│   │   ├── SuiteService        → Gestion suites (suites.json)
│   │   ├── CsvService          → Traitement CSV
│   │   ├── DataSourceSyncService → Sync données
│   │   ├── BrowserService      → Liste des browsers
│   │   └── ServerService       → Infos serveur
│   └── report/                 → Génération rapports
│       ├── ReportService       → Allure report
│       └── ReportController    → API rapports

src/main/java/com/testScenario/
├── pages/                # Page Object Model (POM)
│   ├── StandardPage         → Classe mère (Playwright init + utils)
│   ├── LoginPage            → Page login (sélecteurs + actions)
│   ├── TestCautionPage      → Page test caution
│   └── ToduplicatePage      → Page à dupliquer (template)
│
└── tests/                # Suites de tests TestNG
    ├── LoginTest            → @BeforeClass, @Test, @AfterClass
    ├── TestCautionTest      → Scénarios caution
    └── Toduplicate          → Template pour nouveau test

✍️ Créer un nouveau test

1. Créer une page (Page Object)

Fichier : src/main/java/com/testScenario/pages/MyPage.java

package com.testScenario.pages;

import com.runner.config.ConfigManager;
import com.microsoft.playwright.Page;
import com.microsoft.playwright.options.AriaRole;

public class MyPage extends StandardPage {

    // Sélecteurs
    private static final String BTN_LOGIN = "button:has-text('Login')";
    private static final String INPUT_EMAIL = "#email";
    private static final String ALERT_ERROR = ".alert-error";

    public MyPage(Page page) {
        super(page);
    }

    // Actions
    public void fillEmail(String email) {
        page.fill(INPUT_EMAIL, email);
    }

    public void clickLogin() {
        page.click(BTN_LOGIN);
    }

    public boolean isErrorDisplayed() {
        return page.locator(ALERT_ERROR).isVisible();
    }

    // Navigation
    public void navigateTo() {
        page.navigate(ConfigManager.getBaseUrl() + "/my-page");
    }
}

2. Créer une suite de tests

Fichier : src/main/java/com/testScenario/tests/MyTest.java

package com.testScenario.tests;

import com.runner.config.ConfigManager;
import com.runner.config.DataSourceReader;
import com.testScenario.pages.MyPage;
import com.microsoft.playwright.*;
import io.qameta.allure.*;
import org.testng.Assert;
import org.testng.annotations.*;

import java.util.Map;

@Feature("My Feature")
public class MyTest {

    protected Playwright playwright;
    protected Browser browser;
    protected BrowserContext context;
    protected Page page;
    private MyPage myPage;

    @BeforeClass
    public void setUp() {
        playwright = Playwright.create();
        
        String browserType = System.getProperty("browser", "chromium");
        browser = playwright.chromium().launch(
            new BrowserType.LaunchOptions().setHeadless(true)
        );
        
        context = browser.newContext();
        page = context.newPage();
        myPage = new MyPage(page);
    }

    @AfterClass
    public void tearDown() {
        if (context != null) context.close();
        if (browser != null) browser.close();
        if (playwright != null) playwright.close();
    }

    @Test(dataProvider = "userData")
    @Story("User can login")
    @Description("Test login with valid credentials")
    public void testLoginSuccess(Map<String, String> data) {
        myPage.navigateTo();
        myPage.fillEmail(data.get("email"));
        myPage.fillPassword(data.get("password"));
        myPage.clickLogin();
        
        Assert.assertTrue(myPage.isDashboardVisible(), "Dashboard should be visible");
    }

    @DataProvider(name = "userData")
    public Object[][] getUserData() {
        return DataSourceReader.readCsv("login_test.csv");
    }
}

📝 Format des données CSV

Exemple : login_test.csv

email,password,expected_role
admin@example.com,SecurePass123,ADMIN
user@example.com,UserPass456,USER
test@example.com,TestPass789,GUEST

Lecture dans le test :

@DataProvider(name = "testData")
public Object[][] getTestData() {
    return DataSourceReader.readCsv("login_test.csv");
}

@Test(dataProvider = "testData")
public void testWithData(Map<String, String> row) {
    String email = row.get("email");
    String password = row.get("password");
    // ...
}

🧪 Exécuter les tests

En local

# Via interface web
http://localhost:8080

# Via ligne de commande
mvn clean test -Denv=local -DsuiteFile=testng-cautionet.xml

# Avec paramètres spécifiques
mvn clean test \
  -Denv=local \
  -Dbrowser=firefox \
  -DbaseUrl=https://staging.example.com \
  -Dlogback.level=DEBUG

Sur serveur WebLogic

# Maven compile et génère le WAR
mvn clean package -Pserveur

# Déployer le WAR dans WebLogic
# (procédure WebLogic standard)

📋 Configuration de suites (suites.json)

Fichier : src/main/resources/serviceRessource/suites.json

{
  "suites": [
    {
      "name": "Login Tests",
      "file": "testng-cautionet.xml",
      "description": "Tests d'authentification",
      "tags": ["login", "auth", "smoke"]
    },
    {
      "name": "Caution Tests",
      "file": "testng-caution-advanced.xml",
      "description": "Scénarios caution complets",
      "tags": ["caution", "workflow", "e2e"]
    }
  ]
}

🔄 Cycle de vie du test

1. @BeforeClass (Une seule fois par classe)

  • Initialise Playwright, Browser, Context, Page
  • Crée les objets Page (POM)
  • Appelé avant tous les tests de la classe

2. @DataProvider (Pour chaque ligne de donnée)

  • Lit les données du CSV
  • Crée un Map<String, String> pour chaque ligne

3. @Test (Une fois par donnée)

  • Exécute le scénario avec les données
  • Enregistre logs + captures Allure

4. @AfterClass (Une seule fois par classe)

  • Ferme Page, Context, Browser, Playwright
  • Génère le rapport Allure

🎯 Bonnes pratiques

✅ À faire

// 1. Utiliser le Page Object Model
public class LoginPage extends StandardPage {
    private static final String BTN_SUBMIT = "button:has-text('Login')";
    
    public void clickSubmit() {
        page.click(BTN_SUBMIT);
    }
}

// 2. Externaliser les données en CSV
@DataProvider
public Object[][] getData() {
    return DataSourceReader.readCsv("test-data.csv");
}

// 3. Utiliser Allure pour annotations
@Feature("Authentication")
@Story("User Login")
@Description("Verify valid login works")
public void testLogin() { }

// 4. Attendre les éléments de manière robuste
page.locator(".modal").waitFor();

// 5. Utiliser ConfigManager pour les URLs
String url = ConfigManager.getBaseUrl() + "/path";

❌ À éviter

// ❌ Hardcoder les URLs
page.navigate("https://example.com/login");

// ❌ Chemins absolus des données
String csv = "C:/Users/Alice/data.csv";  // Ne marche que sur ce PC

// ❌ Délais fixes
Thread.sleep(2000);  // Utiliser waitFor() à la place

// ❌ Sélecteurs fragiles
page.click("div > div > span:nth-child(3)");  // Utiliser data-testid

// ❌ Tests indépendants du contexte
// Les fichiers de données CSV doivent être versionnés

🐛 Débogage

Activer les logs DEBUG

mvn test -Dlogback.level=DEBUG

Ou dans logback-spring.xml :

<logger name="com.runner" level="DEBUG" additivity="false">
    <appender-ref ref="CONSOLE"/>
</logger>
<logger name="com.testScenario" level="DEBUG" additivity="false">
    <appender-ref ref="CONSOLE"/>
</logger>

Lancer un test en mode visuel (headless=false)

Fichier : local.properties

browser.headless=false

Ensuite :

mvn test -Denv=local

Générer les traces Playwright

set PWDEBUG=1
mvn test

Inspector Playwright démarre et vous permet d'inspecter pas à pas.


📦 Build et déploiement

Build local

mvn clean install

Build pour serveur

mvn clean package -Pserveur

Tester le build

# JAR exécutable local
java -jar target/*.jar --spring.profiles.active=local

# WAR sur WebLogic
# (Consulter doc WebLogic)

🚀 Contribuer

Ajouter une nouvelle dépendance

  1. Ajouter dans pom.xml
  2. Tester localement : mvn clean install
  3. Commiter avec message explicite

Ajouter une nouvelle suite

  1. Créer fichier testng dans src/main/resources/
  2. Ajouter à suites.json
  3. Créer les tests correspondants dans com.testScenario.tests
  4. Tester localement

Versionnage des données

✅ À commiter :

  • Fichiers CSV de test data
  • Suites TestNG XML
  • Configuration logback

❌ À ignorer (.gitignore) :

  • local.properties (chemins locaux)
  • Rapports Allure generés
  • Logs d'exécution
  • target/

📚 Ressources


📧 Questions ?

  • Architecture : Voir la structure dans src/main/java
  • Nouveau test : Copier Toduplicate.java + adapter
  • CI/CD : Consulter devops/infra

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors