Go में कैश: परीक्षण का दुश्मन? फोर्स रीटेस्टिंग को समझना

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Go परीक्षण परिणाम क्यों छिपाता है? (और यह जीवन को कैसे बिगाड़ता है)

\n\n

कल्पना करें: आप Go में लिख रहे हैं, go test चलाते हैं, हरा निशान देखते हैं... लेकिन कुछ गलत हो गया है। आपने एक बग ठीक किया, फिर से टेस्ट चलाते हैं — और फिर से हरी बत्ती। लेकिन बग अभी भी बाकी है! परिचित लगता है? Go टेस्ट कैशिंग की दुनिया में आपका स्वागत है।

\n\n

Go एक ऐसी भाषा है जो गति पसंद करती है। एक ही टेस्ट को दस बार न चलाने के लिए, कंपाइलर परिणामों को कैश करता है। यह तब तक सुविधाजनक लगता है जब तक आप ऐसी स्थिति का सामना नहीं करते जहां Go टेस्ट कैश आपके खिलाफ काम करने लगता है। यह विशेष रूप से उन डेवलपर्स को प्रभावित करता है जो इंटीग्रेशन टेस्ट, फ़ाइल सिस्टम या बाहरी API के साथ काम करते हैं।

\n\n

इस लेख में, हम समस्या को हल करने के दो तरीकों पर चर्चा करेंगे: force retesting (जबरन पुनः चलाना) और पूर्ण टेस्ट कैश को अक्षम करना। आप जानेंगे कि कब क्या उपयोग करना है, और काम करने वाले कोड उदाहरण प्राप्त करेंगे।

\n\n

Go में टेस्ट कैशिंग कैसे काम करता है

\n\n

इसे तोड़ने से पहले, आइए समझें कि यह कैसे काम करता है। Go टेस्ट परिणामों को निम्नलिखित के हैश के आधार पर कैश करता है:

\n
    \n
  • स्रोत कोड (.go फ़ाइलें)
  • \n
  • टेस्ट फ़ाइलें
  • \n
  • पर्यावरण चर
  • \n
  • कंपाइलेशन फ़्लैग
  • \n
\n\n

यदि कुछ भी नहीं बदला है — Go बस कैश किया गया परिणाम दिखाता है। तेज़? हाँ। खतरनाक? बिल्कुल! कल्पना करें कि आपका टेस्ट समय, यादृच्छिक संख्याओं या बाहरी सेवा पर निर्भर करता है। कैश कहेगा: "सब ठीक है!", जबकि वास्तव में टेस्ट बहुत पहले फेल हो गया होता।

\n\n
// एक टेस्ट का उदाहरण जो कैश के कारण झूठा हरा होगा\nfunc TestCurrentTime(t *testing.T) {\n    now := time.Now()\n    if now.Year() != 2024 {\n        t.Errorf("वर्ष 2024 होना चाहिए, %d प्राप्त हुआ", now.Year())\n    }\n}
\n\n

इस टेस्ट को एक बार चलाएं — यह पास हो जाएगा। कोड में वर्ष को 2025 में बदलें? कैश फिर भी पुराना परिणाम दिखाएगा। और आप सोचते रहेंगे कि CI क्यों फेल हो रहा है, जबकि लोकली सब कुछ "काम" कर रहा है।

\n\n

दृष्टिकोण 1: Force retesting (जबरन पुनः चलाना)

\n\n

कैश से निपटने का सबसे लोकप्रिय तरीका -count=1 फ़्लैग है। यह शुद्ध रूप में force retesting है। यह Go से कहता है: "कैश पर भरोसा मत करो, टेस्ट को फिर से चलाओ"।

\n\n
// जबरन पुनः चलाने के साथ चलाएं\ngo test -count=1 ./...
\n\n

-count=1 क्यों, -count=0 क्यों नहीं? क्योंकि -count टेस्ट चलाने की संख्या निर्धारित करता है। 1 न्यूनतम मान है जो कैश को अक्षम करता है। 0 कुछ भी नहीं चलाएगा।

\n\n

force retesting का उपयोग कब करें

\n
    \n
  • इंटीग्रेशन टेस्ट जो DB या API तक पहुंचते हैं
  • \n
  • रैंडम डेटा वाले टेस्ट (fuzz-टेस्ट, UUID जनरेशन)
  • \n
  • समय पर निर्भर टेस्ट (टाइमआउट, तिथियां)
  • \n
  • लोकल डेवलपमेंट, जब आप बार-बार कोड बदलते हैं
  • \n
\n\n

उदाहरण: force retesting के साथ इंटीग्रेशन टेस्ट

\n\n
package db_test\n\nimport (\n    "testing"\n    "time"\n)\n\nfunc TestDatabaseConnection(t *testing.T) {\n    // यह टेस्ट लाइव सर्वर पर निर्भर करता है\n    // -count=1 के बिना यह पुराना परिणाम दिखा सकता है\n    db := connectToDatabase()\n    if err := db.Ping(); err != nil {\n        t.Fatalf("कनेक्ट नहीं हो सका: %v", err)\n    }\n    \n    // अस्थायी देरी का अनुकरण\n    time.Sleep(100 * time.Millisecond)\n    if err := db.Query("SELECT 1"); err != nil {\n        t.Errorf("क्वेरी विफल: %v", err)\n    }\n}
\n\n

चलाएं: go test -count=1 -v ./db/। अब हर रन ईमानदार है। लेकिन एक बात है: force retesting समस्या को वैश्विक रूप से हल नहीं करता है। यदि आप फ़्लैग भूल जाते हैं — कैश वापस आ जाएगा।

\n\n

दृष्टिकोण 2: टेस्ट कैश को पूरी तरह से अक्षम करना

\n\n

दूसरा विकल्प — कट्टरपंथी है। आप बस Go से कहते हैं: "कुछ भी कैश मत करो"। यह GOCACHE=off पर्यावरण चर या -count=1 फ़्लैग के माध्यम से किया जाता है।

ब्लॉग

पुस्तक अनुशंसाएँ