我有一个身份验证 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 测试?
遵循 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
我通过使用 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'
}
});