مقدمة: ما هو Catch2 و Google Test ولماذا نحتاج إليهما؟
\n\nفي تطوير البرمجيات الحديثة باستخدام C++، الاختبار ليس ترفًا، بل ضرورة. تسمح مكتبات اختبار الوحدات (unit testing) للمطورين بالتحقق تلقائيًا من أن المكونات الفردية للبرنامج (الدوال، الفئات، الوحدات) تعمل بشكل صحيح. المكتبتان الأكثر شيوعًا لهذا الغرض هما Catch2 و Google Test (gtest).
\n\nCatch2 هي مكتبة حديثة وخفيفة الوزن وسهلة الاستخدام لاختبار الوحدات. ميزتها الرئيسية هي استخدام الماكرو (macros) التي تجعل الاختبارات قابلة للقراءة وتشبه اللغة الإنجليزية العادية. يدعم Catch2 أسلوب التطوير القائم على السلوك (BDD)، والتسجيل التلقائي للاختبارات، ولا يتطلب تكوينًا معقدًا.
\n\nGoogle Test (gtest) هي مكتبة قوية وناضجة من Google، وهي المعيار الفعلي في العديد من المشاريع الكبيرة. تقدم مجموعة غنية من ماكرو التأكيد (assertion macros)، وآليات لإنشاء الإعدادات الثابتة (test fixtures)، واختبارات معلمة (parameterized tests)، وتكامل ممتاز مع نظام البناء CMake.
\n\nكلا المكتبتين تحلان نفس المشكلة: تسمحان بكتابة اختبارات يتم تشغيلها تلقائيًا والإبلاغ عن النتائج. يعتمد الاختيار بينهما غالبًا على التفضيلات الشخصية، أو متطلبات المشروع، أو البنية التحتية الحالية. في هذه المقالة، سننظر في كلتا المكتبتين، حيث أنهما متشابهتان جدًا في المفهوم، لكن لديهما اختلافات في بناء الجملة وواجهة برمجة التطبيقات (API).
\n\nالتثبيت
\n\nعلى عكس Python (حيث يتم استخدام pip)، يتم تثبيت المكتبات لـ C++ عادةً عبر مديري حزم النظام أو من خلال التكامل مع نظام البناء (مثل CMake). سننظر في كلا الخيارين.
\n\nتثبيت Catch2
\nالطريقة 1: عبر vcpkg (موصى به)
\n# قم بتثبيت vcpkg إذا لم يكن مثبتًا بالفعل\ngit clone https://github.com/Microsoft/vcpkg.git\ncd vcpkg\n./bootstrap-vcpkg.sh # أو .\\bootstrap-vcpkg.bat على ويندوز\n\n# قم بتثبيت Catch2\n./vcpkg install catch2\n\n# التكامل مع CMake\n./vcpkg integrate install\n\nالطريقة 2: Header-only (الأسهل)
\nيمكن استخدام Catch2 كمكتبة header-only. ما عليك سوى تنزيل ملف catch.hpp من المستودع الرسمي ووضعه في مجلد المشروع. ثم قم بتضمينه في الكود:
#define CATCH_CONFIG_MAIN // يجب أن يكون هذا السطر في ملف .cpp واحد فقط\n#include "catch.hpp"\n\nتثبيت Google Test
\nالطريقة 1: عبر vcpkg
\n./vcpkg install gtest\n./vcpkg integrate install\n\nالطريقة 2: عبر CMake FetchContent (موصى به للمشاريع التي تستخدم CMake)
\nأضف إلى ملف CMakeLists.txt الخاص بك:
include(FetchContent)\nFetchContent_Declare(\n googletest\n GIT_REPOSITORY https://github.com/google/googletest.git\n GIT_TAG release-1.12.1\n)\nFetchContent_MakeAvailable(googletest)\n\n# الآن يمكنك استخدام target_link_libraries لملف الاختبار الخاص بك\nadd_executable(my_tests test.cpp)\ntarget_link_libraries(my_tests GTest::gtest_main)\n\nبداية سريعة مع مثال كود
\n\nلنكتب دالة بسيطة ونختبرها باستخدام كلتا المكتبتين. الدالة ستحسب مضروب العدد (factorial).
\n\nمثال مع Catch2
\n#define CATCH_CONFIG_MAIN\n#include "catch.hpp"\n\n// الدالة المراد اختبارها\nunsigned int factorial(unsigned int n) {\n if (n == 0) return 1;\n return n * factorial(n - 1);\n}\n\n// حالة اختبار\nTEST_CASE("يتم حساب المضروبات بشكل صحيح", "[factorial]") {\n REQUIRE(factorial(0) == 1);\n REQUIRE(factorial(1) == 1);\n REQUIRE(factorial(2) == 2);\n REQUIRE(factorial(3) == 6);\n REQUIRE(factorial(10) == 3628800);\n}\n\n// حالة اختبار أخرى مع أقسام\nTEST_CASE("فحص الحالات الحدودية", "[factorial][edge]") {\n SECTIO