如何使用Playwright、Shell脚本和K6在负载测试中自动进行身份验证

文摘   2024-11-11 12:06   重庆  

介绍:K6是一款现代化的开源软件负载测试工具,它旨在帮助开发人员和测试人员快速有效地测试自己的网站和应用程序的负载能力。

K6的特点在于它具有强大的实时性能数据监控功能,而且使用简单,易于配置。在使用K6进行负载测试时,开发人员和测试人员可以很方便地模拟成千上万的用户同时访问目标网站,从而测试网站的负载能力、性能表现和稳定性。它被认为是目前最流行和最强大的开源负载测试工具之一。

编译整理|TesterHome社区

作者|Mahtab Nejad


以下为作者观点:


在现代测试场景中,安全且动态地处理身份验证令牌至关重要,尤其是在集成 Playwright 等工具进行登录自动化和 K6 进行负载测试时。


本文概述了一种使用 Playwright 自动捕获令牌、安全存储令牌并在 K6 负载测试中利用它的方法。此设置可确保无缝处理身份验证,为基于会话的测试提供灵活性并最大限度地减少手动干预。


这种方法的好处:


1.自动身份验证:自动执行登录和令牌捕获过程,无需手动管理令牌。

2.工具之间的集成:将令牌从 Playwright 传递到 K6,确保持续、经过验证的负载测试。

3.测试效率:支持通过动态令牌更新进行长时间运行的测试,从而实现可靠的基于会话的负载测试。


第1步:Playwright 测试和页面对象用于捕获访问令牌


Playwright 测试可以自动登录 Web 服务并从身份验证响应中检索访问令牌。使用 Playwright 的 API 进行网络响应处理,我们可以直接从登录请求中捕获令牌并将其存储起来以便在测试中重复使用。


Playwright 页面对象示例:


在页面对象中,我们定义了一个方法来登录并捕获令牌:


import { Page } from '@playwright/test';import fs from 'fs';import path from 'path';
export class AuthPage { constructor(private page: Page) {}
async loginAndCaptureToken() { await this.page.goto('https://your-login-page-url.com'); // Fill in login details await this.page.fill('#email', process.env.EMAIL); await this.page.fill('#password', process.env.PASSWORD); await this.page.click('button[type="submit"]');
// Wait for the response that includes the token const response = await this.page.waitForResponse(resp => resp.url().includes('/login') && resp.status() === 200); const responseBody = await response.json(); // Save token to a .env file const token = responseBody.access_token; fs.writeFileSync(path.resolve(__dirname, '../../token.env'), `ACCESS_TOKEN=${token}\n`); }}


在此示例中:


  • 登录并等待响应:当登录响应到达时登录并捕获令牌。

  • 保存到 .env:将令牌存储在环境文件中,以便于在其他脚本中获取资源。


该测试文件loginAndCaptureToken从AuthPage页面对象调用该方法。


Playwright 规范文件示例


import { test } from '@playwright/test';import { AuthPage } from './path/to/AuthPage'; // Adjust the path to point to your AuthPage file
test.describe('Authentication Test', () => { test('Capture access token after login', async ({ page }) => { // Instantiate the AuthPage with the page instance const authPage = new AuthPage(page);
// Run the login and capture token process await authPage.loginAndCaptureToken();
// Assert that the token was saved (optional, as Playwright doesn’t support filesystem checks directly) console.log("Token capture and save process completed successfully."); });});


第2步:run-test-with-credentials.js Helper Script


此 Node.js 辅助脚本可确保 Playwright 测试能够自动捕获和存储令牌。我们使用此辅助脚本提示输入登录凭据、运行 Playwright 登录流程并将令牌写入文件.env。


Helper Script 示例:

const { exec } = require('child_process');const readline = require('readline');const fs = require('fs');const path = require('path');
const rl = readline.createInterface({ input: process.stdin, output: process.stdout,});
async function ask(question) { return new Promise(resolve => rl.question(question, resolve));}
(async () => { const email = await ask("Enter email: "); const password = await ask("Enter password: "); rl.close();
// Run the Playwright script to capture the token exec(`EMAIL=${email} PASSWORD=${password} npx playwright test auth/login.spec.ts`, (err, stdout, stderr) => { if (err) { console.error(`Error: ${stderr}`); return; } console.log(`Token captured and saved: ${stdout}`); });})();

   

在此脚本中:

  • 提示输入凭证:安全地接受登录凭证。

  • 执行 Playwright 测试:运行 Playwright 测试以登录并保存令牌。

  • 自动令牌管理:确保最新的令牌存储在.env文件中以供后续测试使用。



第3步:使用 shell 文件运行 Playwright 和 K6 脚本

(generateTokenAndRunK6.sh)


在执行此 shell 文件之前,需要在 K6 脚本中将其传递给__ENV.TEST_TOKEN需要授权的地方。


K6脚本示例


import http from "k6/http";import { check } from "k6";import { uuidv4 } from "https://jslib.k6.io/k6-utils/1.4.0/index.js";import { SharedArray } from "k6/data";import { vu } from "k6/execution";
const BASE_URL='https://example-url.com';// Where __ENV.TEST_TOKEN should be definedconst TEST_TOKEN=__ENV.TEST_TOKEN
function getFormattedTimestamp() { let now = new Date(); let londonTime = now.toLocaleString('en-GB', { timeZone: 'Europe/London', hour12: false, year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit' }); let [date, time] = londonTime.split(', '); let [day, month, year] = date.split('/'); return `${year}-${month}-${day}T${time}`;}
export const options = { scenarios: { constantLoad: { executor: "constant-arrival-rate", rate: 25, timeUnit: "1s", duration: "30m", preAllocatedVUs: 200, maxVUs: 400, } },};
export default function () { let correlationId = `performance-script-${uuidv4()}-${getFormattedTimestamp()}`;
let headers = { "X-Correlation-ID": correlationId, 'Test-Token': TEST_TOKEN, };
let response = http.get( `${BASE_URL}/some-endpoint`, { headers: headers, tags: { "X-Correlation-ID": correlationId }, } );
if (response.status !== 200 && response.status !== 207) { console.error( `Error: Received status code ${response.status} with correlation id ${correlationId}` ); }
check(response, { "is status 207 or 200": (r) => r.status === 207 || r.status === 200, "response body is not empty": (r) => r.body.length > 0, });}

该 shell 脚本管理通过 Playwright 测试和帮助文件捕获令牌,然后使用存储的令牌运行 K6 测试的流程。


当令牌被捕获并在控制台中输出时,将在终端上收到一个提示,要求输入要执行的 K6 脚本的完整路径。


然后,shell 脚本从中获取令牌test-token.env并动态生成带有时间戳的报告。执行此脚本后,需要通过chmod +x generateTokenAndRunK6.sh(对于类 Unix 操作系统)或(对于 Windows 操作系统)文件属性授予权限,然后使用操作系统中使用的方法在终端上执行 shell 脚本。


Shell 文件脚本示例


#!/bin/bash
# Run the Node.js script to capture the tokennode src/libraries/playwright/helpers/run-test-with-credentials.js
# Source the updated token from .env filessource env/test-token.envsource env/.env
# Prompt for K6 script pathread -p "Enter the full path to your K6 script: " k6_script_path
# Generate a timestamp for unique report namestimestamp=$(date +"%Y%m%dT%H%M%S")
# Extract the K6 script filename without extensionk6_script_filename=$(basename "$k6_script_path" .js)
# Define report output pathreport_output_path="./reports/k6-reports/${k6_script_filename}-${timestamp}.html"
# Ensure the reports directory existsmkdir -p ./reports/k6-reports
# Run K6 with the token and generate an HTML reportK6_WEB_DASHBOARD=true K6_WEB_DASHBOARD_EXPORT="$report_output_path" K6 run -e TEST_TOKEN="$TEST_TOKEN" "$k6_script_path"
echo "K6 report saved to: $report_output_path"

解释:


  • 初始令牌捕获:脚本运行 Node.js 助手以确保有新令牌可用。

  • K6 的源令牌:为 K6 测试test-token.env设置的源(以及其他可选的环境文件) 。TEST_TOKEN

  • 生成报告:定义带时间戳的报告路径并使用当前令牌运行 K6,将结果导出为原生 K6 HTML 报告。


概括


通过将用于令牌管理的Playwright与用于负载测试的 K6 相结合,这种方法为经过身份验证的测试提供了强大的解决方案。自动捕获和存储令牌使 K6 能够执行长时间运行的经过身份验证的测试,而无需手动更新令牌。此设置提供了一种高效、可扩展且安全的方式来处理实际应用程序的基于会话的负载测试。

使用此方法,我们可以简化测试流程,提供可重复使用和可维护的令牌管理,并与 K6 无缝集成,以获得一致的负载测试结果。(原文链接:https://medium.com/@mahtabnejad/automating-authentication-in-load-testing-with-playwright-shell-scripting-and-k6-149ec7ca0739)



1.货拉拉营销自动化框架Mutation演变与升级之路

2.长文总结|DevOps面试116个热门问题及答案

3.开源工具|自动化巡检系统,基于Testng+Playwright+SpringBoot+Vue+Ant-Design

4.测试灵魂三问及解决方案

5.原生鸿蒙,真正独立!部分应用只有基础功能,原因是必须进行大量稳定性测试?

6.阿里云开源AI应用开发框架Spring AI Alibaba,帮助开发者快速构建AI应用


TesterHome社区
测试之家(TesterHome)由一线测试工程师发起和运营的测试技术社区,社区主旨是公益、开源、分享、落地,紧跟前沿技术趋势,致力于推进软件质量保障与安全,是软件质量保障领域的风向标。我们的理念:Coding Share Show Cool
 最新文章