Tengo un conjunto de pruebas escritas con Playwright . Estoy tratando de ejecutar estas pruebas desde un conjunto de pruebas separado. En este conjunto separado de pruebas, necesito examinar los resultados de los resultados originales. Esto me lleva a la siguiente estructura de directorios:
/ /checks checks1.spec.js /tests tests1.spec.js tests2.spec.js playwright.config.jsMis archivos se ven así:
// @ts-check const { devices } = require('@playwright/test'); /** * @see https://playwright.dev/docs/test-configuration * @type {import('@playwright/test').PlaywrightTestConfig} */ const config = { testDir: '.', timeout: 30 * 1000, expect: { timeout: 5000 }, forbidOnly: !!process.env.CI, retries: process.env.CI ? 2 : 0, workers: process.env.CI ? 1 : undefined, reporter: [ ['html', { outputFolder: 'reports' } ] ], use: { actionTimeout: 0, trace: 'on-first-retry', }, /* Configure projects for major browsers */ projects: [ { name: 'chromium', use: { ...devices['Desktop Chrome'], }, } ] }; module.exports = config; const { test, expect } = require('@playwright/test'); test.describe('Field Tests', () => { test('Should be required', async({ page }) => { await page.goto('http://localhost:8080'); await expect(true).toBe(true); }); }); const { exec } = require('child_process'); const { test, expect } = require('@playwright/test'); const command = 'npx playwright test --reporter=json ./tests/tests1.spec.js'; test.describe('Field', () => { test(`Require state`, async () => { const { stdout, stderr } = await exec(command); // Execute the test and get the results const buffer = child_process.execSync(command); const json = JSON.parse(buffer.toString()); const results = json.suites[0].suites[0].specs; const status = results[0].tests[0].results[0].status; expect(status).toBe('passed'); }); }); Cuando ejecuto npx playwright test --reporter=json ./tests/test1.spec.js , recibo el resultado JSON como esperaba. Sin embargo, cuando ejecuto verificaciones de npx playwright test checks , recibo un Socket en lugar del JSON. ¿Cómo ejecuto el command y espero a que se devuelva el JSON? Gracias.
No está claro por qué está ejecutando el comando tour dos veces (una con la palabra clave await y otra con la función execSync ). Sin embargo, se puede resolver usando eventos:
test.describe('Field', () => { test(`Require state`, async () => { const process = await exec(command); process.stdout.on('data', data => { // do something with the data here }) process.on('exit', () => { // final checks (eg - expect) go here }) }); }); Si lo desea, puede crear un asistente que devolverá el resultado de la ejecución como promesa, por lo tanto, admita las palabras clave await + async
async cmd(command) { return new Promise((resolve, reject) => { const process = await exec(command); let result = data process.stdout.on('data', data => { result = data // any other format manipulations should be added here }) process.stderr.on('data', reject) process.on('exit', () => resolve(result)) }) }Luego, en algún lugar de su código, simplemente use:
const result = await cmd('your command goes here')Según la pregunta, creo que primero desea ejecutar el playwright para la carpeta de tests y luego esperar a que se genere el JSON. Y, después de generar el JSON, le gustaría ejecutar playwright para la carpeta de checks .
Para esto, simplemente puede dividir su comando en dos partes de la siguiente manera:
npx playwright tests --reporter=jsonnpx playwright checks Y luego ejecútelos como un comando usando el operador && de la siguiente manera: npx playwright tests --reporter=json && npx playwright checks .
De esta forma, las pruebas se ejecutan primero, el JSON se generaría al final de la prueba. Y después de generar JSON, se ejecutarían las comprobaciones.
Explicación:
npx playwright test checks , ya que playwrite genera el informe al final de la ejecución (para consolidar todos los resultados), el JSON se generará después de que se complete la ejecución de la carpeta de check .tests y luego ejecutaremos las checks .