Screenshot Test হলো অ্যাপ্লিকেশন স্ক্রিনের স্ক্রিনশট ক্যাপচার এবং রেফারেন্স ইমেজের সাথে তুলনা করে ব্যবহারকারী ইন্টারফেসের একটি স্বয়ংক্রিয় পরীক্ষা। গোল্ডেন টেস্টের বিপরীতে, স্ক্রিনশট টেস্টগুলি বাস্তব ডিভাইস বা এমুলেটরে সঞ্চালিত হয়, নেভিগেশন, সিস্টেম এলিমেন্ট এবং অ্যানিমেশন সহ সম্পূর্ণ স্ক্রিন ক্যাপচার করে এবং অ্যাপ্লিকেশনের সাথে ইন্টারঅ্যাক্ট করতে UI Automator (Android) বা XCUITest (iOS) ব্যবহার করে। আরও বিস্তারিত Android UI Automator ডকুমেন্টেশন এ।
মূল বিষয়
Screenshot Test একটি এন্ড-টু-এন্ড ইউজার ইন্টারফেস টেস্টিং যেখানে টেস্টটি অ্যাপ্লিকেশন স্ক্রিন খোলে, ক্রিয়া সম্পাদন করে (ট্যাপ, টেক্সট ইনপুট, স্ক্রল) এবং ফলস্বরূপ অবস্থার স্ক্রিনশট নেয়। স্ক্রিনশটটি রিপোজিটoryতে সংরক্ষিত বেসলাইনের সাথে তুলনা করা হয়। যদি স্ক্রিনশটগুলি ভিন্ন হয় — টেস্টটি ব্যর্থ হয়। স্ক্রিনশট টেস্টগুলি ভিজুয়াল রিগ্রেশন সনাক্ত করে যা ইউনিট টেস্ট দেখতে পায় না: ভুল মার্জিন, ওভারল্যাপিং এলিমেন্ট, ভুল রং।
গোল্ডেন টেস্ট থাকলে কেন স্ক্রিনশট টেস্ট প্রয়োজন — গোল্ডেন টেস্টগুলি উপাদানগুলিকে বিচ্ছিন্নভাবে পরীক্ষা করে: একটি বাটন, একটি কার্ড, একটি টেক্সট। স্ক্রিনশট টেস্টগুলি প্রোডাকশনের যতটা সম্ভব কাছাকাছি পরিবেশে সম্পূর্ণ স্ক্রিন পরীক্ষা করে: বাস্তব নেভিগেশন, বাস্তব ডেটা (বা সর্বাধিক বাস্তবসম্মত মক), বাস্তব সিস্টেম ফন্ট, বাস্তব স্ট্যাটাস বার। শুধুমাত্র একটি স্ক্রিনশট টেস্ট দেখাবে যে একটি বাটন বাস্তব ডিভাইসে অন্য এলিমেন্টের সাথে ওভারল্যাপ করছে।
ব্যবসায়িক মূল্য — Google (2023) অনুসারে, ভিজুয়াল বাগগুলি সমস্ত মোবাইল অ্যাপ্লিকেশন বাগের 15-25% গঠন করে। স্ক্রিনশট টেস্টগুলি ভিজুয়াল কোয়ালিটি চেকিং অটোমেট করে যা আগে QA ইঞ্জিনিয়ারদের দ্বারা ম্যানুয়ালি করা হতো। একটি স্ক্রিনশট টেস্ট একটি স্ক্রিনের 5-10 মিনিট ম্যানুয়াল টেস্টিং প্রতিস্থাপন করে। 50টি স্ক্রিনযুক্ত অ্যাপ্লিকেশনের জন্য, সাশ্রয়: প্রতি রিগ্রেশন রানে 4-8 জন-ঘণ্টা। স্ক্রিনশট টেস্টগুলি 2-3 রিলিজ চক্রে পরিশোধ করে।
গোল্ডেন টেস্টগুলি দ্রুত এবং সহজ: অফ-স্ক্রিন বাফারে একটি উপাদান রেন্ডার করতে মিলিসেকেন্ড লাগে, ডিভাইসের প্রয়োজন হয় না এবং CI-তে স্থিতিশীল। স্ক্রিনশট টেস্টগুলি আরও বাস্তবসম্মত: তারা সিস্টেম এলিমেন্ট সহ বাস্তব স্ক্রিন ক্যাপচার করে, অ্যানিমেশন এবং নেভিগেশন সমর্থন করে এবং বাস্তব ডিভাইসে কাজ করে। পছন্দ লক্ষ্যের উপর নির্ভর করে: ডেভেলপারের জন্য দ্রুত প্রতিক্রিয়া (গোল্ডেন) বা রিলিজের আগে সর্বাধিক বাস্তববাদ (স্ক্রিনশট)।
| বৈশিষ্ট্য | Screenshot Test | Golden Test |
|---|---|---|
| গতি | 2-30 সেকেন্ড | 50-200 মিলিসেকেন্ড |
| বাস্তববাদ | সর্বাধিক (বাস্তব ডিভাইস) | সীমিত (অফ-স্ক্রিন) |
| ডিভাইস প্রয়োজন | হ্যাঁ (এমুলেটর/ফিজিক্যাল) | না (JVM, XCTest) |
| অ্যানিমেশন | সমর্থন করে | সমর্থন করে না |
| নেভিগেশন | মাল্টি-স্টেপ পরিস্থিতি | একক উপাদান |
| অস্থিরতা | উচ্চ (নেটওয়ার্ক, সময়) | মাঝারি (GPU, ফন্ট) |
| সমান্তরালতা | Device Farm (Firebase, AWS) | মাল্টি-থ্রেডেড JVM/XCTest |
Golden + Screenshot — কম্পোনেন্ট লাইব্রেরিতে (Design System) প্রতিটি UI কম্পোনেন্টের জন্য গোল্ডেন টেস্ট ব্যবহার করুন। 80% ভিজুয়াল রিগ্রেশন কম্পোনেন্ট স্তরে ধরা পড়ে। স্ক্রিনশট টেস্ট — গুরুত্বপূর্ণ ইউজার পাথের জন্য: অনবোর্ডিং, লগইন, পেমেন্ট ফ্লো, শপিং কার্ট। বাস্তব স্ক্রিনে কম্পোনেন্ট ইন্টিগ্রেশন সম্পর্কিত 20% রিগ্রেশন শুধুমাত্র স্ক্রিনশট টেস্ট দ্বারা ধরা পড়ে। IT Sectr-এ আমরা 80/20 অনুপাত ব্যবহার করি: 400 গোল্ডেন + 100 স্ক্রিনশট।
কখন স্ক্রিনশট টেস্ট প্রয়োজন হয় না — যদি স্ক্রিনটি ইন্টারঅ্যাক্টিভিটি ছাড়া স্ট্যাটিক কন্টেন্ট নিয়ে গঠিত হয়, তাহলে একটি গোল্ডেন কম্পোনেন্ট টেস্ট কম খরচে একই স্তরের যাচাইকরণ প্রদান করে। যদি স্ক্রিনটি গতিশীলভাবে পরিবর্তিত হয় (ফিড, চ্যাট), তাহলে স্ক্রিনশট টেস্টের জন্য জটিল ডেটা সেটআপ এবং অপেক্ষার সময় প্রয়োজন। এই ধরনের ক্ষেত্রে, বেসলাইন অবস্থার জন্য (খালি তালিকা, লোডিং) স্ক্রিনশট এবং তালিকায় পৃথক কার্ডের জন্য গোল্ডেন ব্যবহার করুন।
UI Automator ক্রস-অ্যাপ্লিকেশন UI টেস্টিংয়ের জন্য একটি Android ফ্রেমওয়ার্ক। এটি UiDevice.takeScreenshot() এর মাধ্যমে স্ক্রিনশট নেওয়ার অনুমতি দেয়। Espresso (একটি অ্যাপ্লিকেশনের ভিতরে কাজ করে) এর বিপরীতে, UI Automator সিস্টেম ডায়ালগ (অনুমতি, নোটিফিকেশন) এবং অন্যান্য অ্যাপ্লিকেশনের সাথে ইন্টারঅ্যাক্ট করতে পারে। UI Automator-এ স্ক্রিনশট টেস্ট: অ্যাপ খুলুন, লোড হওয়ার জন্য অপেক্ষা করুন, স্ক্রিনশট নিন, বেসলাইনের সাথে তুলনা করুন।
class LoginScreenScreenshotTest {
@get:Rule
val rule = ComposeTestRule.createAndroidComposeRule<MainActivity>()
@Test
fun login_screen_default() {
val device = UiDevice.getInstance(
InstrumentationRegistry.getInstrumentation()
)
// স্ক্রিন লোড হওয়ার অপেক্ষা
IdlingRegistry.getInstance().waitForIdle()
// স্ক্রিনশট নিই
val screenshot = device.takeScreenshot()
val golden = loadGolden("login_default.png")
// রেফারেন্সের সাথে তুলনা করি
val diff = ImageComparator.compare(screenshot, golden)
assertTrue(diff.similarity > 0.98)
}
}
Firebase Test Lab শত শত বাস্তব ডিভাইসে সমান্তরালভাবে ইন্সট্রুমেন্টেড টেস্ট চালানোর জন্য একটি Google Cloud পরিষেবা। Firebase Test Lab-এ স্ক্রিনশট টেস্টগুলি বিভিন্ন ডিভাইসে (Pixel 7, Galaxy S24, Xiaomi 14) স্ক্রিনশট ক্যাপচার করে এবং বেসলাইনের সাথে তুলনা করে। সুবিধা: একটি টেস্ট 20টি ডিভাইসে 10-15 মিনিটে UI পরীক্ষা করে। অসুবিধা: খরচ ($1-5 প্রতি টেস্ট 20টি ডিভাইসে)। Firebase Test Lab gcloud CLI বা Gradle প্লাগইনের মাধ্যমে CI-এর সাথে একীভূত হয়।
Shot Android-এ স্ক্রিনশট টেস্টিংয়ের জন্য একটি লাইব্রেরি যা স্ক্রিনশট তৈরি এবং তুলনা করা সহজ করে। Shot Espresso এবং UI Automator-এর উপরে কাজ করে, গোল্ডেন ম্যানেজমেন্ট (তৈরি, আপডেট, মুছে ফেলা), থ্রেশহোল্ডের সাথে তুলনা (পিক্সেল বা শতাংশ) এবং HTML রিপোর্ট জেনারেশন যোগ করে। Shot সেই প্রকল্পগুলির জন্য উপযুক্ত যারা নিজস্ব ইমেজ তুলনা infrastructure না লিখে দ্রুত স্ক্রিনশট টেস্টিং বাস্তবায়ন করতে চায়।
XCUITest iOS, iPadOS এবং tvOS অ্যাপ্লিকেশনের UI টেস্টিংয়ের জন্য Apple-এর ফ্রেমওয়ার্ক। XCUITest-এ স্ক্রিনশট টেস্টগুলি স্ক্রিন ক্যাপচারের জন্য XCUIScreen.main.screenshot() এবং স্ক্রিনশট সংরক্ষণের জন্য XCAttachment ব্যবহার করে। XCUITest ব্যবহারকারীর ক্রিয়া অনুকরণ করে: ট্যাপ, সোয়াইপ, typeText, এবং প্রতিটি ধাপের পরে স্ক্রিনশট নেয়। Xcode 16+-এ, XCTAttachment-এর মাধ্যমে বেসলাইনের সাথে বিল্ট-ইন স্ক্রিনশট তুলনা যুক্ত করা হয়েছে।
final class LoginScreenScreenshotTests: XCTestCase {
var app: XCUIApplication!
override func setUp() {
super.setUp()
app = XCUIApplication()
app.launch()
}
func test_login_initial_state() {
let loginButton = app.buttons["login_button"]
XCTAssertTrue(loginButton.exists)
// স্ক্রিনশট নিই
let screenshot = app.screenshot()
let attachment = XCTAttachment(screenshot: screenshot)
attachment.name = "Login-Screen-Initial"
attachment.lifetime = .keepAlways
add(attachment)
// রেফারেন্সের সাথে তুলনা (XCTAttachment + golden প্রয়োজন)
assertScreenshot(
screenshot: screenshot,
goldenName: "login_initial_state"
)
}
}
Xcode Cloud iOS অ্যাপ্লিকেশন তৈরি এবং টেস্টিংয়ের জন্য Apple-এর ক্লাউড CI। Xcode Cloud সিমুলেটরে XCUITest টেস্ট চালানো সমর্থন করে। স্ক্রিনশট টেস্টগুলি একাধিক সিমুলেটরে সমান্তরালভাবে চালানো যেতে পারে (iPhone 15, iPhone 15 Pro Max, iPad Pro)। ফলাফল: অ্যাটাচমেন্ট সহ XCResult Bundle। Xcode Cloud GitHub/GitLab-এ বিল্ট-ইন নয় — ইন্টিগ্রেশনের জন্য Xcode Cloud Webhooks ব্যবহার করুন। বিকল্প: macos-14 এবং xcodebuild সহ GitHub Actions।
তুলনা ফ্রেমওয়ার্ক — iOSSnapshotTestCase (Uber) সিমুলেটরে চালালে স্ক্রিনশট টেস্টের জন্যও কাজ করে। SwiftSnapshotTesting (pointfree) কম্পোনেন্ট গোল্ডেন টেস্টের জন্য বেশি উপযোগী। iOS-এ স্ক্রিনশট টেস্টের জন্য, বিল্ট-ইন XCUITest টুল + XCTAttachment + কাস্টম ImageComparator (Pixelmator বা AImage) ব্যবহার করুন। CI-তে সিমুলেটর ব্যবহার করুন — বাস্তব ডিভাইসে স্ক্রিনশট টেস্ট শুধুমাত্র Device Farm (AWS Device Farm) এর মাধ্যমে কাজ করে।
বেসলাইন ম্যানেজমেন্ট — বেসলাইন স্ক্রিনশট রিপোজিটory (Git LFS) বা S3-তে সংরক্ষণ করা হয়। প্রতিটি স্ক্রিনশট টেমপ্লেট অনুযায়ী নামকরণ করা হয়: {testName}_{device}_{orientation}_{locale}.png। উদাহরণ: loginScreenPixel7PortraitRu.png। নতুন ডিভাইস বা লোকেল যোগ করার সময়, একটি নতুন বেসলাইন তৈরি করা হয়। UI পরিবর্তন করার সময়, কোড রিভিউয়ের পরে পুরানো বেসলাইনগুলি নতুন দিয়ে প্রতিস্থাপিত হয়। বেসলাইন কোড বেসের অংশ, টেস্ট সোর্সের মতো।
CI পাইপলাইন — (1) অ্যাপ্লিকেশন তৈরি করুন। (2) এমুলেটর/সিমুলেটরে স্ক্রিনশট টেস্ট চালান। (3) বেসলাইনের সাথে স্ক্রিনশট তুলনা করুন। (4) অমিল হলে — diff ইমেজ তৈরি করুন। (5) diff আর্টিফ্যাক্ট আপলোড করুন (actual, expected, diff — তিনটি ফাইল)। (6) ফলাফল সারণী সহ HTML রিপোর্ট প্রকাশ করুন। (7) থ্রেশহোল্ড অতিক্রম করলে — টেস্ট ব্যর্থ হয়। (8) রিভিউয়ার diff আর্টিফ্যাক্ট পর্যালোচনা করে এবং সিদ্ধান্ত নেয়: অনুমোদন (বেসলাইন আপডেট) বা প্রত্যাখ্যান (কোড ঠিক করা)।
থ্রেশহোল্ড এবং সহনশীলতা — পিক্সেল-বাই-পিক্সেল পরম তুলনা খুব কঠোর। SSIM (স্ট্রাকচারাল সিমিলারিটি ইনডেক্স) বা MSE (মিন স্কোয়ার্ড এরর) ব্যবহার করুন। SSIM 0.98 = 98% স্ট্রাকচারাল সিমিলারিটি — একটি ভালো থ্রেশহোল্ড। বিভিন্ন স্ক্রিনের বিভিন্ন থ্রেশহোল্ডের প্রয়োজন হতে পারে: ডার্ক থিম (আরও কালো — উচ্চতর নির্ভুলতা), গ্রেডিয়েন্ট (আরও নয়েজ — কম নির্ভুলতা)। প্যারামিটারের মাধ্যমে প্রতি-টেস্ট থ্রেশহোল্ড কনফিগার করুন: @ScreenshotTest(threshold = 0.99)।
Device Farm বনাম সিমুলেটর — বাস্তব ডিভাইসে (Firebase Test Lab, AWS Device Farm) টেস্টগুলি সর্বাধিক বাস্তববাদ প্রদান করে কিন্তু ধীর এবং অর্থপ্রদেয়। সিমুলেটর/এমুলেটরে টেস্টগুলি দ্রুত এবং বিনামূল্যে কিন্তু বাস্তব-ডিভাইস বৈশিষ্ট্য (ভিন্ন GPU, ডিসপ্লে কালার রিপ্রোডাকশন, পিক্সেল ডেনসিটি) দেখায় না। কৌশল: প্রি-মার্জ চেকের জন্য সিমুলেটর (5 মিনিট), রাতারাতির জন্য Device Farm (30 মিনিট, 20 ডিভাইস)। IT Sectr-এ আমরা শীর্ষ 10 Android ডিভাইসে রাতারাতি রানের জন্য Firebase Test Lab ব্যবহার করি।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
Golden Test — প্রতিটি কমিটে পৃথক UI কম্পোনেন্টের দ্রুত যাচাইয়ের জন্য (50-200 মিলিসেকেন্ড)। Screenshot Test — রিলিজের আগে বাস্তব ডিভাইসে সম্পূর্ণ স্ক্রিনের E2E যাচাইয়ের জন্য (2-30 সেকেন্ড)। উভয়ই ব্যবহার করুন: Design System কম্পোনেন্টের জন্য গোল্ডেন, গুরুত্বপূর্ণ ইউজার পাথের জন্য স্ক্রিনশট। বেশিরভাগ প্রকল্পের জন্য 80/20 অনুপাত সর্বোত্তম।
SSIM 0.98 বেশিরভাগ স্ক্রিনের জন্য একটি ভালো প্রারম্ভিক থ্রেশহোল্ড। ডার্ক থিমের জন্য, আপনি 0.99 ব্যবহার করতে পারেন (উচ্চতর কন্ট্রাস্ট — আরও নির্ভুল তুলনা)। গ্রেডিয়েন্ট এবং ইমেজযুক্ত স্ক্রিনের জন্য — 0.95-0.97। পিক্সেল-বাই-পিক্সেল পরম তুলনা (MSE = 0) ব্যবহার করবেন না — এটি অ্যান্টি-আলিয়াসিং এবং GPU পার্থক্যের কারণে 20-30% মিথ্যা পজিটিভ তৈরি করে। প্রতিটি টেস্টের জন্য পৃথকভাবে থ্রেশহোল্ড কনফিগার করুন।
প্রতিটি ইচ্ছাকৃত UI পরিবর্তনের সাথে — রং, ফন্ট, মার্জিন, আইকন, এলিমেন্ট যোগ/মুছে ফেলার পরিবর্তন। পরিবেশ পরিবর্তন হলে (OS সংস্করণ, CI-তে ফন্ট) বেসলাইন আপডেট করবেন না — এটি একটি অস্থির টেস্টের লক্ষণ। কোড রিভিউয়ের পরে ডেভেলপার দ্বারা শুধুমাত্র স্থানীয়ভাবে বেসলাইন আপডেট করা হয়: পুরানো বেসলাইন মুছুন, record=true সহ টেস্ট চালান, নতুন স্ক্রিনশট চেক করুন, কমিট করুন।
হ্যাঁ — Android-এ Espresso এবং iOS-এ XCUITest এর মাধ্যমে। Espresso অ্যাপ্লিকেশন প্রক্রিয়ার ভিতরে কাজ করে এবং অ্যাক্সেসিবিলিটি সার্ভিসের (UI Automator-এর মতো) প্রয়োজন হয় না। XCUITest UI টেস্টের জন্য Apple-এর স্ট্যান্ডার্ড ফ্রেমওয়ার্ক। স্ক্রিনশট টেস্টের জন্য পার্থক্য ন্যূনতম: XCUITest কিছুটা বেশি স্থিতিশীল (নেটিভ Apple API), UI Automator কিছুটা বেশি নমনীয় (আন্তঃ-প্রক্রিয়া ইন্টারঅ্যাকশন)।
সঠিকভাবে কনফিগার করা হলে — না। প্রি-মার্জ: শুধুমাত্র পরিবর্তিত স্ক্রিনে স্ক্রিনশট টেস্ট চালান (30-60 সেকেন্ড)। রাতারাতি: Device Farm-এ সম্পূর্ণ রান (30 মিনিট, 20 ডিভাইস)। এমুলেটরে স্ক্রিনশট টেস্ট এক্সিকিউশন সময়: প্রতি স্ক্রিনে 2-10 সেকেন্ড। 20টি স্ক্রিন = 40-200 সেকেন্ড। এটি একটি স্ক্রিনের ম্যানুয়াল টেস্টিং সময়ের (5-10 মিনিট) চেয়ে কম।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন