مقدمة: لماذا يحتاج كود C++ الخاص بك إلى حماية؟
\n\nتخيل أنك كتبت برنامجًا بلغة C++. إنه يُترجم دون أخطاء، ويُشغل، بل ويُنتج بعض النتائج. تزفر بارتياح وترسل الكود إلى الإنتاج. وبعد يوم، يكتب لك زميل: "يا صديقي، دالتك calculateSum تتعطل إذا مررت رقمًا سالبًا". وتبدأ في البحث المحموم عن الخلل، معيدًا قراءة مئات الأسطر من الكود.
موقف مألوف؟ إذا كان الأمر كذلك، فقد أتيت إلى المكان الصحيح. اختبار C++ ليس بيروقراطية مملة، بل هو درعك الشخصي ضد مثل هذه الحوادث. في هذه المقالة، سنشرح من أين يبدأ المبتدئ في اختبار C++، دون التعمق في غابة النظرية. ستتعرف على الأدوات التي يجب استخدامها، وكيفية كتابة أول اختباراتك، ولماذا سيوفر لك ذلك ساعات من التوتر.
\n\nما هو اختبار الوحدات (Unit Testing) ولماذا هو ضروري؟
\n\nاختبار الوحدات (أو الاختبارات النمطية) هو فحص "اللبنات" الفردية من الكود الخاص بك: الدوال، الفئات، والطرق. تكتب برنامجًا صغيرًا يستدعي دالتك ببيانات محددة ويتحقق من أن النتيجة تطابق المتوقع.
\n\nلماذا يحتاج المبتدئ إلى هذا؟
\n- \n
- الطمأنينة: تعرف يقينًا أن كودك يعمل. \n
- السرعة: لا تخشى إجراء التعديلات، لأن الاختبارات ستخبرك فورًا إذا حدث خطأ. \n
- التوثيق: الاختبارات هي مثال حي على استخدام كودك. \n
بدون اختبار C++، يكون المشروع كمنزل بُني بدون أساس. يبدو قائمًا، لكن أول زلزال (اقرأ: تغيير في المتطلبات) سيدمره.
\n\nأدوات اختبار C++: اختر إطار العمل الأول لك
\n\nلـ اختبارات الوحدة C++، هناك العديد من أطر العمل الشائعة. للمبتدئين، أوصي بإطارين: Google Test (gtest) و Catch2. كلاهما مجاني، ولهما توثيق ممتاز، وسهل الربط.
\n\nGoogle Test (gtest)
\nمعيار الصناعة. يُستخدم في Google و YouTube والعديد من المشاريع مفتوحة المصدر. قوي، لكنه يتطلب بعض الإعداد.
\n\nCatch2
\nأخف وزنًا وأكثر "ودية" للمبتدئين. يُربط بملف رأس واحد. مثالي للبدء.
\n\nفي هذه المقالة، سنستخدم Catch2 - فهو بسيط ويسمح بالتركيز على الجوهر، وليس على الإعداد.
\n\nكيفية تثبيت Catch2 وكتابة أول اختبار؟
\n\nتثبيت Catch2 بسيط. قم بتنزيل ملف الرأس الوحيد catch.hpp من المستودع الرسمي وضعه في مجلد مشروعك. لا حاجة إلى cmake أو make أو ربط.
الآن لنكتب برنامجًا بسيطًا بلغة C++ ونختبره.
\n\nمثال: دالة الجمع
\nأنشئ ملف calculator.cpp:
#include <iostream>\n#include "catch.hpp"\n\n// الدالة التي سنختبرها\nint add(int a, int b) {\n return a + b;\n}\n\n// اختبار\nTEST_CASE("Addition works correctly", "[math]") {\n REQUIRE(add(2, 3) == 5);\n REQUIRE(add(-1, 1) == 0);\n REQUIRE(add(0, 0) == 0);\n REQUIRE(add(100, 200) == 300);\n}\n\nالآن قم بترجمة وتشغيل:
\n\ng++ -std=c++11 calculator.cpp -o calculator_test\n./calculator_test\n\nسترى شيئًا مثل:
\n\nAll tests passed (4 assertions in 1 test case)\n\nتهانينا! لقد كتبت أول اختبار وحدة C++ لك. دعنا نشرح ما حدث هنا:
\n- \n
TEST_CASE- هو ماكرو ينشئ سيناريو اختبار. \nREQUIRE- يتحقق من الشرط. إذا كان خاطئًا، يفشل الاختبار. \n"[math]"- علامة لتجميع الاختبارات. \n
نصائح عملية: كيفية كتابة اختبارات جيدة
\n\nمجرد كتابة اختبار لا يكفي. يجب كتابة اختبارات مفيدة. إليك بعض القواعد التي سترتقي بـ اختبار الوحدات الخاص بك