Detox হল মোবাইল অ্যাপ্লিকেশনের gray-box E2E টেস্টিংয়ের জন্য একটি ফ্রেমওয়ার্ক, যা Wix টিম React Native প্রজেক্টের জন্য বিশেষভাবে তৈরি করেছে। black-box পদ্ধতির বিপরীতে, Detox-এর অ্যাপ্লিকেশনের অভ্যন্তরীণ অবস্থায় অ্যাক্সেস রয়েছে, যা ম্যানুয়াল টাইমআউট ছাড়াই স্বয়ংক্রিয়ভাবে সিঙ্ক্রোনাইজ করতে দেয়। Wix Engineering, 2026-এর মতে, স্বয়ংক্রিয় সিঙ্ক্রোনাইজেশন ঐতিহ্যগত বিরতির তুলনায় টেস্ট রানের সময় 40% কমিয়ে দেয়।
মূল বিষয়
Detox হল মোবাইল অ্যাপ্লিকেশনের এন্ড-টু-এন্ড (E2E) টেস্টিংয়ের জন্য একটি ফ্রেমওয়ার্ক, যা Wix 2017 সালে তৈরি করেছে। এটি React Native প্রজেক্টের জন্য ডিজাইন করা হয়েছে তবে iOS এবং Android-এ সম্পূর্ণ নেটিভ অ্যাপ্লিকেশনও সমর্থন করে। Detox gray-box মডেলে কাজ করে, যার অর্থ এটির অ্যাপ্লিকেশনের অভ্যন্তরীণ প্রক্রিয়াগুলিতে অ্যাক্সেস রয়েছে।
Detox এবং Appium বা Calabash-এর মধ্যে প্রধান পার্থক্য হল অ্যাপ্লিকেশনের সাথে স্বয়ংক্রিয় সিঙ্ক্রোনাইজেশন। ফ্রেমওয়ার্কটি পরবর্তী কাজ সম্পাদনের আগে অ্যানিমেশন, নেটওয়ার্ক অনুরোধ এবং ইভেন্ট প্রক্রিয়াকরণ সম্পূর্ণ হওয়ার জন্য অপেক্ষা করে। এটি Thread.sleep() বা waitForElement-এর প্রয়োজনীয়তা সম্পূর্ণরূপে দূর করে, যা টেস্টগুলিকে ধীর করে দেয়।
Detox iOS (XCTest এবং Xcode-এর মাধ্যমে) এবং Android (Espresso এবং UI Automator-এর মাধ্যমে) সমর্থন করে। React Native অ্যাপ্লিকেশনের জন্য, Fabric এবং পুরানো আর্কিটেকচারের জন্য সম্পূর্ণ সমর্থন প্রদান করা হয়। iOS-এ, টেস্টগুলি সিমুলেটরে চলে; Android-এ, এমুলেটর বা বাস্তব ডিভাইসে।
Detox আর্কিটেকচার তিনটি মূল উপাদান নিয়ে গঠিত: Detox CLI, Detox টেস্ট রানার এবং Detox Native Driver। Detox CLI অ্যাপ্লিকেশন বিল্ড, ইনস্টলেশন এবং টেস্ট এক্সিকিউশন পরিচালনা করে। টেস্ট রানার (Jest বা Mocha) টেস্ট পরিস্থিতি সম্পাদন করে এবং WebSocket-এর মাধ্যমে অ্যাপ্লিকেশনের সাথে যোগাযোগ করে।
Gray-box টেস্টিং মানে Detox-এর একটি নেটিভ ব্রিজের মাধ্যমে অ্যাপ্লিকেশনের অভ্যন্তরীণ অবস্থায় অ্যাক্সেস রয়েছে। ফ্রেমওয়ার্কটি নেটওয়ার্ক অনুরোধ, অ্যানিমেশন, টাইমার এবং অপারেশন সারি পর্যবেক্ষণ করে। যখন সমস্ত সারি খালি হয়, Detox অ্যাপ্লিকেশনটিকে পরবর্তী ধাপের জন্য প্রস্তুত বিবেচনা করে।
সিঙ্ক্রোনাইজেশন অ্যাপ্লিকেশনের মেইন থ্রেড পর্যবেক্ষণের উপর ভিত্তি করে। Detox অপেক্ষা করে যতক্ষণ না সমস্ত অ্যানিমেশন সম্পূর্ণ হয়, HTTP অনুরোধ উত্তর ফেরত দেয় এবং ইভেন্ট হ্যান্ডলার সম্পাদন শেষ করে। যদি কোনো টেস্ট অসীম অ্যানিমেশনের কারণে হ্যাং হয়ে যায়, আপনি একটি নির্দিষ্ট কোড ব্লকের জন্য ম্যানুয়ালি সিঙ্ক্রোনাইজেশন নিষ্ক্রিয় করতে পারেন।
// সমস্যা বিভাগের জন্য সিঙ্ক্রোনাইজেশন নিষ্ক্রিয় করা
await device.disableSynchronization();
// দীর্ঘ অ্যানিমেশন সহ ক্রিয়া
await element(by.id('loader')).swipe('down');
await device.enableSynchronization();
Detox ইনস্টলেশন npm বা yarn-এর মাধ্যমে প্যাকেজ যোগ করার মাধ্যমে শুরু হয়। ইনস্টলেশনের পরে, আপনাকে একটি কনফিগারেশন ফাইল .detoxrc.js তৈরি করতে হবে, যা প্রতিটি প্ল্যাটফর্মের জন্য বিল্ড এবং রান সেটিংস বর্ণনা করে। Detox iOS-এর জন্য নিজস্ব বিল্ড টাইপ ব্যবহার করে, যা Xcode কনফিগারেশনের উপর ভিত্তি করে।
কনফিগারেশনে অ্যাপ্লিকেশনের পাথ (app), বিল্ডার টাইপ (build), বিল্ড আর্গুমেন্ট এবং ডিভাইস সেটিংস (device) অন্তর্ভুক্ত। iOS-এর জন্য appleSimulator ব্যবহার করা হয়, Android-এর জন্য androidEmulator। আপনি সিমুলেটরের ভাষা বা অঞ্চলের মতো লঞ্চ আর্গুমেন্টও নির্দিষ্ট করতে পারেন।
// .detoxrc.js — কনফিগারেশন উদাহরণ
module.exports = {
testRunner: { args: { '$0': 'jest', config: 'e2e/config.json' } },
apps: {
'ios.debug': { type: 'ios.app', build: 'xcodebuild ...' },
'android.debug': { type: 'android.apk', build: 'cd android && ./gradlew ...' }
},
devices: {
simulator: { type: 'ios.simulator', device: { type: 'iPhone 15' } },
emulator: { type: 'android.emulator', device: { avdName: 'Pixel_4_API_34' } }
}
};
কনফিগারেশনের পরে, নিম্নলিখিত কমান্ডগুলি উপলব্ধ: detox build — টেস্ট ফ্ল্যাগ সহ অ্যাপ্লিকেশন তৈরি করে, এবং detox test — টেস্ট চালায়। Detox --workers ফ্ল্যাগ ব্যবহার করে একাধিক ডিভাইসে সমান্তরাল নির্বাহ সমর্থন করে।
Detox টেস্টগুলি JavaScript বা TypeScript-এ একটি API ব্যবহার করে লেখা হয় যা এলিমেন্ট অনুসন্ধান (matchers) এবং ক্রিয়াকলাপের (actions) উপর ভিত্তি করে। Matchers আপনাকে শনাক্তকারী, টেক্সট, টাইপ বা স্ক্রিনে অবস্থান দ্বারা একটি এলিমেন্ট খুঁজে পেতে দেয়। ক্রিয়াগুলি ট্যাপ, টেক্সট ইনপুট, সোয়াইপ এবং স্ক্রোল সম্পাদন করে।
একটি সাধারণ টেস্ট এই ক্রম অনুসরণ করে: একটি এলিমেন্ট খুঁজুন → একটি ক্রিয়া সম্পাদন করুন → ফলাফল যাচাই করুন। যাচাইয়ের জন্য, expect API উপস্থিতি, দৃশ্যমানতা বা এলিমেন্ট টেক্সটের জন্য matchers-এর সাথে ব্যবহার করা হয়। Detox Jest-এর সাথে ইন্টিগ্রেশনের মাধ্যমে describe/it সিনট্যাক্স সমর্থন করে।
describe('Login flow', () => {
beforeEach(async () => {
await device.reloadReactNative();
});
it('should log in with valid credentials', async () => {
await element(by.id('emailInput')).typeText('user@test.com');
await element(by.id('passwordInput')).typeText('password123');
await element(by.id('loginButton')).tap();
await expect(element(by.id('homeScreen'))).toBeVisible();
});
});
Detox সমস্ত জনপ্রিয় জেসচার সমর্থন করে: tap, longPress, swipe, scroll, pinch, multiTap। scroll-এর জন্য আপনি দিক, গতি এবং থামার অবস্থান নির্দিষ্ট করতে পারেন। এটি pull-to-refresh বা ক্যারোসেলের মতো জটিল পরিস্থিতি পরীক্ষা করতে দেয়।
Detox জনপ্রিয় CI সিস্টেমের সাথে ভালভাবে ইন্টিগ্রেট হয়: GitHub Actions, CircleCI, Bitrise এবং Jenkins। CI-তে চালানোর জন্য, আপনাকে একটি ভার্চুয়াল iOS সিমুলেটর (GUI ছাড়া) এবং হার্ডওয়্যার এক্সিলারেশন সহ একটি Android এমুলেটর সেট আপ করতে হবে। Detox ব্যর্থ টেস্ট বিশ্লেষণের জন্য আর্টিফ্যাক্ট — স্ক্রিনশট এবং লগ — প্রদান করে।
CI-তে টেস্ট রানের গতি বাড়ানোর জন্য, --workers ফ্ল্যাগের সাথে শার্ডিং (সমান্তরালকরণ) ব্যবহার করার পরামর্শ দেওয়া হয়। Detox স্বয়ংক্রিয়ভাবে একাধিক সিমুলেটরে টেস্ট ফাইল বিতরণ করে। বিল্ড সময় কমাতে রানের মধ্যে অ্যাপ্লিকেশন বিল্ড ক্যাশ করাও উপযোগী।
# GitHub Actions — iOS-এ Detox চালানো
- name: Install Dependencies
run: npm ci
- name: Build Detox App
run: npx detox build --configuration ios.sim
- name: Run Detox Tests
run: npx detox test --configuration ios.sim --workers 2
timeout-minutes: 30
স্থিতিশীল এবং দ্রুত E2E টেস্টের জন্য, বেশ কয়েকটি নিয়ম অনুসরণ করার পরামর্শ দেওয়া হয়। sleep() এড়িয়ে চলুন — Detox স্বয়ংক্রিয় সিঙ্ক্রোনাইজেশন প্রদান করে, এবং স্পষ্ট বিলম্ব শুধুমাত্র টেস্টগুলিকে ধীর করে এবং অস্থিতিশীল করে তোলে। যদি সময়ের সমস্যার কারণে কোনো টেস্ট ব্যর্থ হয়, প্রথমে পরীক্ষা করুন সিঙ্ক্রোনাইজেশন নিষ্ক্রিয় আছে কিনা। বৈশিষ্ট্য অনুসারে টেস্টগুলিকে গ্রুপ করা এবং সেগুলিকে স্বাধীনভাবে চালানোও উপযোগী — এটি ব্যর্থতার কারণ খুঁজে পাওয়া সহজ করে।
Detox অবস্থা পরিচালনার জন্য বেশ কয়েকটি device পদ্ধতি প্রদান করে: device.reloadReactNative() বান্ডেল পুনরায় লোড করে, device.launchNewApp() নতুন প্যারামিটার সহ অ্যাপ্লিকেশন চালু করে, device.sendToHome() অ্যাপ্লিকেশনটি ছোট করে। device.setURLBlacklist() আপনাকে সিঙ্ক্রোনাইজেশন থেকে নির্দিষ্ট URL বাদ দেওয়ার অনুমতি দেয়, যা বিশ্লেষণ এবং long-polling সংযোগের জন্য উপযোগী।
প্রতিটি টেস্টের জন্য, একটি পৃথক অবস্থা তৈরি করার পরামর্শ দেওয়া হয়। device.reloadReactNative()-এর মাধ্যমে অ্যাপ্লিকেশন পুনরায় লোড করতে beforeEach ব্যবহার করুন। নির্দিষ্ট ডেটার প্রয়োজন এমন টেস্টের জন্য, সার্ভারে ডেটা প্রস্তুত করতে ফ্যাক্টরি বা API ক্লায়েন্ট তৈরি করুন। টেস্টের মধ্যে নির্ভরতা এড়িয়ে চলুন — প্রতিটি টেস্ট স্বাধীন হওয়া উচিত।
Detox web.element() এবং web.invoke() পদ্ধতির মাধ্যমে WebView টেস্টিং সমর্থন করে। ওয়েব এলিমেন্টের সাথে ইন্টারঅ্যাক্ট করার জন্য, by.web](:id, css বা className ব্যবহার করা হয়। এটি মনে রাখা গুরুত্বপূর্ণ যে WebView-এর অতিরিক্ত লোডিং সময় প্রয়োজন — যদি সিঙ্ক্রোনাইজেশন কাজ না করে, waitFor ব্যবহার করে লোডিং অপেক্ষা যোগ করুন।
// Detox-এ WebView টেস্টিং
const webView = web(by.id('webview'));
await webView.element(by.web.cssSelector('#submit-btn')).tap();
const result = await webView.element(
by.web.cssSelector('.result-text')
).getText();
await expect(result).toEqual('Success');
Detox detox-image-matching প্লাগইনের মাধ্যমে স্ক্রিনশট তুলনা সমর্থন করে। স্ক্রিনশট আপনাকে ভিজ্যুয়াল রিগ্রেশন সনাক্ত করতে দেয়: স্থানান্তরিত এলিমেন্ট, ভুল রং, অনুপস্থিত আইকন। স্থিতিশীল স্ক্রিনশটের জন্য, অ্যানিমেশন নিষ্ক্রিয় করুন এবং একটি নির্দিষ্ট সিমুলেটর আকার ব্যবহার করুন।
সবচেয়ে সাধারণ Detox সমস্যাগুলি সিঙ্ক্রোনাইজেশনের সাথে সম্পর্কিত: অসীম অ্যানিমেশন, দীর্ঘ নেটওয়ার্ক অনুরোধ বা আটকে থাকা টাইমার। --loglevel trace ফ্ল্যাগের সাথে লগিং দেখায় Detox কোন রিসোর্সের জন্য অপেক্ষা করছে। যদি Detox হ্যাং হয়, সমস্যাযুক্ত কোড ব্লকের জন্য device.disableSynchronization() ব্যবহার করুন।
iOS সিমুলেটরে, Detox-এর প্রথমে iphonesimulator কনফিগারেশনের সাথে xcodebuild-এর মাধ্যমে অ্যাপ্লিকেশন বিল্ড করা প্রয়োজন। একটি সাধারণ ভুল হল Debug-এর পরিবর্তে Release স্কিম ব্যবহার করা, যা টেস্ট ফ্ল্যাগ নিষ্ক্রিয় করে। Android-এর জন্য, নিশ্চিত করুন AVD আপনার অ্যাপ্লিকেশনের সাথে সামঞ্জস্যপূর্ণ API দিয়ে তৈরি করা হয়েছে এবং Intel HAXM এক্সিলারেশন সক্রিয় রয়েছে। macOS-এ CI পরিবেশের জন্য, macOS রানারের সাথে GitHub Actions ব্যবহার করা সুবিধাজনক, যেখানে Xcode এবং সিমুলেটরগুলি আগে থেকেই ইনস্টল করা আছে।
যদি টেস্টগুলি নিয়মিত টাইমআউটের কারণে ব্যর্থ হয়, পরীক্ষা করুন: সিঙ্ক্রোনাইজেশন কি বৈশ্বিকভাবে নিষ্ক্রিয়, অ্যাপ্লিকেশন কোডে কি পরিষ্কার না করেই setTimeout বা setInterval ব্যবহার করা হচ্ছে, এবং মেইন থ্রেড কি একটি দীর্ঘ অপারেশন দ্বারা অবরুদ্ধ। কখনও কখনও detoxrc.js-এ testRunner.args.jest.$.testTimeout-এর মাধ্যমে টাইমআউট বাড়ানো সাহায্য করে। সমস্যা এলাকা খুঁজতে, Detox ট্রেস লগিং সক্রিয় করুন — এটি দেখায় ফ্রেমওয়ার্ক বর্তমানে কোন রিসোর্স এবং টাইমারের জন্য অপেক্ষা করছে।
টেস্ট চালানোর পরে, Detox আর্টিফ্যাক্ট তৈরি করে: ব্যর্থ টেস্টের স্ক্রিনশট, অ্যাপ্লিকেশন লগ এবং JUnit XML রিপোর্ট। যখন একটি টেস্ট ব্যর্থ হয় তখন স্ক্রিনশট স্বয়ংক্রিয়ভাবে নেওয়া হয় এবং দৃশ্যত সমস্যা সনাক্ত করতে সাহায্য করে। CI-এর জন্য, আর্টিফ্যাক্ট ক্লাউড স্টোরেজে আপলোড করা হয় এবং ব্যর্থতার কারণ বিশ্লেষণের জন্য ওয়েব ইন্টারফেসের মাধ্যমে উপলব্ধ হয়।
সচরাচর জিজ্ঞাসা
Detox অ্যাপ্লিকেশনের অভ্যন্তরীণ অবস্থায় অ্যাক্সেস এবং স্বয়ংক্রিয় সিঙ্ক্রোনাইজেশন সহ gray-box পদ্ধতি ব্যবহার করে। Appium WebDriver-এর মাধ্যমে black-box মডেলে কাজ করে এবং ম্যানুয়াল অপেক্ষার প্রয়োজন হয়। React Native প্রজেক্টের জন্য Detox দ্রুততর এবং আরও স্থিতিশীল।
Detox টেস্টগুলি JavaScript বা TypeScript-এ লেখা হয়। ফ্রেমওয়ার্কটি Jest এবং Mocha-এর সাথে টেস্ট রানার হিসেবে ইন্টিগ্রেট হয়। iOS-এর জন্য নেটিভ ইঞ্জিন Swift-এ লেখা, Android-এর জন্য Kotlin এবং Java-তে।
হ্যাঁ, Detox iOS (XCTest-এর মাধ্যমে) এবং Android (Espresso-এর মাধ্যমে) নেটিভ অ্যাপ্লিকেশন সমর্থন করে। তবে, Detox-এর প্রধান ব্যবহারকারী হল React Native ডেভেলপার, কারণ নেটিভ প্রজেক্টের জন্য আরও পরিণত সমাধান বিদ্যমান।
Detox আর্টিফ্যাক্ট প্রদান করে: স্ক্রিনশট, অ্যাপ্লিকেশন লগ এবং HTML রিপোর্ট। স্থানীয় ডিবাগিংয়ের জন্য, --loglevel trace ফ্ল্যাগ ব্যবহার করুন, এবং CI-এর জন্য, ক্লাউড আপলোড সহ একটি স্বয়ংক্রিয় আর্টিফ্যাক্ট সংগ্রাহক ব্যবহার করুন।
এটি Detox API-এর একটি পদ্ধতি যা অ্যাপ্লিকেশন পুনরায় ইনস্টল না করেই React Native JavaScript বান্ডেল পুনরায় লোড করে। এটি beforeEach-এ প্রতিটি টেস্টের আগে অ্যাপ্লিকেশনের অবস্থা প্রাথমিক স্ক্রিনে রিসেট করতে ব্যবহৃত হয়।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন