ফ্ল্যাকি অটোমেশন পরীক্ষাগুলি QA ইঞ্জিনিয়ারদের জন্য ক্ষতিকর হতে পারে, অনিশ্চয়তার পরিচয় দিতে পারে এবং টেস্ট স্যুটগুলির নির্ভরযোগ্যতা হ্রাস করতে পারে। একজন SDET এবং QA অটোমেশন পরামর্শদাতা হিসাবে আমার অভিজ্ঞতা থেকে অঙ্কন করে, এই নিবন্ধটি অস্থিরতাকে জয় করার জন্য ব্যবহারিক পরামর্শ দেয়। যদিও আমি জাভাস্ক্রিপ্ট এবং নাট্যকারের উদাহরণগুলি প্রদান করব, এই সর্বজনীন টিপসগুলি যে কোনও ভাষা এবং কাঠামোতে প্রযোজ্য, যা আপনাকে শক্তিশালী এবং নির্ভরযোগ্য অটোমেশন পরীক্ষা লিখতে সহায়তা করে৷ আসুন ডুবে যাই এবং নিশ্চিত করি যে আপনার পরীক্ষাগুলি দৃঢ়ভাবে দাঁড়িয়েছে।
মাঝে মাঝে, আপনি এমন পরিস্থিতির সম্মুখীন হবেন যেখানে আপনাকে DOM-এ উপাদানগুলি উপস্থিত হওয়ার জন্য বা আপনার পরীক্ষার দৃশ্যের সাথে এগিয়ে যাওয়ার জন্য একটি নির্দিষ্ট অবস্থায় পৌঁছানোর জন্য আপনার আবেদনের জন্য অপেক্ষা করতে হবে। এমনকি আধুনিক, বুদ্ধিমান অটোমেশন ফ্রেমওয়ার্ক যেমন প্লেরাইটের স্বয়ংক্রিয়-অপেক্ষা বৈশিষ্ট্যগুলির সাথে, এমন উদাহরণ থাকবে যেখানে আপনাকে কাস্টম অপেক্ষা পদ্ধতিগুলি প্রয়োগ করতে হবে। উদাহরণস্বরূপ, পাঠ্য ক্ষেত্র এবং একটি নিশ্চিতকরণ বোতাম সহ একটি দৃশ্য বিবেচনা করুন। নির্দিষ্ট সার্ভার-সাইড আচরণের কারণে, ফর্মটি পূরণ করার প্রায় পাঁচ সেকেন্ড পরে নিশ্চিতকরণ বোতামটি দৃশ্যমান হয়। এই ধরনের ক্ষেত্রে, দুটি পরীক্ষার ধাপের মধ্যে পাঁচ-সেকেন্ডের অন্তর্নিহিত অপেক্ষা ঢোকানোর প্রলোভন প্রতিরোধ করা অপরিহার্য।
textField.fill('Some text') waitForTime(5000) confirmationButton.click()
পরিবর্তে একটি স্মার্ট পদ্ধতি ব্যবহার করুন এবং সঠিক অবস্থার জন্য অপেক্ষা করুন। এটি কিছু লোড হওয়ার পরে প্রদর্শিত পাঠ্য উপাদান বা বর্তমান পদক্ষেপটি সফলভাবে সম্পন্ন হওয়ার পরে একটি লোডার স্পিনিং উপাদান অদৃশ্য হয়ে যেতে পারে। আপনি পরবর্তী পরীক্ষার ধাপের জন্য প্রস্তুত কিনা তা পরীক্ষা করতে পারেন।
button.click() waitFor(textField.isVisible()) textField.fill()
অবশ্যই, এমন কিছু ক্ষেত্রে রয়েছে যেখানে আপনাকে এমন কিছুর জন্য অপেক্ষা করতে হবে যা আপনি স্মার্টলি পরীক্ষা করতে পারবেন না। আমি এই ধরনের জায়গায় মন্তব্য যোগ করার বা এমনকি আপনার অপেক্ষার পদ্ধতিতে প্যারামিটার হিসাবে কারণ ব্যাখ্যা যোগ করার পরামর্শ দিচ্ছি বা এরকম কিছু:
waitForTime(5000, {reason: "For unstable server processed something..."}
এটি ব্যবহার করার একটি অতিরিক্ত লাভ হল পরীক্ষার রিপোর্ট যেখানে আপনি এই ধরনের ব্যাখ্যাগুলি সংরক্ষণ করতে পারেন যাতে এটি অন্য কারও জন্য বা এমনকি ভবিষ্যতের জন্যও স্পষ্ট হয়ে উঠবে যে আপনি এখানে কী এবং কেন পাঁচ সেকেন্ড অপেক্ষা করছেন।
waitForTime(5000, {reason: "For unstable server processed something..."} button.click() waitFor(textField.isVisible()) textField.fill()
লোকেটারগুলি অটোমেশন পরীক্ষার একটি গুরুত্বপূর্ণ অংশ এবং সবাই এটি জানে৷ যাইহোক, এই সহজ সত্য সত্ত্বেও, অনেক অটোমেশন ইঞ্জিনিয়ার স্থিতিশীলতার উপর নির্ভর করছে এবং তাদের পরীক্ষায় এই জাতীয় কিছু ব্যবহার করছে।
//*[@id="editor_7"]/section/div[2]/div/h3[2]
এটি একটি মূর্খ দৃষ্টিভঙ্গি কারণ DOM কাঠামো এতটা স্থির নয়; কিছু ভিন্ন দল কখনও কখনও এটি পরিবর্তন করতে পারে, এবং এটি আপনার পরীক্ষা ব্যর্থ হওয়ার পরে। সুতরাং, শক্তিশালী লোকেটার ব্যবহার করুন। যাইহোক, আমার XPath-সম্পর্কিত গল্প পড়ার জন্য আপনাকে স্বাগতম।
একক থ্রেডে একাধিক পরীক্ষা সহ টেস্ট স্যুট চালানোর সময়, প্রতিটি পরীক্ষা স্বাধীন কিনা তা নিশ্চিত করা অত্যন্ত গুরুত্বপূর্ণ। এর মানে হল যে প্রথম পরীক্ষাটি সিস্টেমটিকে তার আসল অবস্থায় ফিরিয়ে দেওয়া উচিত যাতে পরবর্তী পরীক্ষাটি অপ্রত্যাশিত অবস্থার কারণে ব্যর্থ না হয়। উদাহরণস্বরূপ, যদি আপনার কোনো একটি পরীক্ষা LocalStorage-এ সংরক্ষিত ব্যবহারকারীর সেটিংস পরিবর্তন করে, প্রথম পরীক্ষা চালানোর পরে ব্যবহারকারী সেটিংসের জন্য LocalStorage এন্ট্রিটি সাফ করা একটি ভাল পদ্ধতি। এটি নিশ্চিত করে যে দ্বিতীয় পরীক্ষাটি ডিফল্ট ব্যবহারকারী সেটিংসের সাথে কার্যকর করা হবে। আপনি পৃষ্ঠাটিকে ডিফল্ট এন্ট্রি পৃষ্ঠায় পুনরায় সেট করা এবং কুকিজ এবং ডাটাবেস এন্ট্রিগুলি সাফ করার মতো পদক্ষেপগুলিও বিবেচনা করতে পারেন যাতে প্রতিটি নতুন পরীক্ষা অভিন্ন প্রাথমিক শর্তগুলির সাথে শুরু হয়।
উদাহরণস্বরূপ, নাট্যকারে, আপনি এটি অর্জন করতে beforeAll(), beforeEach(), afterAll(), এবং afterEach() টীকা ব্যবহার করতে পারেন।
কয়েকটা পরীক্ষা দিয়ে পরবর্তী টেস্ট স্যুট চেক করুন। প্রথমটি ব্যবহারকারীর চেহারা সেটিংস পরিবর্তন করছে, এবং দ্বিতীয়টি ডিফল্ট চেহারা পরীক্ষা করছে।
test.describe('Test suite', () => { test('TC101 - update appearance settings to dark', async ({page}) => { await user.goTo(views.settings); await user.setAppearance(scheme.dark); }); test('TC102 - check if default appearance is light', async ({page}) => { await user.goTo(views.settings); await user.checkAppearance(scheme.light); }); });
যদি এই ধরনের একটি পরীক্ষা স্যুট সমান্তরালভাবে চলে, সবকিছু মসৃণভাবে চলবে। যাইহোক, যদি এই পরীক্ষাগুলি একে একে চালানো হয় তবে আপনি একটি ব্যর্থ পরীক্ষার মুখোমুখি হতে পারেন কারণ তাদের মধ্যে একটি অন্যটির সাথে হস্তক্ষেপ করছে। প্রথম পরীক্ষা আলো থেকে অন্ধকারে চেহারা পরিবর্তন করে। দ্বিতীয় পরীক্ষাটি বর্তমান চেহারা হালকা কিনা তা পরীক্ষা করে। কিন্তু এটি ব্যর্থ হবে যেহেতু প্রথম পরীক্ষাটি ইতিমধ্যেই ডিফল্ট চেহারা পরিবর্তন করেছে।
এই ধরনের একটি সমস্যা সমাধানের জন্য, আমি প্রতিটি পরীক্ষার পরে সম্পাদিত afterEach() হুক যোগ করেছি। এই ক্ষেত্রে, এটি ডিফল্ট ভিউতে নেভিগেট করবে এবং স্থানীয় স্টোরেজ থেকে সরিয়ে ব্যবহারকারীর চেহারা পরিষ্কার করবে।
test.afterEach(async ({ page }) => { await user.localStorage(appearanceSettings).clear() await user.goTo(views.home) }); test.describe('Test suite', () => { test('TC101 - update appearance settings to dark', async ({page}) => { await user.goto(views.settings); await user.setAppearance(scheme.dark); }); test('TC102 - check if default appearance is light', async ({page}) => { await user.goTo(views.settings); await user.checkAppearance(scheme.light); }); });
এই পদ্ধতি ব্যবহার করে, এই স্যুটের প্রতিটি পরীক্ষা স্বাধীন হবে।
ফ্ল্যাকি পরীক্ষার সম্মুখীন হতে কেউই অনাক্রম্য নয়, এবং এই সমস্যার একটি জনপ্রিয় প্রতিকার হল পুনঃপ্রচার ব্যবহার করা। CI/CD কনফিগারেশন স্তরেও আপনি স্বয়ংক্রিয়ভাবে ঘটতে পুনরায় চেষ্টা কনফিগার করতে পারেন। উদাহরণস্বরূপ, আপনি প্রতিটি ব্যর্থ পরীক্ষার জন্য স্বয়ংক্রিয় পুনঃপ্রচার সেট আপ করতে পারেন, সর্বোচ্চ তিনবার পুনঃপ্রচেষ্টা গণনা নির্দিষ্ট করে। যেকোন পরীক্ষা যে প্রাথমিকভাবে ব্যর্থ হয় পরীক্ষা সম্পাদন চক্র সম্পূর্ণ না হওয়া পর্যন্ত তিনবার পর্যন্ত পুনরায় চেষ্টা করা হবে। সুবিধা হল যে যদি আপনার পরীক্ষাটি সামান্য ফ্লেকি হয়, তবে এটি কয়েকবার পুনরায় চেষ্টা করার পরে পাস হতে পারে।
যাইহোক, খারাপ দিক হল এটি ব্যর্থ হতে পারে, যার ফলে অতিরিক্ত রানটাইম খরচ হয়। অধিকন্তু, এই অভ্যাসটি অসাবধানতাবশত ফ্ল্যাকি টেস্টের সঞ্চয়ের দিকে পরিচালিত করতে পারে, কারণ অনেক পরীক্ষা দ্বিতীয় বা তৃতীয় প্রচেষ্টায় "পাস" বলে মনে হতে পারে এবং আপনি তাদের ভুলভাবে স্থিতিশীল হিসাবে লেবেল করতে পারেন। অতএব, আমি আপনার সম্পূর্ণ পরীক্ষা প্রকল্পের জন্য বিশ্বব্যাপী স্বয়ংক্রিয়-পুনঃপ্রচার সেট করার সুপারিশ করছি না। পরিবর্তে, আপনি পরীক্ষায় অন্তর্নিহিত সমস্যাগুলি অবিলম্বে সমাধান করতে পারবেন না এমন ক্ষেত্রে বেছে বেছে পুনরায় চেষ্টা করুন।
উদাহরণ স্বরূপ, ভান করুন আপনার একটি টেস্ট কেস আছে যেখানে আপনাকে 'ফাইলচ্যুজার' ইভেন্ট ব্যবহার করে কিছু ফাইল আপলোড করতে হবে। আপনি ইভেন্ট 'filechooser' এর জন্য অপেক্ষা করার সময় <Timeout exceeded> ত্রুটি পেয়েছেন, যা নির্দেশ করে যে নাট্যকার পরীক্ষা একটি 'filechooser' ইভেন্ট হওয়ার জন্য অপেক্ষা করছে কিন্তু বেশি সময় নিচ্ছে।
async function uploadFile(page: Page, file) { const fileChooserPromise = page.waitForEvent('filechooser'); await clickOnElement(page, uploadButton); const fileChooser = await fileChooserPromise; await fileChooser.setFiles(file); }
এটি বিভিন্ন কারণে হতে পারে, যেমন অ্যাপ্লিকেশনে অপ্রত্যাশিত আচরণ বা ধীর পরিবেশ। কারণ এটি এলোমেলো আচরণ, আপনি এই পরীক্ষার জন্য স্বয়ংক্রিয় পুনঃপ্রচেষ্টা ব্যবহার করার বিষয়ে প্রথমেই ভাবতে পারেন৷ যাইহোক, যদি আপনি সম্পূর্ণ পরীক্ষাটি পুনরায় চেষ্টা করেন, তাহলে আপনি অতিরিক্ত সময় নষ্ট করার এবং আপলোডফাইল() পদ্ধতিতে প্রথম ত্রুটির সাথে একই আচরণ পাওয়ার ঝুঁকিতে থাকবেন, তাই যদি ত্রুটিটি ঘটে তবে আপনাকে সম্পূর্ণ পরীক্ষাটি পুনরায় চেষ্টা করার দরকার নেই।
এটি করার জন্য, আপনি স্ট্যান্ডার্ড try…catch স্টেটমেন্ট ব্যবহার করতে পারেন।
async function uploadFile(page: Page, file) { const maxRetries = 3; let retryCount = 0; while (retryCount < maxRetries) { try { const fileChooserPromise = page.waitForEvent('filechooser'); await clickOnElement(page, uploadButton); const fileChooser = await fileChooserPromise; await fileChooser.setFiles(file); break; // Success, exit the loop } catch (error) { console.error(`Attempt ${retryCount + 1} failed: ${error}`); retryCount++; } } }
এই ধরনের পদ্ধতি অতিরিক্ত সময় বাঁচাবে এবং আপনার পরীক্ষাকে কম ফ্লেকি করে তুলবে।
সমাপ্তিতে, নির্ভরযোগ্য অটোমেশন পরীক্ষার পথ সোজা। আপনি কমন বা সক্রিয়ভাবে সাধারণ চ্যালেঞ্জ মোকাবেলা করতে পারেন এবং বুদ্ধিমান কৌশল বাস্তবায়ন করতে পারেন। মনে রাখবেন, এই যাত্রা চলমান, এবং আপনার পরীক্ষাগুলি অধ্যবসায়ের সাথে আরও নির্ভরযোগ্য হয়ে উঠবে। অস্থিরতাকে বিদায় জানান এবং স্থায়িত্বকে স্বাগত জানান। মানের প্রতি আপনার প্রতিশ্রুতি প্রকল্পের সাফল্য নিশ্চিত করে। শুভ পরীক্ষা!
এছাড়াও এখানে প্রকাশিত.