## تحسين تطوير iOS من خلال الاختبارات الآلية والأدوات
تمت كتابة هذه المدونة بمساعدة ChatGPT-4o.
أهمية اختبار الوحدات
في LeanCloud، قمنا بتنفيذ اختبار الوحدات في مرحلة مبكرة من المشروع، وقد أثبت ذلك أنه ذو قيمة كبيرة. كل طلب سحب (PR) يؤدي إلى تشغيل اختبار الوحدات على Jenkins، وكان هدفنا في التغطية حوالي 80%. هناك سيناريوهان رئيسيان لكتابة الاختبارات: التحقق من الواجهات الجديدة وإعادة إنتاج وإصلاح الأخطاء. كلما تراكمت الاختبارات، أصبحت قاعدة الكود لدينا أكثر قوة. تمكننا الاختبارات الآلية من إصدار وإعادة هيكلة الكود بثقة دون الحاجة إلى التحقق اليدوي.
عملية الاختبار والتطبيق العملي
فيما يلي بعض الأمثلة العملية حول كيفية مساهمة الاختبارات الوحدية في مساعدتنا:
اختبار العملية 1: أبلغ مستخدم بوجود خطأ عند حفظ كائن يحتوي على مفتاح الوصف. قمت بكتابة اختبار لإعادة إنتاج هذه المشكلة، وتمكنت من تحديد المشكلة وإصلاحها، ثم احتفظت بهذا الاختبار للتحقق منه في المستقبل.
اختبار العملية 2: أثناء تطوير واجهة برمجية جديدة، قمت بكتابة الاختبارات المناسبة بعد تنفيذ الكود للتأكد من أن الكود يعمل بشكل صحيح.
اختبار العملية 3: بعد تعديل كود AVObject.m
، قمت بتشغيل اختبار AVObjectTest.m
للتحقق مما إذا كانت التغييرات قد تسببت في أي فشل في الاختبارات.
اختبار العملية 4: إرسال طلب السحب (PR) سيؤدي إلى تشغيل الاختبارات الآلية على Jenkins.
فوائد كتابة اختبارات الوحدات
- تقليل التحقق اليدوي: اختبارات الوحدات توفر الوقت من خلال القضاء على الحاجة إلى الفحص اليدوي.
- كشف الأخطاء: الكشف المبكر عن المشكلات الناتجة عن تغييرات في الكود، مما يمنع الأخطاء من التأثير على أجزاء أخرى من المشروع.
- المشاريع التعاونية: في المشاريع التي يعمل عليها عدة مطورين، تضمن اختبارات الوحدات الاتساق والموثوقية، حتى لو تم تسليم المشروع لشخص آخر.
- مشاريع مفتوحة المصدر عالية الجودة: غالبًا ما تحتوي المشاريع المفتوحة المصدر الشهيرة على اختبارات وحدات واسعة النطاق، مما يساهم في موثوقيتها وشعبيتها.
كيفية كتابة اختبارات وحدة فعالة
- التعليمات البرمجية المعيارية: فصل طبقة البيانات عن طبقة واجهة المستخدم لتسهيل الاختبار.
- تعظيم التغطية: استخدام أقل كمية من كود الاختبار لتحقيق أكبر تغطية.
- معالجة غير متزامنة: التأكد من أن الاختبارات يمكنها التعامل مع العمليات غير المتزامنة.
- اختيار الإطار: اختيار إطار الاختبار المناسب للاحتياجات.
- تقرير التغطية: استخدام تقارير التغطية لفهم الأجزاء التي تم اختبارها من الكود.
تقييم أطر الاختبار
قمنا بتقييم عدة أطر:
- Expecta:
expect(error).not.beNil()
- Specta:
describe("") it("")
- Kiwi:
describe("") it("")
- أطر TDD و BDD لها بعض القيود، مثل عدم التكامل الجيد مع Xcode، وعدم وجود زر اختبار، وعدم إدراج جميع اختبارات الوحدة في الشريط الجانبي.
التعامل مع الاختبارات غير المتزامنة
الاختبارات غير المتزامنة ضرورية للعمليات التي لا تكتمل على الفور. تأكد من أن إطار العمل الخاص بك يدعم بشكل فعال الاختبارات غير المتزامنة. على سبيل المثال، في XCTest، يمكنك استخدام التوقعات (expectations) للانتظار حتى تكتمل العمليات غير المتزامنة قبل إجراء التأكيدات (assertions).
تقارير التغطية
أضافت Xcode 7 ميزة تقارير التغطية المدمجة. خطوات تفعيلها كالتالي:
- قم بتمكين
Gather Coverage Data
في إعدادات المخطط. - قم بإجراء الاختبارات على هدف التطبيق (App Target) وليس على هدف الاختبار (Test Target).
هذه الميزة تسمح للمطورين برؤية أي أسطر من الكود تم اختبارها بالضبط، مما يساعد في تحديد الأجزاء غير المختبرة من الكود. لمزيد من التفاصيل، يرجى زيارة مدونة Big Nerd Ranch.
استخدام Jenkins لإجراء اختبارات الأتمتة عن بُعد
يتضمن إعداد Jenkins لإجراء اختبارات الأتمتة عدة خطوات:
- تثبيت Jenkins: قم بإعداد Jenkins على جهازك المحلي أو على خادم في مركز البيانات.
- التكامل مع GitHub: استخدم مكوّن GitHub PR Build Plugin لتفعيل الاختبارات عند تقديم طلبات السحب (Pull Requests).
- قم بتكوين Webhooks لإرسال الأحداث إلى Jenkins.
- تأكد من أن Jenkins يمكنه الوصول إلى أحدث كود طلبات السحب.
- نصوص الاختبار: قم بإعداد نصوص الاختبار في Jenkins لأتمتة عملية الاختبار.
- تأكد من أن Jenkins يمكنه إعلام GitHub بنتائج الاختبارات.
- قم بتكوين إشعارات Slack أو البريد الإلكتروني للإبلاغ عن فشل الاختبارات.
يوفر استخدام Jenkins لإجراء الاختبارات الآلية عن بُعد جميع مزايا الاختبار الآلي، ويتفوق على الاختبار المحلي من خلال تشغيل الاختبارات في بيئة نظيفة وخاضعة للتحكم.
التعبئة والنشر عن بُعد
على الرغم من أن التعبئة عن بُعد ليست مطلوبة لجميع المشاريع، إلا أنها يمكن أن تُبسط عملية نشر SDK والمكونات القابلة لإعادة الاستخدام. تشمل الخطوات:
- تكوين Jenkins لقراءة الكود.
- قراءة إصدار النشر.
- فتح قفل سلسلة المفاتيح في سطر الأوامر للوصول إلى شهادات التوقيع.
أدوات ونصائح إضافية
- Reveal: تحليل واجهة المستخدم لأي تطبيق على iPhone مكسور الحماية.
- Flex: تحليل طلبات الشبكة، واجهة المستخدم، الملفات المحلية، NSUserDefaults والسجلات على iPhone مكسور الحماية.
- إدارة Pods: استخدام Pods محليًا، تكوين Podfile المتقدم ونشر Pods.
- إنشاء الأطر: الفرق بين المكتبات الديناميكية والثابتة، وكيفية تجميع إطار يعمل على كل من المحاكي والجهاز الفعلي.
- نصائح Xcode: اختصارات مفيدة مثل Shift + Command + J لعرض الملف في المتصفح، Shift + Command + O لفتح الملف بسرعة.
الخلاصة
أدت الاختبارات الآلية والأدوات المناسبة إلى تحسين كبير في عملية التطوير. من خلال إدخال اختبارات الوحدات في مراحل مبكرة، والاستفادة من المعالجة غير المتزامنة واستخدام تقارير التغطية، يمكننا بناء تطبيقات أكثر موثوقية وقابلية للصيانة. تضمن أدوات CI/CD مثل Jenkins وأدوات تطوير Xcode، جنبًا إلى جنب مع استراتيجية اختبار قوية، تسليم برمجيات عالية الجودة.
الشكر والتقدير
نود أن نعرب عن خالص امتناننا لفريق LeanCloud ولكل من ساهم في عملية الاختبار الخاصة بنا.