Skip to content
Engineering

फ्लेक्स के बिना साइनअप टेस्ट के लिए टेम्प ईमेल जेनरेट करें

| | 12 मिनट पढ़ें
Generate Temp Email for Signup Tests Without Flakes
Generate Temp Email for Signup Tests Without Flakes

साइनअप फ्लो ऑटोमेटेड टेस्ट के फ्लेकी होने के लिए सबसे आसान जगहों में से एक हैं। इसलिए नहीं कि आपके UI assertions गलत हैं, बल्कि इसलिए कि ईमेल डिलीवरी एसिंक्रोनस, नॉन-डिटर्मिनिस्टिक है, और अक्सर एक विशिष्ट टेस्ट रन से कॉरिलेट करना मुश्किल होता है।

यदि आपने कभी ऐसा CI बिल्ड शिप किया है जो “verification email not received” के साथ अटपटाई से फेल हो जाता है, तो आप अकेले नहीं हैं। फिक्स शायद ही कभी “sleep बढ़ाना” होता है। फिक्स है ईमेल को टेस्ट में प्रोग्रामेबल, आइसोलेटेड, और मशीन-रीडेबल बनाना।

यह गाइड दिखाता है कि साइनअप टेस्ट के लिए टेम्प ईमेल इनबॉक्स कैसे जेनरेट करें जो पैरेलल CI, रिट्राई, और variable delivery times के तहत विश्वसनीय रहे।

साइनअप ईमेल टेस्ट क्यों फ्लेक होते हैं (और “नॉन-फ्लेकी” का वास्तव में क्या मतलब है)

एक नॉन-फ्लेकी साइनअप टेस्ट वह नहीं है जो “आमतौर पर पास होता है।” यह वह है जो:

  • हमेशा एक स्पष्ट कंडीशन पर इंतजार करता है (एक अपेक्षित ईमेल आती है)।
  • ईमेल को विशिष्ट टेस्ट रन से कॉरिलेट करता है।
  • कंटेंट को डिटर्मिनिस्टिकली पार्स करता है (HTML blobs पर कोई brittle regex नहीं)।
  • रिट्राई और डुप्लिकेट्स को सुरक्षित रूप से हैंडल करता है।

ईमेल कई failure modes पेश करता है जो सामान्य HTTP-based flows में मौजूद नहीं होते।

ईमेल वेरिफिकेशन टेस्ट में आम फ्लेक sources

Flake source CI में यह कैसा दिखता है अंतर्निहित कारण नॉन-फ्लेकी फिक्स
Shared inbox collisions टेस्ट गलत वेरिफिकेशन लिंक खोलता है कई runs एक ही address reuse करते हैं प्रति रन एक डिस्पोजेबल इनबॉक्स (या प्रति टेस्ट)
“Sleep-based waiting” कभी-कभी ईमेल sleep window के बाद आती है Delivery latency अलग होती है कंडीशन या timeout तक poll या webhook
Non-machine-readable email Parser टूट जाता है जब copy बदलती है HTML templates अक्सर बदलते हैं ईमेल को संरचित JSON के रूप में receive करें, link/code extract करें
Duplicate emails टेस्ट पुराने लिंक के साथ verify करता है, फेल हो जाता है Retries, resend flows, background jobs Latest message चुनें, idempotent assertions
Parallelism issues 1 टेस्ट दूसरे का ईमेल consume करता है Multi-worker CI state share करता है Unique inbox IDs, कोई global mailbox नहीं
Provider filtering कोई ईमेल कभी नहीं आती Domain reputation, spam filtering Deliverable domain strategy का उपयोग (shared या custom)

इस article का बाकी हिस्सा इन्हें engineering constraints में बदलने पर केंद्रित है जिन्हें आपका test harness satisfy कर सके।

Core pattern: प्रति साइनअप attempt एक इनबॉक्स

सबसे प्रभावी reliability improvement है:

