Migrar desde el motor de pruebas de Power Apps

Power Apps motor de pruebas usa definiciones de prueba basadas en YAML que se ejecutan en un host de prueba especializado. Los ejemplos de Power Platform Playwright usan TypeScript y el ejecutor de pruebas estándar de Playwright, lo que proporciona acceso a la API completa de Playwright, las herramientas del ecosistema y las integraciones de CI/CD.

En esta guía se asignan los conceptos del motor de pruebas a sus equivalentes de Playwright y se recorre un ejemplo concreto de migración.

Mapa conceptual

En la tabla siguiente se muestra cómo se asignan los conceptos del entorno de pruebas a sus equivalentes de Playwright.

Concepto del motor de pruebas Equivalente de playwright
Archivo de prueba de YAML Archivo de prueba de TypeScript (*.test.ts)
testSuite.testCases test.describe() bloques
testStep test() Función
appLogicalName directUrl en AppProvider.launch()
onTestCaseStart test.beforeEach()
Assert expect() de @playwright/test
Select (interacción de control) canvasFrame.locator('[data-control-name="..."]').click()
SetProperty canvasFrame.locator('input[...]').fill()
Screenshot page.screenshot() o toHaveScreenshot()
environmentVariables .env variables de archivo
Fórmulas de Power Fx en YAML Expresiones de TypeScript

Antes de empezar

Complete estos requisitos previos antes de iniciar la migración.

  1. Clone el repositorio e instale las dependencias:

    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. Copie la dirección URL de la aplicación desde el YAML del motor de pruebas appLogicalName o el portal de creación de Power Apps.

  3. Configuración de la autenticación: consulte la guía de autenticación.

Paso 1: Identificar el tipo de aplicación

Test Engine admite aplicaciones basadas en lienzo. Si va a migrar:

Paso 2: Mapear la estructura de la prueba

Motor de pruebas YAML

Una definición de prueba típica del Motor de Pruebas se ve así.

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

Equivalente de TypeScript de Playwright

Esta es la misma prueba reescrita mediante Playwright y Power Platform Toolkit.

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');
  });
});

Paso 3: Selectores de control de mapa

Test Engine usa nombres de control de Power Apps Studio directamente en YAML. En Playwright, usa los atributos data-control-name con los mismos valores:

Motor de pruebas 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()

Sugerencia

Para buscar el data-control-name valor de un control, abra la aplicación en modo de reproducción, abra DevTools (F12) e inspeccione el elemento. El valor coincide con el nombre de control establecido en Power Apps Studio.

Paso 4: Asignar variables de entorno

El motor de pruebas usa una environmentVariables sección en YAML. Mueva estos valores al .env archivo:

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

Paso 5: Configuración y desmontaje del mapa

Convierta los hooks del ciclo de vida del motor de prueba a las funciones integradas beforeEach y 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({ ... });
});

Paso 6: Reemplazar aserciones de Power Fx

Test Engine usa expresiones de Power Fx en Assert(). Reemplace por aserciones de 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()

Diferencias clave a tener en cuenta

Tenga en cuenta estas diferencias en el comportamiento a medida que migre sus pruebas.

Area Motor de pruebas Playwright
Esperas Automático (motor de pruebas controla el tiempo) Se requiere waitFor() explícitamente
Tiempos de espera de la galería Gestionado internamente Uso del tiempo de espera de 60 segundos para galerías de Dataverse
Aislamiento de prueba Cada prueba restablece el estado de la aplicación Usa beforeEach para volver a iniciar o navegar a la página de inicio
Capturas de pantalla Paso integrado Screenshot page.screenshot() o toHaveScreenshot()
Informes de errores Nivel de YAML Informe HTML de Playwright + visor de seguimiento

Ejecución de las pruebas migradas

Después de migrar las pruebas, autentíquelas y ejecútelas mediante estos comandos.

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

Solución de problemas de migración

Consulte la tabla siguiente para conocer los problemas comunes de migración y sus soluciones.

Síntoma Resolution
La galería no se carga Agregar waitFor({ timeout: 60000 }) antes de interactuar
Control no encontrado Comprobar data-control-name en DevTools: puede diferir del nombre de Power Fx
Selector coincide con varios elementos Usar .filter() o .nth(0) para restringir la selección
Las pruebas se ejecutan, pero la aserción falla inmediatamente Agregar explícito waitFor o toBeVisible antes de hacer una aserción

Pasos siguientes

Consulte también