اختبار التكامل لـ C++ مع Docker: من الألف إلى الياء
\n\nاختبار التكامل هو مرحلة أساسية في تطوير أي مشروع C++ جاد. فهو يسمح بالتحقق من كيفية عمل الوحدات المنفصلة للنظام معًا، وتفاعلها مع قواعد البيانات والخدمات الشبكية وأنظمة الملفات. في هذا السياق، يصبح Docker أداة لا غنى عنها: فهو يوفر بيئة معزولة وقابلة للتكرار، مما يستبعد مشاكل "يعمل على جهازي". في هذه المقالة، سنشرح الدورة الكاملة لإعداد اختبار التكامل لـ C++ مع Docker - من المفاهيم الأساسية إلى الممارسات المتقدمة.
\n\n1. لماذا Docker لاختبار التكامل لـ C++؟
\n\nغالبًا ما تعاني اختبارات التكامل التقليدية لـ C++ من مشاكل البيئة: إصدارات مختلفة من المكتبات، مترجمات غير متوافقة، إعدادات نظام تشغيل محددة. يحل Docker هذه المشاكل مرة واحدة وإلى الأبد. المزايا الرئيسية:
\n\n- \n
- قابلية التكرار: يتم تشغيل كل اختبار في بيئة متطابقة، بغض النظر عن النظام المضيف. \n
- العزل: الحاويات لا تؤثر على بعضها البعض ولا على النظام المضيف. \n
- قابلية التوسع: من السهل تشغيل مئات الاختبارات بالتوازي. \n
- التكامل مع CI/CD: تتناسب الحاويات بشكل مثالي مع خطوط أنابيب Jenkins وGitLab CI وGitHub Actions. \n
لنأخذ مثالًا بسيطًا: تطبيق C++ الخاص بك يستخدم PostgreSQL. بدون Docker، سيتعين عليك تثبيت وتهيئة PostgreSQL على كل خادم اختبار. مع Docker، هذا سطر واحد من التكوين.
\n\n2. إعداد بيئة Docker لمشروع C++
\n\nلنبدأ بإنشاء Dockerfile لتطبيق C++ الخاص بنا. لنفترض أن المشروع يستخدم CMake وGoogle Test لاختبارات الوحدة، لكننا نحتاج إلى اختبارات تكامل مع قاعدة بيانات حقيقية.
\n\nDockerfile أساسي للبناء والاختبار:
\n\n# Dockerfile\nFROM ubuntu:22.04 AS builder\n\nRUN apt-get update && apt-get install -y \\\n build-essential \\\n cmake \\\n git \\\n libpq-dev \\\n libgtest-dev \\\n && rm -rf /var/lib/apt/lists/*\n\nWORKDIR /app\nCOPY . .\n\nRUN cmake -B build -DCMAKE_BUILD_TYPE=Release \\\n && cmake --build build --parallel\n\n# مرحلة الاختبارات\nFROM builder AS tester\nCMD ["./build/integration_tests"]\n\nDocker Compose لتشغيل البنية التحتية:
\n\n# docker-compose.yml\nversion: '3.8'\n\nservices:\n db:\n image: postgres:15\n environment:\n POSTGRES_DB: testdb\n POSTGRES_USER: testuser\n POSTGRES_PASSWORD: testpass\n healthcheck:\n test: ["CMD-SHELL", "pg_isready -U testuser -d testdb"]\n interval: 5s\n timeout: 5s\n retries: 5\n\n app:\n build: .\n depends_on:\n db:\n condition: service_healthy\n environment:\n DB_HOST: db\n DB_PORT: 5432\n DB_NAME: testdb\n DB_USER: testuser\n DB_PASSWORD: testpass\n command: ["./build/integration_tests"]\n\n3. كتابة اختبارات التكامل بلغة C++
\n\nلنأخذ مثالًا لاختبار تكامل يتحقق من التفاعل مع PostgreSQL عبر مكتبة libpqxx. لنفترض أن لدينا وحدة للعمل مع المستخدمين.
\n\nمثال لاختبار التكامل:
\n\n// integration_tests.cpp\n#include <gtest/gtest.h>\n#include <pqxx/pqxx>\n#include <string>\n#include <vector>\n\nclass DatabaseIntegrationTest : public ::testing::Test {\nprotected:\n void SetUp() override {\n conn = new pqxx::connection(\n "host=" + std::getenv("DB_HOST") +\n " port=" + std::getenv("DB_PORT") +\n " dbname=" + std::getenv("DB_NAME") +\n " user=" + std::getenv("DB_USER") +\n " password=" + std::getenv("DB_PASSWORD")\n );\n \n // إنشاء جدول اختبار\n pqxx::work txn(*conn);\n txn.exec("CREATE TABLE IF NOT EXISTS use