برنامه نویسی

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 سفارشی ، می توانیم:

  1. به روزرسانی های تعادل فوری را تست کنید.
  2. گردش کار پردازش پرداخت را تأیید کنید.
  3. از UX در زمان واقعی و یکپارچه در برنامه های مالی اطمینان حاصل کنید.

آیا دوست دارید درباره Cypress و QA Insights اطلاعات بیشتری کسب کنید؟ مرا در LinkedIn🚀 دنبال کنید یا در کانال TG من مشترک شوید

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا