如何使用 Typescript 在 Playwright 中的参数化和非参数化测试之间共享变量的值?

问题描述 投票:0回答:1

如标题所示。这是我来自的地方:

  1. 在引入参数化之前,共享变量的值工作得很好。
imports { ... } ...

let myVariable: string;

test.describe.configure({mode: serial})
test.beforeEach(async ({page, variousPOJs})) => {
    visit main page, etc.
}

test(`scenario for case 1`, async ({
}) => {
    myVariable = "123"
})

test(`scenario for case 2`, async ({
}) => {
    console.log(myVariable) ==> outputs "123" 
})
  1. 参数化后:
imports { ... } ...

let myVariable: string;

test.describe.configure({mode: serial})
test.beforeEach(async ({page, variousPOJs})) => {
    visit main page, etc.
}

const cases = [{nr: 1, title: "a", objName: "normal"}, {nr: 2, title: "b", objName: "updated"}];

for (const case of cases) {
  test(`test for case nr ${case.nr} doing ${case.title}`, async ({
      myVariable = `some value ${case.objName}`;
  })  
}

test(`test for case nr 3 doing c`, async ({
      console.log(myVariable); ==> outputs "undefined"
  })

chatgpt 的 2 个建议。第一个是无用的,该变量默认为空值(显然)。第二种似乎是可能的,尽管未经我测试。我想避免自己创建比在同一文件中共享变量更复杂的东西,因为我编写它的自动化测试非常简单。它只是在应用程序中创建一个对象,获取其名称并更新该名称。

import { test, expect } from '@playwright/test';

let categoryName: string;

test.beforeEach(async () => {
  // Inicjalizuj wartość categoryName przed każdym testem
  categoryName = '';
});

for (const tytul of ['test1', 'test2']) {
  test(`Test sparametryzowany - ${tytul}`, async ({ page }) => {
    // Wykonaj operacje specyficzne dla danego scenariusza
    await page.goto('https://www.example.com');

    // Nadpisz wartość categoryName
    categoryName = `Category_${tytul}`;

    // Przykładowa operacja, która wykorzystuje wartość z danej iteracji
    await page.fill('input[name="poleFormularza"]', 'WartośćTestowa');
    await page.click('button[type="submit"]');
    
    // Oczekuj na jakąś operację, możesz dostosować to do swoich potrzeb
    await page.waitForSelector('div.wynik');

    // Sprawdź, czy otrzymany wynik jest poprawny
    const wynik = await page.textContent('div.wynik');
    expect(wynik).toBe('Oczekiwany wynik dla WartośćTestowa');
  });
}

// Test niepoddany parametryzacji, korzystający z nadpisanej wartości categoryName
test('Test bez parametryzacji', async ({ page }) => {
  if (categoryName) {
    console.log(`Używam nadpisanej wartości categoryName w teście bez parametryzacji: ${categoryName}`);
  }

  // Tutaj możesz dodać operacje specyficzne dla tego testu
});
import { Context } from '@playwright/test';

export interface SharedState {
  categoryName: string;
}

export const sharedContext = new Context<SharedState>();

export const setCategoryName = (categoryName: string) => {
  sharedContext.state.categoryName = categoryName;
};

export const getCategoryName = () => {
  return sharedContext.state.categoryName;
};


____
test:

import { test, expect } from '@playwright/test';
import { setCategoryName, getCategoryName } from './sharedState';

test.beforeEach(async ({ context }) => {
  // Inicjalizuj wartość categoryName przed każdym testem
  setCategoryName('');
});

for (const tytul of ['test1', 'test2']) {
  test(`Test sparametryzowany - ${tytul}`, async ({ page }) => {
    // Wykonaj operacje specyficzne dla danego scenariusza
    await page.goto('https://www.example.com');

    // Nadpisz wartość categoryName
    setCategoryName(`Category_${tytul}`);

    // Przykładowa operacja, która wykorzystuje wartość z danej iteracji
    await page.fill('input[name="poleFormularza"]', 'WartośćTestowa');
    await page.click('button[type="submit"]');
    
    // Oczekuj na jakąś operację, możesz dostosować to do swoich potrzeb
    await page.waitForSelector('div.wynik');

    // Sprawdź, czy otrzymany wynik jest poprawny
    const wynik = await page.textContent('div.wynik');
    expect(wynik).toBe('Oczekiwany wynik dla WartośćTestowa');
  });
}

// Test niepoddany parametryzacji, korzystający z nadpisanej wartości categoryName
test('Test bez parametryzacji', async ({ page }) => {
  const categoryName = getCategoryName();

  if (categoryName) {
    console.log(`Używam nadpisanej wartości categoryName w teście bez parametryzacji: ${categoryName}`);
  }

  // Tutaj możesz dodać operacje specyficzne dla tego testu
});
javascript variables playwright parametrized-testing playwright-typescript
1个回答
0
投票

对您自己的建议进行一些小调整,似乎可以解决问题:

注意,

case
是保留名称,不能用作变量名称。

import { test } from "@playwright/test";

const testCases = [
  { nr: 1, title: "a", objName: "normal" },
  { nr: 2, title: "b", objName: "updated" },
];

let myVariable = "hi";

test.describe.configure({ mode: "serial" });

for (const testCase of testCases) {
  test(`test for case nr ${testCase.nr} doing ${testCase.title}`, async () => {
    myVariable = `some value ${testCase.objName}`;
  });
}

test(`test for case nr 3 doing c`, async () => {
  console.log(myVariable);
  // Now logs: "some value updated" - as desired
});

一般而言,在测试之间共享变量是一种不好的做法,并且会使测试相互依赖,在文档中阅读一些关于测试隔离的好建议

© www.soinside.com 2019 - 2024. All rights reserved.