সাইপ্রাস প্রতিশ্রুতি এবং সাইপ্রাস অ্যাসিঙ্ক্রোনাস: হ্যান্ডস-অন বাস্তবায়ন, উদাহরণ

আমাদের আগেরটিতে প্রবন্ধ, আমরা সাইপ্রাসে কনফিগারেশন এবং বিভিন্ন অপশন দেখেছি যা JSON ফাইলে কনফিগার করা যায়। এই নিবন্ধটি বুঝতে পারবে সাইপ্রেস প্রতিশ্রুতি এবং সাইপ্রাস অ্যাসিঙ্ক্রোনাস আমাদের প্রকল্পে বাস্তবায়ন এবং উদাহরণ সহ আচরণ। আমরা কীভাবে আমাদের অ্যাসিঙ্ক্রোনাস কোডে প্রতীক্ষাকে অন্তর্ভুক্ত করব এবং কিছু প্রয়োজনীয় ফাংশন যেমন আলোচনা করব wrap() এবং task()। চল শুরু করি!

সাইপ্রাস প্রতিশ্রুতি এবং সাইপ্রাস অ্যাসিঙ্ক্রোনাস
সাইপ্রেস প্রতিশ্রুতি

সাইপ্রাস প্রতিশ্রুতি এবং সাইপ্রাস অ্যাসিঙ্ক্রোনাস:

সাইপ্রেস প্রতিশ্রুতি এবং সাইপ্রাস অ্যাসিঙ্ক্রোনাস প্রকৃতি কিছু অপরিহার্য ধারণা। অন্য যেকোনো জাভাস্ক্রিপ্ট কাঠামোর মতো, সাইপ্রাসও অসিঙ্ক্রোনাস এবং প্রতিশ্রুতির চারপাশে ঘুরে। সাইপ্রাস অভ্যন্তরীণভাবে সমস্ত অ্যাসিঙ্ক্রোনাস আচরণ পরিচালনা করে এবং এটি ব্যবহারকারীর কাছ থেকে লুকানো থাকে। আমরা ব্যবহার করবো .then() আমাদের কোডে ম্যানুয়ালি প্রতিশ্রুতিগুলি পরিচালনা করতে। এনপিএম-তে সাইপ্রাস-প্রতিশ্রুতির মতো বাহ্যিক প্যাকেজ রয়েছে যেখানে আমরা সাইপ্রাস অ্যাসিঙ্ক্রোনাস আচরণকে কাজে লাগাতে পারি। আমরা এই প্রতিটি বিষয়ে বিস্তারিত আলোচনা করব।

সুচিপত্র

সাইপ্রাস অ্যাসিঙ্ক্রোনাস

আমরা জানি, সাইপ্রেস এর উপর ভিত্তি করে নোড জেএস। Node.js থেকে নির্মিত যে কোন কাঠামো হল বিল্ড অসমনিয়ত। সাইপ্রাসের অ্যাসিঙ্ক্রোনাস আচরণ বোঝার আগে, আমাদের সিঙ্ক্রোনাস এবং অ্যাসিঙ্ক্রোনাস প্রকৃতির মধ্যে পার্থক্য জানা উচিত।

সমকালীন প্রকৃতি

একটি সিঙ্ক্রোনাস প্রোগ্রামে, একটি কোড কার্যকর করার সময়, শুধুমাত্র প্রথম লাইন সফলভাবে কার্যকর করা হলে, দ্বিতীয় লাইনটি কার্যকর করা হবে। প্রথম লাইনটি কার্যকর না হওয়া পর্যন্ত এটি অপেক্ষা করে। এটি ক্রমানুসারে চলে।

অসিঙ্ক্রোনাস প্রকৃতি

কোডটি একযোগে কার্যকর হয়, পূর্ববর্তী কমান্ডের অবস্থাকে বিরক্ত না করে প্রতিটি পদক্ষেপ কার্যকর করার জন্য অপেক্ষা করে। যদিও আমরা ক্রমানুসারে আমাদের কোড লিখেছি, অ্যাসিঙ্ক্রোনাস কোডটি কোন পদক্ষেপ সম্পূর্ণ হওয়ার অপেক্ষা না করেই কার্যকর করা হয় এবং পূর্ববর্তী কমান্ড/কোড থেকে সম্পূর্ণ স্বাধীন।

সাইপ্রাসে অ্যাসিঙ্ক্রোনাস কী?

সমস্ত সাইপ্রাস কমান্ড প্রকৃতিতে অসিঙ্ক্রোনাস। সাইপ্রেসের একটি মোড়ক রয়েছে যা আমরা যে ক্রমিক কোডটি লিখি তা বুঝতে পারে, সেগুলিকে মোড়কে জড়িয়ে রাখে এবং কোডটি চালানোর পরে পরে চালায়। সুতরাং, সাইপ্রাস আমাদের সমস্ত কাজ করে যা অ্যাসিঙ্ক প্রকৃতি এবং প্রতিশ্রুতির সাথে সম্পর্কিত!

আসুন এর জন্য একটি উদাহরণ বুঝতে পারি।

 it('click on the technology option to navigate to the technology URL', function () {
        cy.visit('https://lambdageeks.com/') // No command is executed

        //click on the technology option
        cy.get('.fl-node-5f05604c3188e > .fl-col-content > .fl-module > .fl-module-content > .fl-photo > .fl-photo-content > a > .fl-photo-img') // Nothing is executed here too
            .click() // Nothing happens yet

        cy.url() // No commands executed here too
            .should('include', '/technology') // No, nothing.
    });
        // Now, all the test functions have completed executing
        // Cypress had queued all the commands, and now they will run in sequence

এটি বেশ সহজ এবং মজাদার ছিল। আমরা এখন বুঝতে পেরেছি কিভাবে সাইপ্রেস অ্যাসিঙ্ক্রোনাস কমান্ড কাজ করে। আসুন আমরা যেখানে সিঙ্ক এবং অ্যাসিঙ্ক কোড মিশ্রিত করার চেষ্টা করছি তার গভীরে ডুব দেই।

সাইপ্রাস সিঙ্ক্রোনাস এবং অ্যাসিঙ্ক্রোনাস কমান্ড মেশানো

আমরা দেখেছি, সাইপ্রেস কমান্ডগুলি অসিঙ্ক্রোনাস। কোন সিঙ্ক্রোনাস কোড ইনজেকশন করার সময়, সাইপ্রেস সিঙ্ক কোডটি কার্যকর হওয়ার জন্য অপেক্ষা করে না; অতএব সিঙ্ক কমান্ডগুলি আগে চালানো হয় এমনকি কোন পূর্ববর্তী সাইপ্রেস কমান্ডের জন্য অপেক্ষা না করেও। আসুন আরও ভালভাবে বুঝতে একটি সংক্ষিপ্ত উদাহরণ দেখি।

 it('click on the technology option to navigate to the technology URL', function () {
        cy.visit('https://lambdageeks.com/') 

        //click on the technology option
        cy.get('.fl-node-5f05604c3188e > .fl-col-content > .fl-module > .fl-module-content > .fl-photo > .fl-photo-content > a > .fl-photo-img')
            .click() 

        cy.url() // No commands executed here too
            .should('include', '/technology') // No, nothing.
        console.log("This is to check the log")  // Log to check the async behaviour
    });
});
সাইপ্রাস প্রতিশ্রুতি এবং সাইপ্রাস অ্যাসিঙ্ক্রোনাস: হ্যান্ডস-অন বাস্তবায়ন, উদাহরণ
লগ কমান্ডের সিঙ্ক্রোনাস এক্সিকিউশন

কোডের শেষে লগ যোগ করা হয়, যা একটি সিঙ্ক কমান্ড। যখন আমরা পরীক্ষা চালাই, আপনি দেখতে পারেন যে পৃষ্ঠাটি লোড হওয়ার আগেই লগটি মুদ্রিত হয়েছে। এইভাবে, সাইপ্রেস সিঙ্ক্রোনাস কমান্ডের জন্য অপেক্ষা করে না এবং তার কমান্ডগুলি কার্যকর করার আগেও এটি চালায়।

যদি আমরা তাদের প্রত্যাশা অনুযায়ী কার্যকর করতে চাই, তাহলে আমাদের এটিকে ভিতরে মোড়ানো উচিত .then() ফাংশন আসুন একটি উদাহরণ দিয়ে বুঝতে পারি।

it('click on the technology option to navigate to the technology URL', function () {
        cy.visit('https://lambdageeks.com/') 

        //click on the technology option
        cy.get('.fl-node-5f05604c3188e > .fl-col-content > .fl-module > .fl-module-content > .fl-photo > .fl-photo-content > a > .fl-photo-img')
            .click() 

        cy.url() // No commands executed here too
            .should('include', '/technology') // No, nothing.
        .then(() => {
            console.log("This is to check the log")  // Log to check the async behaviour
        });
    });
সাইপ্রাস প্রতিশ্রুতি এবং সাইপ্রাস অ্যাসিঙ্ক্রোনাস: হ্যান্ডস-অন বাস্তবায়ন, উদাহরণ
.Then () কমান্ড দিয়ে Async এক্সিকিউশন

সাইপ্রাস প্রতিশ্রুতি কি?

আমরা উপরে দেখেছি, সাইপ্রেস কার্যকর করার আগে সমস্ত কমান্ডকে এনকিউ করে। বিস্তারিতভাবে রিপ্রেস করার জন্য, আমরা এটি বলতে পারি সাইপ্রাস প্রতিশ্রুতির শৃঙ্খলে প্রতিশ্রুতি (আদেশ) যুক্ত করে। সাইপ্রেস একটি শৃঙ্খলে প্রতিশ্রুতি হিসাবে সমস্ত আদেশের যোগফল দেয়।

প্রতিশ্রুতিগুলি বুঝতে, তাদের বাস্তব জীবনের দৃশ্যের সাথে তুলনা করুন। ব্যাখ্যাটি অসিঙ্ক্রোনাস প্রকৃতির প্রতিশ্রুতিকেও সংজ্ঞায়িত করে। যদি কেউ আপনাকে প্রতিশ্রুতি দেয়, তারা হয় প্রত্যাখ্যান or মেটান তারা যে বিবৃতি দিয়েছে। একইভাবে, অসিঙ্ক্রোনাসে, হয় প্রতিশ্রুতি প্রত্যাখ্যান or মেটান কোড আমরা একটি প্রতিশ্রুতি মোড়ানো।

যাইহোক, সাইপ্রাস সমস্ত প্রতিশ্রুতির যত্ন নেয়, এবং আমাদের কাস্টম কোড দিয়ে সেগুলি চালানো অপ্রয়োজনীয়। একটি জাভাস্ক্রিপ্ট প্রোগ্রামার হিসাবে, আমরা ব্যবহার সম্পর্কে কৌতূহল পেতে অ্যাওয়েট্সওয়াচমেন আমাদের আদেশে। সাইপ্রাস এপিআইগুলি আমরা সাধারণত যেভাবে ব্যবহার করি তার থেকে সম্পূর্ণ আলাদা। আমরা এই টিউটোরিয়ালের পরবর্তী অংশ গভীরভাবে বিবেচনা করব।

সাইপ্রাস রাজ্য প্রতিশ্রুতি

সাইপ্রাস কমান্ডের উপর ভিত্তি করে প্রতিশ্রুতির তিনটি ভিন্ন অবস্থা রয়েছে। তারা হল

  • স্থিরপ্রতিজ্ঞ - যখন পদক্ষেপ/ কমান্ড সফলভাবে কার্যকর করা হয় তখন ঘটে।
  • বিচারাধীন - যেখানে মৃত্যুদন্ড শুরু হয়েছে তা বলুন, কিন্তু ফলাফল অনিশ্চিত।
  • প্রত্যাখ্যান - ধাপটি ব্যর্থ হলে ঘটে।

একটি জাভাস্ক্রিপ্ট প্রোগ্রামার হিসাবে, আমরা আমাদের কোডে প্রতিশ্রুতি লিখি এবং সেগুলি ফিরিয়ে দেই। উদাহরণ স্বরূপ,

//This code is only for demonstration
describe('Cypress Example ', function () {
    it('click on the technology option to navigate to the technology URL', function () {
        cy.visit('https://lambdageeks.com/')

        //click on the technology option
        cy.get('.fl-node-5f05604c3188e > .fl-col-content > .fl-module > .fl-module-content > .fl-photo > .fl-photo-content > a > .fl-photo-img')
            .then(() => {
                return cy.click();
            })

        cy.url() 
            .then(() => {
                return cy.should('include', '/technology') 
            })
    });
});

এখানে, আমরা প্রতিটি কমান্ডের প্রতিশ্রুতি ফিরিয়ে দিচ্ছি। সাইপ্রাসে এর প্রয়োজন নেই। সৌভাগ্যবশত, সাইপ্রাস অভ্যন্তরীণভাবে সমস্ত প্রতিশ্রুতিগুলির যত্ন নেয় এবং আমাদের প্রতিটি পদক্ষেপে প্রতিশ্রুতি যুক্ত করার দরকার নেই। সাইপ্রেস আছে পুনরায় চেষ্টা করার ক্ষমতা বিকল্প, যেখানে এটি কমান্ড চালানোর জন্য একটি নির্দিষ্ট সময়ের জন্য পুনরায় চেষ্টা করে। আমরা ম্যানুয়ালি প্রতিশ্রুতি না দিয়ে একটি কোডের উদাহরণ দেখতে পাব।

    it('click on the technology option to navigate to the technology URL', function () {
        cy.visit('https://lambdageeks.com/')

        //click on the technology option
        cy.get('.fl-node-5f05604c3188e > .fl-col-content > .fl-module > .fl-module-content > .fl-photo > .fl-photo-content > a > .fl-photo-img')
            .click()

        cy.url()
            .should('include', '/technology')
    });
});
সাইপ্রাস প্রতিশ্রুতি এবং সাইপ্রাস অ্যাসিঙ্ক্রোনাস: হ্যান্ডস-অন বাস্তবায়ন, উদাহরণ
সাইপ্রাস অভ্যন্তরীণভাবে পরিচালিত প্রতিশ্রুতি দিয়ে আদেশ দেয়

উপরের কোডটি আনাড়ি নয় এবং পড়া এবং বোঝা সহজ। সাইপ্রাস সমস্ত প্রতিশ্রুতি কাজ পরিচালনা করে, এবং এটি ব্যবহারকারীর থেকে লুকিয়ে থাকে। সুতরাং আমাদের কোথাও প্রতিশ্রুতিগুলি পরিচালনা বা ফেরত দেওয়ার বিষয়ে চিন্তা করতে হবে না!

সাইপ্রাসে ওয়েট কিভাবে ব্যবহার করবেন?

উপরে আলোচিত হিসাবে, সাইপ্রেস এর একটি কমান্ড সারি তৈরি করে এবং সেগুলি ক্রম অনুসারে অ্যাসিঙ্ক্রোনাস কোড পরিচালনা করার উপায় রয়েছে। যোগ করা হচ্ছে awaits কমান্ডগুলি প্রত্যাশিতভাবে কাজ করবে না। যেহেতু সাইপ্রেস অভ্যন্তরীণভাবে সবকিছু পরিচালনা করছে, তাই আমি যোগ না করার পরামর্শ দেব awaits কোডে।

আপনার যদি প্রতীক্ষা যোগ করার প্রয়োজন হয়, আপনি একটি তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করতে পারেন সাইপ্রাস-প্রতিজ্ঞা যে সাইপ্রাস কিভাবে কাজ করে তা পরিবর্তন করে। এই লাইব্রেরি আপনাকে ব্যবহার করতে দেবে প্রতিশ্রুতি কমান্ডে, এবং ব্যবহার করুন অপেক্ষায় রয়েছেন কোডে

আসুন আমরা প্রতীক্ষাগুলি ব্যবহার করার উপায়গুলি এবং কীভাবে সেগুলি ব্যবহার না করি তা বুঝতে পারি।

আপনি এই মত অপেক্ষা ব্যবহার করা উচিত নয়

//Do not use await this way
describe('Visit the page', () => {
  (async () => {
     cy.visit('https://lambdageeks.com/')
     await cy.url().should('include', '/technology');
  })()
})

পরিবর্তে, আপনি এই মত ব্যবহার করতে পারেন

describe('Visit the page', () => {
  cy.visit('https://lambdageeks.com/').then(async () => await cy.url().should('include', '/technology') ())
})

এটি যে কোন সাইপ্রেস কমান্ডের জন্য কাজ করবে।

সাইপ্রেস মোড়ানো

wrap() সাইপ্রাসে একটি ফাংশন যা যুক্তি হিসাবে পাস করা যে কোনও বস্তু উত্পাদন করে।

বাক্য গঠন

cy.wrap(subject)
cy.wrap(subject, options)

আসুন কিভাবে অ্যাক্সেস করা যায় তার একটি উদাহরণ দেখি wrap() আমাদের কোডে।

const getName = () => {
  return 'Horse'
}

cy.wrap({ name: getName }).invoke('name').should('eq', 'Horse') // true

উদাহরণে, আমরা getName এবং তারপর এটি জন্য নাম আহ্বান।

সাইপ্রাস মোড়ানো প্রতিশ্রুতি

আমরা কোড দ্বারা ফেরত যে প্রতিশ্রুতি মোড়ানো করতে পারেন। কমান্ডগুলি ফলিত মান অ্যাক্সেস করার আগে প্রতিশ্রুতি সমাধানের জন্য অপেক্ষা করবে এবং। তারপর পরবর্তী কমান্ড বা দাবির জন্য এগিয়ে যান।

const customPromise = new Promise((resolve, reject) => {
  // we use setTimeout() function to access async code.
  setTimeout(() => {
    resolve({
      type: 'success',
      message: 'Apples and Oranges',
    })
  }, 2500)
})

it('should wait for promises to resolve', () => {
  cy.wrap(customPromise).its('message').should('eq', 'Apples and Oranges')
});

যখন যুক্তি cy.wrap() এটি একটি প্রতিশ্রুতি, এটি প্রতিশ্রুতি সমাধানের জন্য অপেক্ষা করবে। যদি প্রতিশ্রুতি প্রত্যাখ্যান করা হয়, তাহলে পরীক্ষা ব্যর্থ হবে।

সাইপ্রেস-প্রতিশ্রুতি npm

যদি আমরা সাইপ্রেস এর প্রতিশ্রুতিগুলি হেরফের করতে চাই, তাহলে আমরা অতিরিক্তভাবে একটি লাইব্রেরি বা প্যাকেজ ব্যবহার করতে পারি সাইপ্রাস-প্রতিজ্ঞা এবং এটি আমাদের কোডে অন্তর্ভুক্ত করুন। এই প্যাকেজটি আপনাকে একটি সাইপ্রাস কমান্ডকে প্রতিশ্রুতিতে রূপান্তর করার অনুমতি দেবে এবং আপনাকে কোডে অপেক্ষা বা অ্যাসিঙ্ক করার অনুমতি দেবে। যাইহোক, এই শর্তগুলি কাজ করবে না before or beforeEach ব্লক প্রাথমিকভাবে, আমাদের টার্মিনালে নিম্নলিখিত কমান্ডটি দিয়ে আমাদের প্রকল্পে প্যাকেজটি ইনস্টল করা উচিত।

npm i cypress-promise

একবার ইনস্টল হয়ে গেলে, টার্মিনালটি দেখতে এরকম কিছু হবে।

সাইপ্রাস প্রতিশ্রুতি এবং সাইপ্রাস অ্যাসিঙ্ক্রোনাস: হ্যান্ডস-অন বাস্তবায়ন, উদাহরণ
সাইপ্রেস-প্রতিশ্রুতি ইনস্টল

ইনস্টলেশনের পরে, আমাদের লাইব্রেরিটি আমাদের পরীক্ষা ফাইলে আমদানি করা উচিত।

import promisify from 'cypress-promise'

এই লাইব্রেরির সাহায্যে, আপনি স্থানীয় সাইপ্রাস প্রতিশ্রুতি তৈরি এবং ওভাররাইড করতে পারেন এবং কোডে awaits এবং async ব্যবহার করতে পারেন। আপনি সঙ্গে প্রতিশ্রুতি অ্যাক্সেস করা উচিত promisify কীওয়ার্ড আসুন আমরা এর জন্য একটি উদাহরণ দেখি।

import promisify from 'cypress-promise'

it('should run tests with async/await', async () => {
    const apple = await promisify(cy.wrap('apple'))
    const oranges = await promisify(cy.wrap('oranges'))

    expect(apple).to.equal('apple')
    expect(oranges).to.equal('oranges')
});
সাইপ্রাস প্রতিশ্রুতি এবং সাইপ্রাস অ্যাসিঙ্ক্রোনাস: হ্যান্ডস-অন বাস্তবায়ন, উদাহরণ
সাইপ্রাস-প্রতিশ্রুতিতে প্রতিশ্রুতি দিন

এটি শেখার জন্য খুব সহজ এবং মজাদার ছিল! এইভাবে, আপনি সাইপ্রাসে অ্যাসিঙ্ক্রোনাস কোড বরাদ্দ করতে পারেন।

সাইপ্রাস অ্যাসিঙ্ক টাস্ক

task() সাইপ্রাসের একটি ফাংশন যা নোডে কোড চালায়। এই কমান্ডটি আপনাকে ব্রাউজার থেকে নোডে স্যুইচ করতে এবং কোডে ফলাফল ফেরত দেওয়ার আগে নোডে কমান্ড চালানোর অনুমতি দেয়।

বাক্য গঠন

cy.task(event)
cy.task(event, arg)
cy.task(event, arg, options)

task() একটি মান বা প্রতিশ্রুতি প্রদান করে। task() প্রতিশ্রুতি ফেরত দিলে ব্যর্থ হবে undefined। এইভাবে, এটি ব্যবহারকারীকে টাইপোস ক্যাপচার করতে সাহায্য করে যেখানে ইভেন্টটি কিছু পরিস্থিতিতে পরিচালিত হয় না। যদি আপনার কোন মান ফেরত দেওয়ার প্রয়োজন না হয়, তাহলে পাস করুন null মান।

সচরাচর জিজ্ঞাস্য

সাইপ্রেস কি সিঙ্ক্রোনাস নাকি অ্যাসিঙ্ক্রোনাস?

সাইপ্রেস হল অসমনিয়ত কমান্ডগুলি কার্যকর করার জন্য অপেক্ষা করার পরিবর্তে সারিবদ্ধ কমান্ডগুলি ফেরত দিয়ে। যদিও এটি অসিঙ্ক্রোনাস, এটি এখনও সমস্ত পরীক্ষার ধাপগুলি ক্রমানুসারে চালায়। সাইপ্রাস ইঞ্জিন এই সমস্ত আচরণ পরিচালনা করে।

সাইপ্রাসে কি প্রতিশ্রুতি চেইন ধরা সম্ভব?

সাইপ্রাস এমনভাবে ডিজাইন করা হয়েছে যে আমরা প্রতিশ্রুতিগুলি ধরতে পারব না। এই আদেশগুলি ঠিক প্রতিশ্রুতি নয়, তবে এটি একটি প্রতিশ্রুতির মতো দেখাচ্ছে। এইভাবে, আমরা যেমন স্পষ্ট হ্যান্ডলার যোগ করতে পারি না catch.

Aboutশ্বরিয়া লক্ষ্মী সম্পর্কে

সাইপ্রাস প্রতিশ্রুতি এবং সাইপ্রাস অ্যাসিঙ্ক্রোনাস: হ্যান্ডস-অন বাস্তবায়ন, উদাহরণআমি একটি পরীক্ষার উত্সাহী এবং পরীক্ষার ডোমেনে প্রায় 2+ বছরের অভিজ্ঞতা আছে। আমি পরীক্ষার বিষয়ে আগ্রহী এবং আমার ক্ষেত্রে নতুন জিনিসগুলি অন্বেষণ করতে এবং সেগুলি আমার সমবয়সীদের সাথে ভাগ করে নিতে ভালোবাসি। আমি আমার ফ্রি সময়ে সবচেয়ে সহজ তবে কার্যকর উপায়ে ব্লগ লেখা উপভোগ করি। পরীক্ষক হিসাবে, আমি নিখুঁত জিনিস পেতে পছন্দ করি, তাই আমি আমার পাঠকদের প্রযুক্তির নিখুঁত বোঝার আশা করি। আমি পরীক্ষার সাথে সম্পর্কিত নতুন প্রযুক্তিগুলির সাথে নিজেকে আপডেট রাখি এবং সেগুলি বোঝার জন্য সময় ব্যয় করি। শিক্ষার্থীদের পরীক্ষার ধারণাগুলি বুঝতে সাহায্য করতে পেরে আমি আনন্দিত।
লিঙ্কডইন - https://www.linkedin.com/in/aishwarya-lakshmi-n-46903217a এর মাধ্যমে সংযোগ করি

en English
X