Beyond Cypress `Cy.Intercept`: آزمایش پرداخت وب سایت در زمان واقعی در چارچوب های ترکیبی سرو

در بخش اول این مقاله ، ما محدودیت های آن را بررسی کردیم cy.intercept
برای آزمایش WebSocket و یک چارچوب ترکیبی Cyprid برای رسیدگی به تعامل WebSocket در زمان واقعی معرفی کرد. حال ، بیایید به سناریوهای تست پرداخت در دنیای واقعی شیرجه بزنیم ، جایی که وب سایت ها نقش مهمی در اطمینان از به روزرسانی دقیق معاملات ، ردیابی تعادل زنده و تجربیات کاربر بدون درز دارند.
چرا WebSockets برای آزمایش پرداخت مهم است؟
سیستم های پرداخت داخلی در برنامه های وب غالباً به به روزرسانی های زمان واقعی متکی هستند تا بازخورد فوری در مورد معاملات خود را در اختیار کاربران قرار دهند. بر خلاف نظرسنجی سنتی HTTP ، که به طور مکرر داده ها را از سرور درخواست می کند ، WebSockets اعلان های فشار فوری را فعال می کند و آنها را برای: ایده آل می کند:
- به روزرسانی های وضعیت معامله زنده (به عنوان مثال ، “پردازش پرداخت” ، “پرداخت موفقیت آمیز” ، “پرداخت شکست خورد”).
- به روزرسانی های تعادل در زمان واقعی پس از سپرده ها ، برداشت ها یا بازپرداخت.
- هشدارهای تقلب فوری و اعلان های امنیتی.
از آنجا که Cypress به طور بومی از آزمایش WebSocket پشتیبانی نمی کند ، ما باید با استفاده از دستورات سفارشی و شنوندگان رویداد WebSocket قابلیت های آن را گسترش دهیم. در این بخش سناریوهای تست پرداخت خاص ، از جمله:
- اعتبار سنجی به روزرسانی وضعیت پرداخت در زمان واقعی.
- اطمینان از به روزرسانی های تعادل پس از معاملات.
- رسیدگی به موارد خطا ، قطع ارتباط و احیا.
اتصال سیگنال در زمان واقعی برای به روزرسانی مانده و وضعیت پرداخت
در connectWStoListen
یک دستور Cypress سفارشی برای ایجاد یک اتصال WebSocket در زمان واقعی با استفاده از SignalR طراحی شده است. این به روزرسانی های مربوط به تغییرات مانده و وضعیت پرداخت در برنامه هایی که برای اعتبارسنجی معاملات فوری متکی هستند ، گوش می دهد.
Cypress.Commands.add(
"connectWStoListen",
(url, { onBalanceUpdate, onPaymentStatusUpdate }) => {
return new Promise((resolve, reject) => {
const ws = new WebSocket(url);
Cypress.env("currentWebSocket", ws); // Store WebSocket instance globally
...
معرفی داده های دستی
برای برقراری اتصال SignalR ، ابتدا یک درخواست دستی را به سرور ارسال می کنیم. این تضمین می کند که هر دو مشتری و سرور قبل از تبادل داده های واقعی با پروتکل های ارتباطی توافق کنند. این قالب معمولاً در انواع مختلف سوکت های وب استفاده می شود:
...
const handshakeData="{"protocol":"json","version":1}\x1e";
let receivedEmptyResponse = false; // Track server's empty {} response
let readyToListen = false; // Track when we're ready to listen for custom messages
...
در \x1e
در پایان handshakeData
یک تعیین کننده سیگنال ویژه است که پایان پیام را نشان می دهد.
پس از اتمام دست دادن دست ، می توانیم شروع به گوش دادن به پیام ها وت خطاهای دست زدن بهبشر
رسیدگی به پیام ها و خطاهای WebSocket
پس از برقراری اتصال ، SignalR پیام های زمان واقعی را از سرور دریافت می کند. دستور Cypress ما این پیام ها را پردازش می کند و پاسخ های مختلف سرور را کنترل می کند.
ws.onopen = () => {
console.log("SignalR WebSocket connection established");
ws.send(handshakeData); // Step 1: Send handshake message
ws.onmessage = (event) => {
const rawMessage = event.data;
const messages = rawMessage.split("\x1e").filter((m) => m);
messages.forEach((message) => {
try {
const parsedMessage = JSON.parse(message);
// Step 2: Check for initial empty response {}
if (
Object.keys(parsedMessage).length === 0 &&
!receivedEmptyResponse
) {
console.log("Received empty response {} from server.");
receivedEmptyResponse = true;
ws.send('{"type":6}\x1e'); // Step 3: Send type after empty server response
}
// Step 4: Wait for server to respond with {"type":6}
else if (
parsedMessage.type === 6 &&
receivedEmptyResponse &&
!readyToListen
) {
console.log(
"Received server confirmation type 6. Ready for further messages.",
);
readyToListen = true;
resolve(); // Signal that we're ready for payment deposit request
}
// Only listen for custom messages
// ReceivePaymentStatusUpdate and ReceiveBalanceUpdate
// after setup is complete
if (
readyToListen &&
parsedMessage.type === 1 &&
parsedMessage.target
) {
if (
parsedMessage.target === "ReceivePaymentStatusUpdate" &&
onPaymentStatusUpdate
) {
onPaymentStatusUpdate(parsedMessage.arguments[0]);
}
if (
parsedMessage.target === "ReceiveBalanceUpdate" &&
onBalanceUpdate
) {
onBalanceUpdate(parsedMessage.arguments[0]);
}
}
} catch (error) {
console.error("Failed to parse SignalR message:", error);
}
});
};
ws.onerror = (error) => {
console.log(WebSocket error: ${error.message});
reject(error);
};
ws.onclose = () => {
console.log("SignalR WebSocket connection closed");
};
};
});
},
);
رسیدگی به خطا: WebSocket خطاها را به طرز فجیعی وارد می کند و اتصالات را برای جلوگیری از نشت منابع بسته می کند.
آزمایش مجدد خودکار: اگر معاملات در انتظار حل نشده باقی بمانند ، سرو تا زمان دریافت تأیید دوباره امتحان می شود.
اجرای تأیید تعادل WebSocket
اکنون که اتصال WebSocket ما در دسترس است ، می توانیم یک روش اختصاصی برای تأیید به روزرسانی های تعادل در زمان واقعی ایجاد کنیم.
connectWStoVerifyBalance() {
// Construct your WebSocket SignalR URL
// The URL is based on configuration for specific testing
// environment
const urlWS = `${envConfig.webSocketAPI}${bearerToken}`;
cy.connectWStoListen(urlWS, {
onPaymentStatusUpdate: (paymentStatus) => {
const parsedStatus = JSON.parse(paymentStatus);
// Wait and retry if payment status is still 'pending'
if (parsedStatus.status === "pending") {
console.warn("Payment status is pending. Retrying...");
}
// Do an assertion that status is updated to Success
expect(parsedStatus.status).to.equal("success");
console.log("Payment status updated successfully:", parsedStatus);
},
onBalanceUpdate: (updatedBalance) => {
// Do required assertions for a balance update
// Save new balance value if it is necessary
console.log("Balance updated successfully:", updatedBalance);
// Close WebSocket connection
const ws = Cypress.env("currentWebSocket");
if (ws) ws.close();
},
});
});
}
با استفاده از WebSockets در یک مورد آزمایش سرو
حال ، بیایید اعتبار سنجی WebSocket را در یک مورد آزمایش سرو اجرا کنیم تا تأیید کنیم که پرداخت ها به درستی پردازش می شوند و به روزرسانی های تعادل در زمان واقعی اتفاق می افتد.
describe("Deposit Feature - Real-Time WebSocket Validation", () => {
it(`Verify that a user can deposit min amount and payment is successful`, () => {
// Step 1: User Registration & Setup
cy.registerNewUser();
cy.confirmUserIsRegistered();
// Step 2: Establish WebSocket Connection for Balance Monitoring
// using our created method
cy.connectWStoVerifyBalance();
// Step 3: Navigate to payments and do required actions to
// initiate a deposit transaction
cy.navigateToPayments();
cy.accessDepositTab();
cy.verifyMinimumDepositAmount();
cy.validatePendingPaymentStatus();
// Step 4: Simulate payment process via API/webhook/UI
cy.updateDepositStatusViaAPI();
// Step 5: Verify successful payment update on UI
cy.validateSuccessfulPaymentMessage();
});
});
از آنجا که ما سیاهههای کنسول را به دستور سفارشی Cypress خود اضافه کرده ایم connectWStoListen
، ما به روزرسانی های وضعیت در زمان واقعی در کنسول Cypress خواهیم دید. این امر دید کاملی در نحوه اتصالات وب سایت SignalR به روزرسانی های معامله را ارائه می دهد.
پایان
WebSockets ردیابی معاملات در زمان واقعی را برای سیستم های پرداخت مدرن ارائه می دهد ، و اطمینان می دهد که کاربران بازخورد فوری دریافت می کنند. با گسترش Cypress با دستورات WebSocket سفارشی ، می توانیم:
- به روزرسانی های تعادل فوری را تست کنید.
- گردش کار پردازش پرداخت را تأیید کنید.
- از UX در زمان واقعی و یکپارچه در برنامه های مالی اطمینان حاصل کنید.
آیا دوست دارید درباره Cypress و QA Insights اطلاعات بیشتری کسب کنید؟ مرا در LinkedIn🚀 دنبال کنید یا در کانال TG من مشترک شوید