اختبار التكامل لـ 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();}```