مطابقات Catch2 في C++: دليل شامل مع أمثلة عملية
1. ما هي مطابقات Catch2 ولماذا تحتاجها؟
مكتبة Catch2 (اختصارًا لـ C++ Automated Test Cases in Headers) هي إطار عمل حديث لاختبار الوحدات في لغة C++، وتُوزَّع كملف رأسي واحد. من أقوى ميزاتها نظام المطابقات (Matchers)، وهي أدوات تصريحية للتحقق من القيم تجعل الاختبارات أكثر قابلية للقراءة والمرونة والإفادة.
على عكس التأكيدات التقليدية مثل REQUIRE(x == 5)، تتيح لك المطابقات صياغة شروط تحقق معقدة بشكل طبيعي وقريب من اللغة البشرية. على سبيل المثال، بدلاً من كتابة حلقة للتحقق من جميع عناصر متجه، يمكنك استخدام REQUIRE_THAT(vec, Catch::Matchers::AllMatch(Catch::Matchers::Predicate<int>([](int i) { return i > 0; }))). هذا لا يختصر الكود فحسب، بل يجعل نوايا المختبر واضحة تمامًا.
لماذا تحتاج المطابقات؟ أولاً، توفر تعبيرية عالية: يمكنك التحقق من أن سلسلة نصية تحتوي على نص فرعي، أو تبدأ ببادئة معينة، أو أن رقمًا يقع ضمن نطاق محدد، باستخدام بناء واحد موجز. ثانيًا، تقدم المطابقات تشخيصًا مفصلاً عند فشل الاختبار — بدلاً من رسالة جافة "false"، تحصل على رسالة ذات معنى، مثل: "متوقع: يبدأ بـ 'Hello' الفعلي: 'World'". ثالثًا، هي قابلة للتركيب: يمكنك دمج مطابقات بسيطة في تعبيرات معقدة باستخدام العوامل المنطقية (و، أو، ليس).
2. التثبيت
Catch2 هي مكتبة تعتمد على الملفات الرأسية فقط (header-only). لا تحتاج إلى تثبيت معقد أو إعداد بناء. هناك طريقتان رئيسيتان:
الطريقة الأولى: تحميل ملف واحد (موصى بها للمبتدئين)
حمّل الملف catch_amalgamated.hpp أو catch.hpp من صفحة الإصدارات الرسمية لـ Catch2 على GitHub. ضعه في مجلد مشروعك وأضفه في الكود:
#include "catch_amalgamated.hpp"
الطريقة الثانية: استخدام مدير الحزم (vcpkg, Conan, CMake FetchContent)
للمشاريع الاحترافية، يُوصى باستخدام مدير الحزم. مثال باستخدام vcpkg:
# تثبيت Catch2 عبر vcpkg
vcpkg install catch2
ثم في ملف CMakeLists.txt الخاص بك:
find_package(Catch2 REQUIRED)
target_link_libraries(my_test PRIVATE Catch2::Catch2WithMain)
ملاحظة مهمة: في الإصدارات Catch2 v3.x وما فوق، توجد المطابقات في مساحة الأسماء Catch::Matchers. في الإصدار v2.x كانت أيضًا في Catch::Matchers (نفس الشيء، لكن هيكل الملفات الرأسية تغير). بالنسبة لـ v3.x، استخدم #include <catch2/catch_test_macros.hpp> و #include <catch2/matchers/catch_matchers_all.hpp>.
3. البداية السريعة — مثال عملي بسيط
لنكتب اختبارًا بسيطًا باستخدام مطابقة للتحقق من سلسلة نصية:
// test.cpp
#define CATCH_CONFIG_MAIN // هذا السطر يجب أن يكون في ملف .cpp واحد فقط
#include <catch2/catch_test_macros.hpp>
#include <catch2/matchers/catch_matchers_all.hpp>
#include <string>
TEST_CASE("مطابقات السلاسل النصية تعمل", "[string]") {
std::string hello = "مرحبًا بالعالم!";
// التحقق من أن السلسلة تحتوي على نص فرعي
CHECK_THAT(hello, Catch::Matchers::ContainsSubstring("بالعالم"));
// التحقق من أن السلسلة تبدأ بـ "مرحبًا"
CHECK_THAT(hello, Catch::Matchers::StartsWith("مرحبًا"));
// التحقق من أن السلسلة تنتهي بـ "!"
CHECK_THAT(hello, Catch::Matchers::EndsWith("!"));
}
أيضاً في المكتبة
توليد PDF في Java: نظرة عامة على مكتبات iText، Apache PDFBox، OpenPDF
التخزين المؤقت في Node.js: Redis وMemcached وNode-Cache
عميل HTTP لجافا: نظرة عامة على أفضل المكتبات (Java 11، Apache، OkHttp، Retrofit)