Migrer à partir du moteur de test Power Apps

Power Apps Moteur de test utilise des définitions de test basées sur YAML qui s’exécutent sur un hôte de test spécialisé. Les exemples Playwright power Platform utilisent TypeScript et l’exécuteur de test Playwright standard, ce qui vous donne accès à l’API Playwright complète, aux outils de l’écosystème et aux intégrations CI/CD.

Ce guide correspond les concepts du moteur de test à leurs équivalents Playwright et décrit un exemple de migration concret.

Mappage de concepts

Le tableau suivant montre comment les concepts du moteur de tests sont mappés à leurs équivalents Playwright.

Concept du moteur de test Équivalent Playwright
Fichier de test YAML Fichier de test TypeScript (*.test.ts)
testSuite.testCases test.describe() Blocs
testStep test() Fonction
appLogicalName directUrl dans AppProvider.launch()
onTestCaseStart test.beforeEach()
Assert expect() à partir de @playwright/test
Select (interaction de contrôle) canvasFrame.locator('[data-control-name="..."]').click()
SetProperty canvasFrame.locator('input[...]').fill()
Screenshot page.screenshot() ou toHaveScreenshot()
environmentVariables .env variables de fichier
Formules Power Fx dans YAML Expressions TypeScript

Avant de commencer

Remplissez ces conditions préalables avant de commencer la migration.

  1. Clonez le référentiel et installez les dépendances :

    git clone https://github.com/microsoft/power-platform-playwright-samples.git
    cd power-platform-playwright-samples
    node common/scripts/install-run-rush.js install
    
  2. Copiez l’URL de votre application à partir du moteur de test YAML appLogicalName ou du portail de création de Power Apps.

  3. Configurer l’authentification : consultez le guide d’authentification.

Étape 1 : Identifier votre type d’application

Le moteur de test prend en charge les applications Canvas. Si vous migrez :

Étape 2 : Mapper votre structure de test

YAML du moteur de test

Une définition typique de test de Test Engine ressemble à ceci.

testSuite:
  testSuiteName: OrdersTests
  testCases:
    - testCaseName: CreateOrder
      testSteps: |
        Select(AddButton);
        SetProperty(OrderNumberInput, "ORD-TEST");
        Select(SaveButton);
        Assert(Label1.Text = "Saved");

Équivalent TypeScript de Playwright

Voici le même test réécrit à l’aide de Playwright et du kit de ressources Power Platform.

import { test, expect } from '@playwright/test';
import { AppProvider, AppType, AppLaunchMode, buildCanvasAppUrlFromEnv } from 'power-platform-playwright-toolkit';

test.describe('OrdersTests', () => {
  test('CreateOrder', async ({ page, context }) => {
    const app = new AppProvider(page, context);
    await app.launch({
      app: 'Orders App',
      type: AppType.Canvas,
      mode: AppLaunchMode.Play,
      skipMakerPortal: true,
      directUrl: buildCanvasAppUrlFromEnv(),
    });

    const canvasFrame = page.frameLocator('iframe[name="fullscreen-app-host"]');

    // Wait for app to load
    await canvasFrame
      .locator('[data-control-part="gallery-item"]')
      .first()
      .waitFor({ state: 'visible', timeout: 60000 });

    // Select(AddButton)
    await canvasFrame.locator('[data-control-name="AddButton"] [role="button"]').click();

    // SetProperty(OrderNumberInput, "ORD-TEST")
    await canvasFrame.locator('input[aria-label="Order Number"]').fill('ORD-TEST');

    // Select(SaveButton)
    await canvasFrame.locator('[data-control-name="SaveButton"] [role="button"]').click();

    // Assert(Label1.Text = "Saved")
    await expect(canvasFrame.locator('[data-control-name="Label1"]')).toHaveText('Saved');
  });
});

Étape 3 : Sélecteurs Map Control

Le moteur de test utilise des noms de contrôle de Power Apps Studio directement dans YAML. Dans Playwright, utilisez data-control-name des attributs avec les mêmes valeurs :

