Docker के साथ C++ इंटीग्रेशन टेस्टिंग: एडवांस्ड लेवल
\n\nइंटीग्रेशन टेस्टिंग C++ डेवलपमेंट का एक बेहद ज़रूरी चरण है, खासकर आधुनिक माइक्रोसर्विस आर्किटेक्चर में। पारंपरिक तरीके, जहाँ टेस्ट डेवलपर के एनवायरनमेंट में चलाए जाते हैं, अक्सर एनवायरनमेंट, लाइब्रेरी वर्जन और कॉन्फ़िगरेशन में अंतर के कारण एरर का कारण बनते हैं। Docker एक सुंदर समाधान प्रदान करता है: पूर्ण आइसोलेशन, रिप्रोड्यूसिबिलिटी और ऑटोमेशन। इस लेख में, हम Docker का उपयोग करके C++ ऐप्लिकेशन के एडवांस्ड इंटीग्रेशन टेस्टिंग तकनीकों को देखेंगे, जिसमें डिपेंडेंसी मैनेजमेंट, पैरेलल टेस्ट रनिंग और CI/CD इंटीग्रेशन शामिल है।
\n\n1. Docker पर टेस्ट एनवायरनमेंट का आर्किटेक्चर
\n\nभरोसेमंद इंटीग्रेशन टेस्टिंग की पहली सीढ़ी है Docker एनवायरनमेंट का सही आर्किटेक्चर। एक मोनोलिथिक कंटेनर के बजाय, हम सर्विसेज का एक कम्पोज़िशन बनाते हैं, जहाँ हर सर्विस अपने काम के लिए जिम्मेदार होती है: टेस्ट की जाने वाली सर्विस, डेटाबेस, कैश, मैसेज क्यू आदि।
\n\nआइए एक C++ माइक्रोसर्विस का उदाहरण देखें जो PostgreSQL और Redis का उपयोग करती है। फ़ाइल docker-compose.test.yml:
version: '3.8'\n\nservices:\n postgres_test:\n image: postgres:15-alpine\n environment:\n POSTGRES_USER: test_user\n POSTGRES_PASSWORD: test_pass\n POSTGRES_DB: test_db\n healthcheck:\n test: ["CMD-SHELL", "pg_isready -U test_user -d test_db"]\n interval: 2s\n timeout: 5s\n retries: 10\n\n redis_test:\n image: redis:7-alpine\n healthcheck:\n test: ["CMD", "redis-cli", "ping"]\n interval: 2s\n timeout: 5s\n retries: 10\n\n cpp_service_test:\n build:\n context: .\n dockerfile: Dockerfile.test\n depends_on:\n postgres_test:\n condition: service_healthy\n redis_test:\n condition: service_healthy\n environment:\n - DB_HOST=postgres_test\n - DB_PORT=5432\n - REDIS_HOST=redis_test\n - REDIS_PORT=6379\n - TEST_MODE=1\n volumes:\n - ./test_results:/app/test_results\n command: ["./run_integration_tests"]\n\nमुख्य बिंदु:
\n- \n
- Healthcheck यह सुनिश्चित करते हैं कि टेस्ट तभी शुरू हों जब डिपेंडेंसी तैयार हों। \n
- अलग नेटवर्क (ऑटोमैटिकली बनता है) टेस्ट एनवायरनमेंट को प्रोडक्शन से अलग रखता है। \n
- रिजल्ट के लिए वॉल्यूम टेस्ट पूरा होने के बाद रिपोर्ट लेने की सुविधा देता है। \n
2. Docker को ध्यान में रखते हुए C++ इंटीग्रेशन टेस्ट लिखना
\n\nआपके टेस्ट कंटेनराइज़्ड एनवायरनमेंट में काम करने के लिए तैयार होने चाहिए। इसका मतलब है कि बाहरी सर्विसेज से कनेक्शन का कॉन्फ़िगरेशन एनवायरनमेंट वेरिएबल्स के ज़रिए दिया जाना चाहिए, न कि हार्डकोड किया जाना चाहिए।
\n\nPostgreSQL के लिए Google Test और libpqxx का उपयोग करते हुए टेस्ट का उदाहरण:
\n\n#include <gtest/gtest.h>\n#include <pqxx/pqxx>\n#include <cstdlib>\n\nclass DatabaseIntegrationTest : public ::testing::Test {\nprotected:\n std::unique_ptr<pqxx::connection> conn;\n\n void SetUp() override {\n const char* db_host = std::getenv("DB_HOST");\n const char* db_port = std::getenv("DB_PORT");\n const char* db_user = std::getenv("POSTGRES_USER");\n const char* db_pass = std::getenv("POSTGRES_PASSWORD");\n const char* db_name = std::getenv("POSTGRES_DB");\n\n ASSERT_NE(db_host, nullptr) << "DB_HOST सेट नहीं है";\n ASSERT_NE(db_port, nullptr) << "DB_PORT सेट नहीं है";\n\n std::string conn_str = "host=" + std::string(db_host) +\n " port=" + std::string(db_port) +\n " user=" + std::string(db_user ? db_user : "test_user") +\n " password=" + std::string(db_pass ? db_pass : "test_pass") +\n " dbname=" + std::string(db_name ? db_name : "test_db");\n\n try {\n conn = std::make_unique<pqxx::connect