Playwright:如何使用 API 生成的令牌在所有测试中使用?

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

我有一个身份验证 API 端点,可以生成

accessToken
。我会暂时保存此令牌,然后在每次运行时使用/执行所有其他 API 测试,并使用下面的设置/测试片段:

const url = 'https://serverless.net/api/authority/token';

    await request.post(url, {
        headers: {
        'Accept': 'application/json',
        // Add authorization token to all requests.
        'Authorization': `Basic ${Buffer.from(`${process.env.USERNAME}:${process.env.PASSWORD}`).toString('base64')}`, }
    });
/// this generates an `accessToken` in the body

API 响应正文将具有以下内容:

{
    "result": 0,
    "message": "Success",
    "data": {
        "accessToken": "eyasdadasdasdasdasdasdasdasdsa",
        "tokenType": "Bearer",
        "expiresIn": "1440",
        "userId": 1
    }
}

我需要

accessToken
的地方。

我可以将其写入/保存到临时存储(可能是 json 文件吗?),然后将其用作

Bearer token
进行 API 测试?

api automated-tests token playwright
2个回答
1
投票

是的,您可以全局存储并通过多种方式通过测试。

遵循 Playwright 文档中的示例:

在此示例中,GitHub API 需要授权,因此它将为所有测试配置一次令牌。我们还可以设置baseURL来简化测试。您可以将它们放在配置文件中,也可以使用 test.use() 放在测试文件中。

从 API 获取身份验证详细信息并将其存储在本地 json 文件中:

// auth.setup.ts
import { test as setup } from '@playwright/test';

const authFile = 'playwright/.auth/user.json';

setup('authenticate', async ({ request }) => {
  // Send authentication request. Replace with your own.
  await request.post('https://github.com/login', {
    form: {
      'user': 'user',
      'password': 'password'
    }
  });
  await request.storageState({ path: authFile });
});

您还可以为每个测试文件或测试组指定 storageState,而不是在配置中设置。

// tests/example.spec.ts
import { test } from '@playwright/test';

test.use({ storageState: 'playwright/.auth/admin.json' });

test('admin test', async ({ page }) => {
  // page is authenticated as admin
});

test.describe(() => {
  test.use({ storageState: 'playwright/.auth/user.json' });

  test('user test', async ({ page }) => {
    // page is authenticated as a user
  });
});

如果您有身份验证令牌,并且想要在配置中全局传递

   // playwright.config.ts
import { defineConfig } from '@playwright/test';
export default defineConfig({
  use: {
    // All requests we send go to this API endpoint.
    baseURL: 'https://api.github.com',
    extraHTTPHeaders: {
      // We set this header per GitHub guidelines.
      'Accept': 'application/vnd.github.v3+json',
      // Add authorization token to all requests.
      // Assuming personal access token available in the environment.
      'Authorization': `token ${process.env.API_TOKEN}`,
    },
  }
});

编写测试:

Playwright Test 附带内置的请求装置,该装置尊重我们指定的配置选项(如 baseURL 或 extraHTTPHeaders),并准备发送一些请求。

const REPO = 'test-repo-1';
const USER = 'github-username';

test('should create a bug report', async ({ request }) => {
  const newIssue = await request.post(`/repos/${USER}/${REPO}/issues`, {
    data: {
      title: '[Bug] report 1',
      body: 'Bug description',
    }
  });
  expect(newIssue.ok()).toBeTruthy();

  const issues = await request.get(`/repos/${USER}/${REPO}/issues`);
  expect(issues.ok()).toBeTruthy();
  expect(await issues.json()).toContainEqual(expect.objectContaining({
    title: '[Bug] report 1',
    body: 'Bug description'
  }));
});

参考:https://playwright.dev/docs/test-api-testing#configuration


-2
投票

我通过使用 Playwright 的

global-setup
https://playwright.dev/docs/test-global-setup-teardown)来完成这项工作。

首先,在根目录上,我使用以下代码创建了

global-setup.ts
。要点是将响应正文中的
accessToken
保存到环境变量
process.env.TOKEN
:

import { FullConfig, request } from '@playwright/test';

async function globalSetup(config: FullConfig) {
    const baseURL = config.projects[0].use.baseURL;
    const url = '/api/authority/token';

    const requestContext = await request.newContext();
    const response = await requestContext.post(`${baseURL}${url}`, {
            headers: {
                'Accept': 'application/json',
                'Authorization': `Basic ${Buffer.from(`${process.env.USERNAME}:${process.env.USER_ADMIN_PASSWORD}`).toString('base64')}`
            }
        });

    const body = await response.json();
    process.env.TOKEN = body.data.accessToken;
}

export default globalSetup;

然后我将以下几行包含在我的

playwright.config.ts
中:

import { defineConfig, devices } from '@playwright/test';

require('dotenv').config({ path: `.env.${process.env.ENVIRONMENT}` });

export default defineConfig({
  globalSetup: require.resolve('./global-setup'),
  ...

最后,在我的测试中,我只是简单地调用

process.env.TOKEN
,如下所示:

test('api that calls the auth token', async ({ request }) => {
  const url = '/my-api-endpoint';

  const response = await request.get(`${baseURL}${url}`, {
    headers: {
        'Authorization': `Bearer ${process.env.TOKEN}`,
        'Content-Type': 'application/json'
        }
  });
© www.soinside.com 2019 - 2024. All rights reserved.