डॉकर के साथ रस्ट एकीकरण परीक्षण: A से Z तक
\n\nएकीकरण परीक्षण रस्ट में विश्वसनीय अनुप्रयोगों के विकास का एक महत्वपूर्ण चरण है। यूनिट परीक्षणों के विपरीत, एकीकरण परीक्षण बाहरी निर्भरताओं: डेटाबेस, कैश, मैसेज क्यू के साथ घटकों की अंतःक्रिया की जाँच करते हैं। डॉकर पृथक, पुनरुत्पादनीय परीक्षण वातावरण बनाने के लिए आदर्श है। इस लेख में, हम मूल आर्किटेक्चर से लेकर CI/CD तक, डॉकर का उपयोग करके रस्ट प्रोजेक्ट के एकीकरण परीक्षण को सेट करने का तरीका समझेंगे।
\n\n1. रस्ट एकीकरण परीक्षणों के लिए डॉकर सबसे अच्छा विकल्प क्यों है
\n\nरस्ट नेटिव कोड में कंपाइल होता है, लेकिन इसके अनुप्रयोग अक्सर बाहरी सेवाओं पर निर्भर होते हैं। डॉकर तीन प्रमुख समस्याओं का समाधान करता है:
\n- \n
- पृथक्करण: प्रत्येक परीक्षण एक साफ कंटेनर में चलता है, पिछले रन के प्रभाव को समाप्त करता है। \n
- पुनरुत्पादनीयता: PostgreSQL, Redis या Kafka के सटीक संस्करण स्थानीय मशीन और CI में समान व्यवहार सुनिश्चित करते हैं। \n
- गति: डॉकर इमेज कैश हो जाती हैं, और रस्ट परीक्षण एक बार कंपाइल होते हैं। \n
एक विशिष्ट प्रोजेक्ट पर विचार करें: PostgreSQL के साथ काम करने वाला Actix-web पर एक वेब सर्वर। हमारा लक्ष्य एक परीक्षण लिखना है जो डेटाबेस के साथ एक कंटेनर को ऊपर उठाता है, माइग्रेशन करता है और CRUD संचालन की जाँच करता है।
\n\n2. डॉकर कंपोज़ के साथ परीक्षण बुनियादी ढाँचा सेट करना
\n\nसुविधा के लिए, हम docker-compose.yml का उपयोग करते हैं, जो सभी निर्भरताओं का वर्णन करता है। प्रोजेक्ट रूट में एक फ़ाइल बनाएँ:
version: '3.8'\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 ports:\n - "5433:5432"\n tmpfs: /var/lib/postgresql/data # गति के लिए मेमोरी में डेटा\n\ntmpfs पर ध्यान दें - यह परीक्षणों को गति देता है क्योंकि डेटा डिस्क पर नहीं लिखा जाता है। पोर्ट 5433 को स्थानीय डेटाबेस के साथ विरोध से बचने के लिए चुना गया है।
अब कंटेनरों को प्रबंधित करने के लिए एक रस्ट फ़ंक्शन लिखते हैं। हम testcontainers क्रेट का उपयोग करते हैं - यह प्रोग्रामेटिक रूप से डॉकर कंटेनर चलाने की अनुमति देता है:
// tests/common/mod.rs\nuse testcontainers::{clients, images::postgres::Postgres, Container};\n\npub struct TestDb {\n pub container: Container<'static, Postgres>,\n pub connection_string: String,\n}\n\nimpl TestDb {\n pub fn new() -> Self {\n let docker = clients::Cli::default();\n let postgres_image = Postgres::default();\n let container = docker.run(postgres_image);\n \n let host = container.get_host();\n let port = container.get_host_port_ipv4(5432);\n let connection_string = format!(\n "postgres://postgres:postgres@{}:{}/postgres",\n host, port\n );\n \n TestDb { container, connection_string }\n }\n}\n\nइस मॉड्यूल का पुन: उपयोग सभी एकीकरण परीक्षणों में किया जा सकता है। परीक्षण विफल होने या प्रक्रिया समाप्त होने पर कंटेनर स्वचालित रूप से हटा दिया जाएगा।
\n\n3. वास्तविक अनुरोधों के साथ एकीकरण परीक्षण लिखना
\n\nएक परीक्षण बनाते हैं जो उपयोगकर्ता सम्मिलन और पढ़ने की जाँच करता है। मान लें कि हमारे पास मुख्य कोड में एक User संरचना और create_user और get_user फ़ंक्शन हैं।
// tests/integration_test.rs\nmod common;\n\nuse sqlx::PgPool;\nuse your_crate::{create_user, get_user, User};\n\n#[tokio::test]\nasync fn test_create_and_get_user() {\n let test_db = common::TestDb::new();\n let pool = PgPool::connect(&test_db.connection_string)\n .await\n .expect("Failed to connect to DB");\n \n // माइग्रेशन निष्पादित करें (यदि आप sqlx का उपयोग करते हैं)\n sqlx::migrate!().run(&pool).await.unwrap();\n \n // उपयोगकर्ता बनाएँ\n let user = User {\n name: "Alice".into(),\n email: "alice@example.com".into(),\n };\n let created = create_user(&pool, &us