كيف يعمل Maestro من الداخل، وليش اختباراته أثبت من Appium
الاثنان يلمسان التطبيق من خارجه، فمن وين يأتي فرق الثبات؟ شرح لما يحدث بين سطر الاختبار والشاشة في Maestro وAppium، ومتى تختار كل واحد.
Maestro وAppium يصلان إلى تطبيقك بنفس الطريقة تقريباً: من خارج التطبيق، عبر الأدوات التي تعطيها Google وApple لأتمتة الشاشة، وكأنهما إصبع يلمس الشاشة كما يلمسها المستخدم.
الفرق الحقيقي في مكان آخر: كم محطة يمر بها الأمر قبل أن يصل إلى الشاشة، ومن المسؤول عن الانتظار. وهذا بالضبط ما يحدد إذا كان اختبارك سينجح عشر مرات من عشر، أو ثماني مرات فقط.
نفس الاختبار، بطريقتين
خلينا نأخذ سيناريو واحداً ونتابعه حتى النهاية: تطبيق متجر، تفتحه، تضغط زر Login، وتتأكد أن كلمة Welcome ظهرت.
في Appium تكتب الاختبار بلغة برمجة، Java مثلاً:
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
wait.until(ExpectedConditions.elementToBeClickable(
AppiumBy.accessibilityId("Login"))).click();
wait.until(ExpectedConditions.visibilityOfElementLocated(
AppiumBy.accessibilityId("Welcome")));وفي Maestro تكتب ملف YAML:
appId: com.example.shop
---
- launchApp
- tapOn: "Login"
- assertVisible: "Welcome"لاحظ أن كود Appium مليء بكلمة wait. هذا مش أسلوب كتابة، هذا هو قلب الفرق كله، وسنرجع له بعد قليل.
ماذا يحدث خلف الكواليس في Appium؟
عندما يصل سطر click() إلى التنفيذ، يمر الأمر بخمس محطات:
- كود الاختبار يحوّل الأمر إلى طلب HTTP بصيغة الـ WebDriver، وهي نفس الصيغة التي يستخدمها Selenium.
- الـ Appium Server يستقبل الطلب على جهازك أو على الـ CI، ويقرر أي Driver سيتعامل معه.
- الـ Driver يترجم الأمر: الـ UiAutomator2 Driver على Android، والـ XCUITest Driver على iOS.
- برنامج مساعد مثبّت على الجهاز ينفّذ الأمر فعلاً: على Android هو خادم مبني على UiAutomator من Google، وعلى iOS هو WebDriverAgent المبني على XCTest من Apple.
- التطبيق يستقبل اللمسة، مثل أي لمسة من إنسان.
المحطة الرابعة هي النقطة المهمة: هذا البرنامج المساعد مش داخل تطبيقك. هو برنامج منفصل على الجهاز، يقرأ الشاشة عبر طبقة الـ Accessibility، ويرسل اللمسات من الخارج. يعني Appium في إعداده المعتاد يلمس الشاشة من الخارج أيضاً، لكن اللمسة هنا تأتي في آخر سلسلة طويلة.
وماذا يحدث في Maestro؟
الأمر tapOn: "Login" يمر بمحطات أقل:
- ملف الـ YAML يقرأه الـ Maestro CLI مباشرة، بدون Compile وبدون مكتبة بلغة برمجة.
- الـ Maestro CLI يتكلم مباشرة مع برنامج صغير يثبّته على الجهاز.
- هذا البرنامج الصغير مبني أيضاً على UiAutomator في Android وعلى XCTest في iOS. نعم، نفس الأساس الذي يعتمد عليه Appium.
- التطبيق يستقبل اللمسة.
إذن الفرق مش في كيف تصل اللمسة إلى الشاشة. الفرق في ما يحدث قبل اللمسة.
من وين يأتي الثبات فعلاً؟
أغلب الاختبارات المتقلبة، أو ما نسميه الـ Flaky Tests، مش سببها أن الأداة ضغطت في المكان الخطأ. سببها التوقيت: الأداة ضغطت على الزر قبل أن يظهر، أو قبل أن تنتهي الحركة التي تنقله إلى مكانه، أو قبل أن يرجع رد السيرفر.
هنا يختلف التصميم بين الأداتين.
في Appium، الانتظار مسؤوليتك أنت. كل مكان في التطبيق فيه تحميل أو حركة، لازم تكتب له wait مناسباً. إذا نسيت واحداً، أو اخترت مدة قصيرة، سينجح الاختبار على جهازك ويفشل على الـ CI الأبطأ. وإذا اخترت مدة طويلة، صار الاختبار بطيئاً. وكثير من الفرق تستسلم وتكتب Thread.sleep، وهذا أسوأ الحلول.
في Maestro، الانتظار جزء من الأداة. قبل كل خطوة، ينتظر Maestro أن يظهر العنصر المطلوب، وينتظر أن تستقر الشاشة، يعني أن تتوقف الحركات والتحميل. وإذا لم يجد العنصر فوراً، يعيد المحاولة وحده لمدة معقولة قبل أن يعلن الفشل. أنت لا تكتب أي سطر انتظار.
وهناك سبب آخر أقل وضوحاً: كل محطة إضافية هي فرصة إضافية للمشاكل. في Appium، الـ Server والـ Driver والبرنامج المساعد كل واحد منهم له إصدار، ولازم تتوافق الإصدارات مع بعضها ومع نسخة Android أو iOS. وأغلب رسائل «الاختبار كان يعمل أمس» تأتي من هنا، مش من التطبيق.
إذن هل Maestro أفضل من Appium في كل شيء؟
مش في كل شيء. الصورة الصادقة هي هذه:
| السؤال | Maestro | Appium |
|---|---|---|
| من يكتب الاختبارات؟ | أي شخص يقرأ YAML: Tester أو PO | مهندس يكتب كوداً بلغة برمجة |
| الانتظار | تلقائي، مبني داخل الأداة | تكتبه أنت لكل خطوة |
| الإعداد | أداة واحدة تثبّتها وتبدأ | Server وDrivers ومكتبة وإعدادات |
| سرعة الكتابة والتجربة | تحفظ الملف فيعيد التشغيل فوراً | Compile ثم تشغيل |
| المنطق المعقد | محدود، مع إمكانية سكربتات JavaScript صغيرة | كامل، لأنه كود حقيقي |
| النظام المحيط | أحدث وأصغر | ضخم، ومدعوم في كل منصات الأجهزة السحابية |
اختر Maestro عندما يكون هدفك تغطية رحلات المستخدم الأساسية بسرعة وبثبات: التسجيل، والدخول، والشراء، والبحث. وعندما يكون في فريقك أشخاص مش مبرمجين تريدهم أن يكتبوا اختبارات.
ابقَ على Appium عندما تكون عندك مجموعة اختبارات ضخمة مكتوبة أصلاً، أو تحتاج منطقاً برمجياً معقداً داخل الاختبار، أو تعتمد على أدوات ومنصات مبنية حول الـ WebDriver.
وكثير من الفرق تستخدم الاثنين: Maestro للرحلات الأساسية التي لازم ما تفشل أبداً، وAppium للحالات الخاصة.
الخلاصة
- الاثنان يلمسان التطبيق من خارجه في الإعداد المعتاد، وعبر نفس أدوات Google وApple. الاستثناء الوحيد هو الـ Espresso Driver في Appium، الذي يعمل داخل التطبيق.
- Appium يمر بخمس محطات، وMaestro بأربع، وكل محطة أقل تعني مشاكل توافق أقل.
- الثبات يأتي من الانتظار الذكي. في Maestro هو جزء من الأداة، وفي Appium هو مسؤوليتك في كل سطر.
- Maestro مش بديل عن كل شيء. هو الخيار الأسرع والأثبت لرحلات المستخدم، وAppium يبقى أقوى في المنطق المعقد والأنظمة الكبيرة.
إذا أردت أن ترى هذا عملياً، من التثبيت على Windows وmacOS إلى تشغيل الاختبارات على Maestro Cloud وربطها بالـ CI/CD وiOS، فهذا بالضبط ما يغطيه كورس أتمتة اختبارات تطبيقات الموبايل مع Maestro: ستة وستون درس فيديو، بدون سطر برمجة واحد.
