أدوات مخصصة: عندما لا تكون الإشارة كافية

إن أدوات Xcode الخاصة بـ Apple هي أداة لتحليل أداء تطبيق iOS. يتم استخدامها لجمع وعرض البيانات المطلوبة في تصحيح التعليمات البرمجية. في العام الماضي ، قدمت شركة آبل الآلات المخصصة. هذه فرصة لتوسيع مجموعة الأدوات القياسية لتطبيقات ملفات التعريف. عندما لا تكون الأدوات الحالية كافية ، يمكنك إنشاء أدوات جديدة بنفسك - فهي ستقوم بجمع البيانات وعرضها حسب حاجتك.

مر عام ، ولا تكاد توجد أدوات ومعلومات عامة جديدة حول إنشائها على الشبكة. لذلك قررنا تصحيح الموقف ومشاركة الطريقة التي ابتكرنا بها الأداة المخصصة الخاصة بنا ، والتي تحدد سبب العزلة الضعيفة لاختبارات الوحدة. يعتمد على تقنية الإشارة (كتبنا عنها في المقال السابق ) ويسمح لك بتحديد مكان وميض الاختبار بسرعة وبدقة.



الحد الأدنى النظري


لإنشاء أداة جديدة لـ Xcode ، تحتاج إلى فهم الكتلتين النظريتين. بالنسبة لأولئك الذين يريدون معرفة ذلك بمفردهم ، سنقدم على الفور الروابط اللازمة:


بالنسبة للباقي - فيما يلي ملخص موجز للمواضيع الضرورية.

حدد أولاً ملف -> جديد -> مشروع -> فئة ماك -> حزمة أدوات. يتضمن المشروع الذي تم إنشاؤه ملفًا بالملحق .instrpkg ، يتم فيه الإعلان عن أداة جديدة بالتنسيق xml. دعنا نتعرف على عناصر العلامات:

ماسماتوصف
مخططات البيانات
مخطط الفاصل ، مخطط النقطة ، إلخ.
وصف بنية البيانات كجدول مثل مخططات sql. تُستخدم المخططات في عناصر العلامات الأخرى لتحديد نوع البيانات عند إدخال وإخراج النموذج ، على سبيل المثال ، عند وصف التعيين (UI).
استيراد مخططات البيانات
استيراد ومخطط
استيراد المخططات الجاهزة. يسمح لك باستخدام هياكل البيانات التي تم تعريفها بواسطة Apple.
نموذج الأداة
صانع التماثيل
يربط الأداة بملف .clp ، حيث يتم تعريف منطق الأداة ، ويعلن عن مخطط البيانات المتوقع عند إدخال وإخراج النموذج.
وصف الأداة
أداة
يصف نموذج البيانات ويحدد كيفية عرض الأحداث في واجهة المستخدم. يتم وصف نموذج البيانات باستخدام جدول إنشاء السمات ، إنشاء المعلمة ، إلخ. يتم تعريف مخططات الأدوات حسب سمات الرسم البياني ، ويتم تعريف جدول الأجزاء بالقائمة والسرد وما إلى ذلك.

إذا أردنا استكمال منطق الأداة الجديدة ، فقم بإنشاء ملف .clp برمز CLIPS. الكيانات اللغوية الأساسية:

  • "الحقيقة" هي حدث معين مسجل في النظام باستخدام أمر التأكيد ؛
  • "القاعدة" عبارة عن if if-block مع بناء جملة معين يحتوي على شرط يتم بموجبه تنفيذ مجموعة من الإجراءات.

أي القواعد وفي أي تسلسل سيتم تفعيله يتم تحديدها بواسطة CLIPS نفسها بناءً على الحقائق الواردة ، وأولويات القواعد وآلية حل النزاع.

تدعم اللغة إنشاء أنواع البيانات استنادًا إلى العناصر الأولية ، واستخدام العمليات الحسابية ، والوظائف المنطقية. وكذلك البرمجة الكاملة للكائنات الموجهة (OOP) مع تعريف الفئات ، وإرسال الرسائل ، والميراث المتعدد.

النظر في بناء الجملة الأساسية للغة التي تتيح لك إنشاء منطق للأدوات المخصصة.

1. لإنشاء fact ، استخدم بنية assert :

 CLIPS> (assert (duck)) 

وبالتالي ، نحصل على إدخال duck في جدول الحقائق ، والذي يمكن عرضه باستخدام أمر facts :

 CLIPS> (facts) 

لإزالة الحقيقة ، استخدم أمر retract : (retract duck)

2. لإنشاء rule ، استخدم بناء defrule :

 CLIPS> (defrule duck) —     duck (animal-is duck)</i> —  animal-is duck     => (assert (sound-is quack))) —     sound-is quack 

