الاختبار التكاملي لـ C++ مع Docker: دليل عملي

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

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

ابدأ الدورة
```html

اختبار التكامل لـ C++ باستخدام Docker



التطوير الحديث بلغة C++ لا يتطلب فقط كتابة كود عالي الجودة، بل يضمن أيضًا عمله الموثوق في الظروف الحقيقية. اختبار التكامل هو مرحلة أساسية تسمح بالتحقق من تفاعل مكونات النظام: قاعدة البيانات، الخدمات الشبكية، نظام الملفات. استخدام Docker لهذه الأغراض يوفر بيئة معزولة وقابلة للتكرار، وهي مثالية لخطوط أنابيب CI/CD. في هذه المقالة، سنشرح كيفية إعداد اختبار التكامل لتطبيقات C++ باستخدام Docker، وسنقدم أمثلة عملية.



لماذا Docker لاختبار التكامل في C++؟



الأساليب التقليدية لاختبار التكامل في C++ غالبًا ما تواجه مشاكل:

  • الاعتماد على البيئة: قد تعمل الاختبارات على جهاز المطور، ولكنها تفشل على خادم البناء بسبب إصدارات مختلفة من المكتبات.
  • صعوبة الإعداد: للاختبار مع قاعدة بيانات حقيقية أو API خارجي، يلزم تكوين يدوي.
  • التشغيل المتوازي: قد تتعارض عدة عمليات تشغيل اختبارية بسبب الموارد المشتركة.

يحل Docker هذه المشاكل من خلال توفير حاويات خفيفة ومعزولة. يمكنك رفع قاعدة بيانات اختبارية، تشغيل خدمة C++ الخاصة بك، وتنفيذ الاختبارات — كل ذلك ضمن ملف docker-compose واحد. هذا يضمن أن البيئة ستكون متطابقة على أي جهاز.



إعداد المشروع: مثال أساسي



لننظر إلى خدمة C++ بسيطة تقوم بحفظ البيانات في PostgreSQL. لاختبار التكامل سنحتاج إلى:

  • كود C++ نفسه مع الاختبارات (نستخدم Google Test).
  • Dockerfile لبناء وتشغيل الاختبارات.
  • docker-compose.yml لتنسيق الحاويات.


هيكل المشروع:

my_cpp_project/├── src/│   ├── main.cpp│   ├── database.cpp│   └── database.h├── tests/│   └── test_integration.cpp├── CMakeLists.txt├── Dockerfile└── docker-compose.yml


Dockerfile:

FROM gcc:latest AS builder

WORKDIR /appCOPY . .

RUN apt-get update && apt-get install -y cmake libpq-devRUN cmake -B build -DCMAKE_BUILD_TYPE=ReleaseRUN cmake --build build

FROM ubuntu:22.04

RUN apt-get update && apt-get install -y libpq-devCOPY --from=builder /app/build/tests /app/testsCOPY --from=builder /app/build/my_app /app/my_app

ENTRYPOINT ["/app/tests"]


docker-compose.yml:

version: '3.8'services:  db:    image: postgres:15    environment:      POSTGRES_USER: testuser      POSTGRES_PASSWORD: testpass      POSTGRES_DB: testdb    ports:      - "5432:5432"    healthcheck:      test: ["CMD-SHELL", "pg_isready -U testuser -d testdb"]      interval: 5s      timeout: 5s      retries: 5

test: build: . depends_on: db: condition: service_healthy environment: DB_HOST: db DB_PORT: 5432 DB_USER: testuser DB_PASSWORD: testpass DB_NAME: testdb


كتابة اختبارات التكامل بلغة C++



الآن سنقوم بإنشاء اختبار يتحقق من الكتابة والقراءة من قاعدة البيانات. نستخدم Google Test ومكتبة libpqxx للعمل مع PostgreSQL.



tests/test_integration.cpp:

#include <gtest/gtest.h>#include <pqxx/pqxx>#include <string>

class DatabaseTest : public ::testing::Test {protected: void SetUp() override { conn = new pqxx::connection( "host=" + std::string(std::getenv("DB_HOST")) + " port=" + std::string(std::getenv("DB_PORT")) + " user=" + std::string(std::getenv("DB_USER")) + " password=" + std::string(std::getenv("DB_PASSWORD")) + " dbname=" + std::string(std::getenv("DB_NAME")) ); }

void TearDown() override { delete conn; }

pqxx::connection *conn;};

TEST_F(DatabaseTest, CanInsertAndReadData) { pqxx::work txn(*conn); txn.exec("CREATE TABLE IF NOT EXISTS test_table (id SERIAL PRIMARY KEY, value TEXT)"); txn.exec("INSERT INTO test_table (value) VALUES ('hello')"); pqxx::result res = txn.exec("SELECT value FROM test_table"); EXPECT_EQ(res[0][0].as<std::string>(), "hello"); txn.commit();}
```

المدونات

توصيات الكتب