साइनअप action से ठीक पहले एक fresh disposable inbox बनाएं, फिर केवल उस इनबॉक्स में delivered emails का इंतजार करें।

यह बिल्कुल वही है जिसके लिए प्रोग्रामेबल टेम्प इनबॉक्स हैं। Mailhook के साथ, आप API के माध्यम से disposable inboxes बना सकते हैं और inbound emails को संरचित JSON के रूप में प्राप्त कर सकते हैं, या तो webhook notifications के माध्यम से या polling के माध्यम से।

यदि आप authoritative, हमेशा अप-टू-डेट feature surface और integration notes चाहते हैं, तो product का machine-readable reference हाथ में रखें: Mailhook’s llms.txt

आपको प्रति रन क्या स्टोर करना चाहिए

प्रत्येक साइनअप attempt को अपने correlation state के साथ एक रन के रूप में treat करें:

  • run_id (टेस्ट attempt के लिए एक UUID)
  • inbox_id (आपके temp inbox provider द्वारा returned)
  • email_address (inbox से derived)
  • start_time और एक timeout budget (डिटर्मिनिस्टिक waiting के लिए)

भले ही test के तहत application custom metadata pass करने का support न करे, inbox खुद correlation boundary बन जाता है।

एक सरल flow diagram दिखाता है: Test runner API के माध्यम से एक disposable inbox बनाता है, generated email address का उपयोग करके signup form submit करता है, फिर email event (polling या webhook) का इंतजार करता है, verification link extract करने के लिए संरचित JSON parse करता है, link पर visit करता है, और assert करता है कि account verify हो गया है।

फ्लेक्स के बिना waiting: polling sleeps से बेहतर है (और “eventually” polling से बेहतर है)

एक hard sleep एक अनुमान है। एक robust test तब तक इंतजार करता है जब तक कोई condition true न हो जाए।

ईमेल के लिए एक practical “eventually” contract

एक helper define करें जो तब तक इंतजार करे जब तक:

  • इनबॉक्स में कम से कम एक message exist करता है, और
  • Message आपकी अपेक्षा से match करता है (subject में “Verify” शामिल है, या इसमें verification URL है), और
  • Message current run के लिए “new enough” है (optional, लेकिन debugging के समय उपयोगी)

फिर enforce करें:

  • Max timeout (fast failures के लिए)
  • Backoff (API pressure कम करने के लिए)
  • Deterministic selection (newest matching message चुनें)

Example pseudocode (test-runner friendly)

// Pseudocode: अपने framework के लिए adapt करें
async function waitForVerificationEmail({ inboxId, timeoutMs }) {
  const start = Date.now();
  let delay = 250;

  while (Date.now() - start < timeoutMs) {
    const messages = await listInboxMessages(inboxId); // API के माध्यम से

    const candidate = messages
      .filter(m => (m.subject || '').toLowerCase().includes('verify'))
      .sort((a, b) => new Date(b.received_at) - new Date(a.received_at))[0];

    if (candidate) return candidate;

    await sleep(delay);
    delay = Math.min(delay * 1.5, 2000);
  }

  throw new Error('Timed out waiting for verification email');
}

यह CI में webhook-only approach से अधिक stable होता है, क्योंकि कई CI runners inbound network calls accept नहीं कर सकते। यदि आपके पास stable ingress है (या आप tests को ऐसे environment में run करते हैं जहां webhooks आप तक पहुंच सकते हैं), तो webhooks latency कम कर सकते हैं और waiting को simplify कर सकते हैं।

कम HTML parse करें, अधिक intent assert करें: संरचित JSON को प्राथमिकता दें

ईमेल templates बदलते हैं। Designers copy tweak करते हैं। Marketing एक line add करती है। यदि आपका test raw HTML scrape कर रहा है, तो यह signup flow से असंबंधित reasons के लिए break हो जाएगा।

एक बेहतर goal intent assert करना है:

  • “एक ईमेल आई।”
  • “इसमें verification URL (या one-time code) शामिल है।”
  • “URL को follow करने से account verify हो जाता है।”

इसीलिए developer-first temp inboxes जो संरचित JSON return करते हैं इतने उपयोगी हैं। आप विश्वसनीय रूप से extract कर सकते हैं:

  • Subject
  • From/To
  • Received timestamp
  • Parsed body parts
  • Links (आपके parsing approach के आधार पर)

Extraction strategies जो stable रहती हैं

एक approach चुनें और इसे अपने test suite में standardize करें:

  • Verification link approach: आपके verification route pattern से match करने वाला first link extract करें।
  • OTP approach: “OTP” marker के पास का first 6-digit token extract करें।
  • Header-based approach: यदि आपका app headers में test-friendly markers add करता है, तो उन पर assert करें (staging environments में उपयोगी)।

यदि आपकी team email templates की मालिक है, तो anchor element के आसपास data-test="verify-link" जैसा hidden, test-only marker add करने पर विचार करें। यह tests को visual design से couple किए बिना resilient रखता है।

Duplicates और retries को safely handle करें

साइनअप flows अक्सर emails resend करते हैं, या तो user action (“Resend verification email”) द्वारा या background retries द्वारा।

एक flaky test हो सकता है:

  • First email खोले (जिसमें expired link है)
  • बाद की email ignore करे जिसमें valid link है

इसके बजाय:

  • हमेशा latest matching message चुनें।
  • Verify step को idempotent बनाएं, मतलब दो बार verify करना test को fail नहीं करना चाहिए (आपके app को predictably respond करना चाहिए)।

एक simple duplicate-safe rule

  • “verification-like” subject/body के आधार पर messages filter करें
  • Received time descending के आधार पर sort करें
  • Newest का उपयोग करें

यदि आप frequent duplicates देखते हैं, तो यह आमतौर पर आपकी mail-sending job semantics (idempotency keys, retry policies, और क्या आप “user created” और “email changed” दोनों पर send करते हैं) को review करने का signal है।

Inbox collisions के बिना parallel CI

Parallelism वह जगह है जहां shared inboxes मर जाते हैं।

यदि 10 CI workers [email protected] को reuse करते हैं, तो आप eventually:

  • गलत ईमेल consume करेंगे
  • गलत account verify करेंगे
  • ऐसे तरीके से fail होंगे जो locally reproduce करना असंभव है

फिक्स architectural है: सुनिश्चित करें कि प्रत्येक worker को अपनी inbox boundary मिले।

एक stable parallelization model

  • प्रति टेस्ट एक temp inbox बनाएं (maximum isolation), या
  • प्रति spec file एक temp inbox बनाएं (कम inboxes, फिर भी पर्याप्त isolated), या
  • प्रति worker process एक temp inbox बनाएं

आप क्या चुनते हैं यह आपके suite size और email volume पर depend करता है, लेकिन principle वही है: कभी भी single shared mailbox को global state के रूप में rely न करें।

साइनअप टेस्ट के लिए webhooks vs polling

Mailhook real-time webhook notifications और polling API दोनों support करता है। कौन सा “best” है यह आपके test environment पर depend करता है।

Approach सबसे अच्छा कब Trade-offs
Polling CI runners बिना inbound access के, सबसे simple harness थोड़ी अधिक latency, आपको timeouts/backoff implement करना होगा
Webhooks आप inbound requests को reliably receive कर सकते हैं (staging infra, test harness service) Secure endpoint और correlation logic की जरूरत

भले ही आप webhooks prefer करें, tests के लिए polling को fallback के रूप में रखना smart है। व्यावहारिक रूप से, “webhook plus polling fallback” सबसे resilient setup है।

Webhook-based tests के लिए security note

यदि आपके tests inbound webhook calls accept करते हैं, तो authenticity validate करें। Mailhook security के लिए signed payloads support करता है, जो spoofed requests को prevent करने में मदद करता है जो email को “received” के रूप में mark कर दें जब वह नहीं थी।

Domain strategy: shared domains vs custom domains

Deliverability tests के लिए matter करती है। कुछ systems certain domains को filter या block करते हैं, especially यदि वे disposable लगते हैं।

  • Shared domains start करने के लिए fast हैं और internal QA के लिए great हैं।
  • Custom domains important हो सकते हैं जब आपको consistent deliverability characteristics चाहिए (या जब आपका app unknown domains को block करता है)।

यदि आपके signup system में domain allowlists/denylists शामिल हैं, तो अपनी testing domain strategy को production rules के साथ align करें। “Flakes” का एक आश्चर्यजनक रूप से common source actually deterministic blocking है जो केवल certain environments को affect करती है।

Failures को actionable बनाएं (ताकि flakes घंटों की बर्बादी न करें)

जब email wait timeout हो जाता है, तो आपके test output को आपको जल्दी debug करने में मदद करनी चाहिए। कम से कम, log करें:

  • run_id, inbox_id, और generated email address
  • आपने कितनी देर इंतजार किया
  • कितने messages present थे (भले ही कोई match न किया हो)
  • Last N emails के subjects (यदि available हैं)

यह “email not received” को concrete signal में बदल देता है: क्या app ने send नहीं किया? क्या message अलग subject के साथ arrive किया? क्या आपके filter ने इसे miss किया?

Modern AI-driven QA में temp inboxes कहां fit करते हैं

यदि आप end-to-end flows drive करने के लिए LLM agents का उपयोग कर रहे हैं (या test steps generate और validate करने के लिए), तो email अक्सर missing tool है। Agents CI के अंदर reliably “Gmail check” नहीं कर सकते, लेकिन वे API call कर सकते हैं, structured JSON का इंतजार कर सकते हैं, और उस पर act कर सकते हैं।

यह विशेष रूप से onboarding flows और user education sequences वाले products के लिए उपयोगी है। उदाहरण के लिए, Scenario IQ जैसा AI training platform complete customer journey के हिस्से के रूप में verification, onboarding, और follow-up emails भेज सकता है। Programmatically assert करने में सक्षम होना कि वे emails exist करती हैं (और सही calls to action contain करती हैं) agentic QA को कहीं अधिक realistic बनाता है।

एक minimal, non-flaky recipe जिसे आप copy कर सकते हैं

यदि आप stable signup tests का shortest path चाहते हैं, तो इस exact loop को implement करें:

  • API के माध्यम से एक disposable inbox बनाएं।
  • अपने signup form submission में generated address का उपयोग करें।
  • Polling (या webhooks) का उपयोग करके तब तक wait करें जब तक verification email appear न हो जाए, timeout से bounded।
  • Email को JSON के रूप में parse करें और verification link या OTP को deterministically extract करें।
  • Verification complete करें।
  • Assert करें कि account verify हो गया है।

यदि आप tooling evaluate कर रहे हैं, तो specifically देखें: API-created inboxes, structured JSON output, webhook support, polling support, और security features जैसे signed payload verification।

एक CI pipeline illustration दिखाता है कि कई parallel test workers में से प्रत्येक अपना disposable inbox ID बनाता है, separate inboxes और separate verification emails के लिए arrows के साथ, isolation पर जोर देते हुए और कोई shared mailbox collisions नहीं।

Mailhook के साथ practice में लगाना

Mailhook बिल्कुल इसी class की problem के लिए designed है: प्रोग्रामेबल, डिस्पोजेबल इनबॉक्स जिन्हें आपके tests (और AI agents) demand पर बना सकते हैं, फिर JSON के रूप में consume कर सकते हैं, या तो real-time webhooks के माध्यम से या polling के माध्यम से।

यदि आप implement करने से पहले exact current capabilities और integration expectations को validate करना चाहते हैं, तो Mailhook’s llms.txt पर machine-readable overview से शुरू करें, फिर इसके आसपास अपना “one inbox per signup attempt” harness build करें।

testing email automation CI/CD QA temp email

संबंधित लेख