3. لإنشاء المتغيرات واستخدامها ، يتم استخدام بناء الجملة التالي (قبل اسم المتغير هناك علامة إلزامية "؟"):

 ?<variable-name> 

4. يمكنك إنشاء أنواع بيانات جديدة باستخدام:

 CLIPS> (deftemplate prospect (slot name (type STRING) (default ?DERIVE)) (slot assets (type SYMBOL) (default rich)) (slot age (type NUMBER) (default 80))) 

لذلك ، حددنا بنية لها اسم احتمال وثلاثة سمات اسم والأصول وعمر من نوع المقابلة والقيمة الافتراضية.

5. العمليات الحسابية والمنطقية لها بناء جملة بادئة. أي لإضافة 2 و 3 ، يجب استخدام البناء التالي:

 CLIPS> (+ 2 3) 

أو لمقارنة اثنين من المتغيرات x و y:

 CLIPS> (> ?x ?y) 

مثال عملي


في مشروعنا ، نستخدم مكتبة OCMock لإنشاء كائنات كعب الروتين. ومع ذلك ، هناك حالات يكون فيها موك أطول من الاختبار الذي تم إنشاؤه من أجله ، ويؤثر على عزل الاختبارات الأخرى. ونتيجة لذلك ، يؤدي هذا إلى "وميض" (عدم الاستقرار) من اختبارات الوحدة. من أجل تتبع عمر الاختبارات والسخرية ، سننشئ أداة خاصة بنا. ما يلي هو خوارزمية الإجراءات.

الخطوة 1. جعل العلامات لأحداث الإشارة


لاكتشاف moxes إشكالية ، هناك حاجة إلى فئتين من الأحداث الفاصل - وقت إنشاء وتدمير moxa ، ووقت البدء ونهاية الاختبار. للحصول على هذه الأحداث ، انتقل إلى مكتبة OCMock باستخدام signpost في أساليب init و stopMocking لفئة stopMocking .





بعد ذلك ، انتقل إلى المشروع قيد الدراسة ، setUp بإجراء الترميز في اختبارات الوحدة ، tearDown :



الخطوة 2. إنشاء أداة جديدة من قالب حزمة الصك




أولاً ، نحدد نوع بيانات الإدخال. للقيام بذلك ، .instrpkg باستيراد نظام signpost في signpost . الآن signpost الأحداث التي أنشأتها signpost في الأداة:



بعد ذلك ، نحدد نوع البيانات في الإخراج. في هذا المثال ، سنقوم بإخراج أحداث متزامنة. سيكون لكل حدث وقت ووصف. للقيام بذلك ، قم بتعريف المخطط:



الخطوة 3. نصف منطق الأداة


نقوم بإنشاء ملف منفصل بالملحق .clp ، حيث نضع القواعد باستخدام لغة CLIPS. لإعلام الأداة الجديدة بالملف الذي تم تعريف المنطق به ، أضف كتلة modeler :



في هذه الكتلة ، باستخدام سمة production-system ، حدد المسار النسبي للملف باستخدام المنطق. في output السمات required-input نحدد مخططات البيانات للإدخال والإخراج ، على التوالي.



الخطوة 4. نصف تفاصيل عرض الأداة (UI)


في ملف .instrpkg ، يبقى وصف الأداة نفسها ، أي عرض النتائج. إنشاء جدول للبيانات في سمة create-table باستخدام schema-ref detected-mocks-narrative المعلن detected-mocks-narrative مسبقًا في سمة schema-ref . وإعداد نوع إخراج المعلومات - السرد (وصفي):



الخطوة 5. نكتب رمز المنطق


دعنا .clp إلى ملف .clp ، حيث يتم تعريف منطق نظام الخبير. سيكون المنطق على النحو التالي: إذا كان وقت بدء الاختبار يتقاطع مع فترة حياة الموكا ، فإننا نعتقد أن هذا الموك "جاء" من اختبار آخر - ينتهك عزلة اختبار الوحدة الحالي. من أجل إنشاء حدث في النهاية مع معلومات تهمك ، يجب عليك القيام بالخطوات التالية:

1. تحديد هياكل وهمية و unitTest مع الحقول - وقت الحدث ، معرف الحدث ، واسم الاختبار وفئة موك.



2. نحدد القواعد التي ستنشئ حقائق مع أنواع mock و unitTest بناءً على الأحداث القادمة من signpost :



يمكن قراءة هذه القواعد على النحو التالي: إذا حصلنا عند الإدخال على حقيقة من نوع os-signpost بالنظام subsystem category name ونوع event-type المرغوب فيه ، فقم بإنشاء حقيقة جديدة بالنوع الذي تم تعريفه أعلاه (unitTest أو mock) ، وقم بتعبئة القيم. من المهم أن نتذكر هنا - CLIPS هي لغة حساسة لحالة الأحرف ويجب أن تتوافق قيم النظام الفرعي والفئة والاسم ونوع الحدث مع ما تم استخدامه في رمز المشروع قيد الدراسة.