Moteur de test Playwright
Select(MyButton) canvasFrame.locator('[data-control-name="MyButton"] [role="button"]').click()
SetProperty(MyInput, "text") canvasFrame.locator('input[aria-label="My Label"]').fill("text")
Assert(MyLabel.Text = "x") expect(canvasFrame.locator('[data-control-name="MyLabel"]')).toHaveText("x")
Select(GalleryItem) canvasFrame.locator('[data-control-part="gallery-item"]').filter({ hasText: 'x' }).click()

Conseil / Astuce

Pour rechercher la data-control-name valeur d’un contrôle, ouvrez l’application en mode lecture, ouvrez DevTools (F12) et inspectez l’élément. La valeur correspond au nom de contrôle que vous avez défini dans Power Apps Studio.

Étape 4 : Mapper des variables d’environnement

Le moteur de test utilise une environmentVariables section dans YAML. Déplacez ces valeurs vers votre .env fichier :

# Test Engine YAML
environmentVariables:
  - name: appUrl
    value: https://apps.powerapps.com/play/...
# packages/e2e-tests/.env
CANVAS_APP_URL=https://apps.powerapps.com/play/...

Étape 5 : Mapper la configuration et le nettoyage

Convertissez les hooks de cycle de vie Test Engine en fonctions intégrées beforeEach et afterEach de Playwright.

# Test Engine
testSuite:
  onTestCaseStart: |
    Navigate(HomeScreen);
// Playwright
test.beforeEach(async ({ page, context }) => {
  // Re-launch the app for each test (equivalent to onTestCaseStart navigation)
  const app = new AppProvider(page, context);
  await app.launch({ ... });
});

Étape 6 : Remplacer les assertions Power Fx

Le moteur de test utilise des expressions Power Fx dans Assert(). Remplacez par les assertions Playwright expect() :

Power Fx Playwright
Assert(Label1.Text = "Done") expect(frame.locator('[data-control-name="Label1"]')).toHaveText('Done')
Assert(CountRows(Gallery1.AllItems) > 0) expect(await frame.locator('[data-control-part="gallery-item"]').count()).toBeGreaterThan(0)
Assert(IsVisible(ErrorLabel)) expect(frame.locator('[data-control-name="ErrorLabel"]')).toBeVisible()
Assert(!IsVisible(Spinner)) expect(frame.locator('[data-control-name="Spinner"]')).not.toBeVisible()

Différences clés à connaître

Gardez ces différences comportementales à l’esprit lorsque vous migrez vos tests.

Domaine Moteur de test Playwright
Attend Automatique (le moteur de test gère le minutage) Utilisation explicite de waitFor() requise
Délais d’expiration de la galerie Géré en interne Utiliser un délai d’expiration de 60 secondes pour les galeries Dataverse
Isolation des tests Chaque test réinitialise l’état de l’application Utiliser beforeEach pour relancer ou naviguer vers la page d’accueil
Captures d’écran Étape Screenshot intégrée page.screenshot() ou toHaveScreenshot()
Rapport d’erreurs Niveau YAML Rapport HTML Playwright + visionneuse de traces

Exécutez vos tests migrés

Après avoir migré vos tests, authentifiez-les et exécutez-les à l’aide de ces commandes.

cd packages/e2e-tests
npm run auth:headful      # authenticate
npx playwright test       # run all tests
npx playwright test --ui  # run with interactive UI

Résoudre les problèmes liés à la migration

Reportez-vous au tableau suivant pour connaître les problèmes de migration courants et leurs solutions.

Symptôme Résolution
La galerie ne se charge pas Ajouter waitFor({ timeout: 60000 }) avant d’interagir
Élément de contrôle introuvable Vérifier data-control-name dans DevTools : il peut différer du nom Power Fx
Le sélecteur correspond à plusieurs éléments Utiliser .filter() ou .nth(0) limiter la sélection
Les tests s’exécutent mais l’assertion échoue immédiatement Ajouter de manière explicite waitFor ou toBeVisible avant l’assertion

Étapes suivantes

Voir également