اختبار التكامل لـ C++ مع Docker: من الألف إلى الياء

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

اختبار التكامل لـ C++ مع Docker: من الألف إلى الياء

\n\n

اختبار التكامل هو مرحلة أساسية في تطوير أي مشروع C++ جاد. فهو يسمح بالتحقق من كيفية عمل الوحدات المنفصلة للنظام معًا، وتفاعلها مع قواعد البيانات والخدمات الشبكية وأنظمة الملفات. في هذا السياق، يصبح Docker أداة لا غنى عنها: فهو يوفر بيئة معزولة وقابلة للتكرار، مما يستبعد مشاكل "يعمل على جهازي". في هذه المقالة، سنشرح الدورة الكاملة لإعداد اختبار التكامل لـ C++ مع Docker - من المفاهيم الأساسية إلى الممارسات المتقدمة.

\n\n

1. لماذا Docker لاختبار التكامل لـ C++؟

\n\n

غالبًا ما تعاني اختبارات التكامل التقليدية لـ C++ من مشاكل البيئة: إصدارات مختلفة من المكتبات، مترجمات غير متوافقة، إعدادات نظام تشغيل محددة. يحل Docker هذه المشاكل مرة واحدة وإلى الأبد. المزايا الرئيسية:

\n\n
    \n
  • قابلية التكرار: يتم تشغيل كل اختبار في بيئة متطابقة، بغض النظر عن النظام المضيف.
  • \n
  • العزل: الحاويات لا تؤثر على بعضها البعض ولا على النظام المضيف.
  • \n
  • قابلية التوسع: من السهل تشغيل مئات الاختبارات بالتوازي.
  • \n
  • التكامل مع CI/CD: تتناسب الحاويات بشكل مثالي مع خطوط أنابيب Jenkins وGitLab CI وGitHub Actions.
  • \n
\n\n

لنأخذ مثالًا بسيطًا: تطبيق C++ الخاص بك يستخدم PostgreSQL. بدون Docker، سيتعين عليك تثبيت وتهيئة PostgreSQL على كل خادم اختبار. مع Docker، هذا سطر واحد من التكوين.

\n\n

2. إعداد بيئة Docker لمشروع C++

\n\n

لنبدأ بإنشاء Dockerfile لتطبيق C++ الخاص بنا. لنفترض أن المشروع يستخدم CMake وGoogle Test لاختبارات الوحدة، لكننا نحتاج إلى اختبارات تكامل مع قاعدة بيانات حقيقية.

\n\n

Dockerfile أساسي للبناء والاختبار:

\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\n

Docker 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\n

3. كتابة اختبارات التكامل بلغة 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                

المدونات

توصيات الكتب