يتم تمرير المتغيرات من أحداث الإشارة كما يلي:



3. نحدد القواعد التي تطلق الأحداث المكتملة (فهي زائدة عن الحاجة ، لأنها لا تؤثر على النتيجة).



الخطوة 6. تحديد القاعدة التي سوف تولد النتائج.


يمكنك قراءة القاعدة مثل هذا.

إذا

1) هناك unitTest والسخرية ؛

2) في هذه الحالة ، تحدث بداية الاختبار بعد الموكا الموجودة ؛

3) يوجد جدول لتخزين النتائج باستخدام مخطط السرد المكتشف ؛

ال

4) إنشاء سجل جديد ؛

5) ملء مع الوقت ؛

6) ... ووصف.



نتيجة لذلك ، نرى الصورة التالية عند استخدام الأداة الجديدة:



يمكن الاطلاع على التعليمات البرمجية المصدر للأداة المخصصة ومشروع نموذج لاستخدام الأداة على GitHub .

أداة التصحيح


يتم استخدام مصحح الأخطاء لتصحيح الأدوات المخصصة.



انه يسمح

1. انظر التعليمات البرمجية المترجمة بناءً على الوصف في instrpkg.
2. انظر معلومات مفصلة حول ما يحدث للأداة في وقت التشغيل.



3. عرض قائمة كاملة ووصف مخططات بيانات النظام التي يمكن استخدامها كمدخلات في أدوات جديدة.



4. تنفيذ الأوامر التعسفية في وحدة التحكم. على سبيل المثال ، قم بعرض قائمة من القواعد باستخدام أمر list-defrules أو الحقائق مع أمر الوقائع



الإعداد على خادم CI


يمكنك تشغيل الأدوات من سطر الأوامر - لملف تعريف التطبيق أثناء تنفيذ اختبارات الوحدة أو واجهة المستخدم على خادم CI. سيسمح هذا ، على سبيل المثال ، بالتقاط تسرب للذاكرة في أقرب وقت ممكن. لإجراء اختبارات شخصية في خط الأنابيب ، استخدم الأوامر التالية:

1. تشغيل الأدوات مع السمات:

 xcrun instruments -t <template_name> -l <average_duration_ms> -w <device_udid> 

  • حيث template_name هو المسار إلى القالب باستخدام الأدوات أو اسم القالب. يمكنك الحصول على xcrun instruments -s الأمر xcrun instruments -s ؛
  • average_duration_ms - يجب أن يكون وقت التسجيل بالمللي ثانية أكبر من أو يساوي وقت تشغيل الاختبار ؛
  • device_udid - معرف محاكي. يمكنك الحصول على أدوات الأمر xcrun -s. يجب أن يتطابق مع معرّف جهاز محاكاة الذي سيتم تشغيل الاختبارات عليه.

2. تشغيل الاختبارات على نفس المحاكاة باستخدام الأمر:

 xcodebuild -workspace <path_to_workspace>-scheme <scheme_with_tests> -destination <device> test-without-building 

  • حيث path_to_workspace هو المسار إلى مساحة عمل Xcode ؛
  • scheme_with_tests - مخطط مع الاختبارات ؛
  • معرف جهاز محاكاة.

نتيجة لذلك ، سيتم إنشاء تقرير بالملحق .trace في دليل العمل ، والذي يمكن فتحه بواسطة تطبيق Instruments أو بالنقر بزر الماوس الأيمن على الملف وتحديد إظهار محتويات الحزمة.

النتائج


نظرنا إلى مثال على ترقية علامة الإشارة إلى أداة كاملة وأخبرنا كيفية تطبيقها تلقائيًا على "عمليات التشغيل" لخادم CI واستخدامها في حل مشكلة الاختبارات "الوامضة" (غير المستقرة).

أثناء الغوص في إمكانيات الأدوات المخصصة ، ستفهم بشكل أفضل في الحالات الأخرى التي يمكنك فيها استخدام الأدوات. على سبيل المثال ، يساعدوننا أيضًا على فهم مشاكل تعدد العمليات - أين ومتى يتم استخدام الوصول إلى البيانات الآمن لمؤشر الترابط.
كان إنشاء أداة جديدة بسيطًا جدًا. ولكن الشيء الرئيسي هو أنه بعد قضاء عدة أيام في دراسة الميكانيكا والتوثيق لإنشائها اليوم ، ستتمكن من تجنب عدة ليال بلا نوم في محاولات لإصلاح الأخطاء.

مصادر



كُتب المقال مع regno ، أنطون فلاسوف ، مطور نظام iOS.

Source: https://habr.com/ru/post/ar447594/


All Articles