Kama majaribio yako ya barua pepe (email tests) yanafanya kazi vizuri kwenye laptop yako lakini yanaporomoka mara tu yanapofika kwenye CI, hauko peke yako. Jibu la kawaida ni kuweka sleep calls kwenye kodi ya jaribio au kuongeza idadi ya majaribio upya (retry count) hadi ujenzi (build) upite. Hiyo inaweza kutuliza kelele kwa siku moja, lakini haitengenezi hitilafu (bug). Inaficha tu.

Tatizo halisi ni jinsi jaribio lako linavyotambua ni barua pepe gani ya kufungua.

Tatizo la Sanduku la Barua la Pamoja (Shared Inbox)

Kwenye mashine yako ya ndani (local machine), unaendesha jaribio moja kwa wakati mmoja. Barua pepe moja inafika. Unaichukua. Ni rahisi.

CI ni mazingira tofauti kabisa. Pull request moja inaweza kuamsha kazi nne, nane, au kumi na sita zinazoendelea kwa wakati mmoja (parallel jobs). Ikiwa zote zinatumia sanduku la barua la majaribio la pamoja—iwe ni seva ya Mailosaur, sanduku la Mailtrap, au akaunti halisi kwenye domain ya staging—zote zinaandika kwenye sehemu moja (bucket) kwa wakati mmoja. Kazi A inatuma ukarabati wa nenosiri (password reset). Kazi B inatuma mwaliko. Kazi C inajaribu tena mtiririko wa ukaribisho ulioshindwa. Wakati huo huo, wafanyakazi wa nyuma (background workers) na foleni za uwasilishaji huleta mabadiliko ya ghafla (jitter) ambayo huwezi kuyadhibiti.

Kila kazi inapofikia sanduku hilo la pamoja na kuomba ujumbe mpya zaidi wenye mada "Reset your password," inakuwa mbio. Jaribio linaloshinda linapata barua pepe sahihi. Jaribio linaloshindwa linabonyeza kiungo kilichokusudiwa kazi nyingine, linathibitisha (assert) dhidi ya maudhui yasiyo sahihi, na kushindwa kwa hitilafu inayoonekana kama tatizo la muda (timing problem). Si tatizo la muda. Ni tatizo la utambulisho (identity problem).

Kwa Nini "Ujumbe Mpya Zaidi" Unashindwa

Mtindo huu usio imara ni rahisi kuingia ndani kwa sababu unaonekana kuwa wa asili:

  1. Amsha mtiririko wa mtumiaji.
  2. Chunguza sanduku la barua kila baada ya sekunde chache.
  3. Fungua ujumbe wa hivi karibuni unaoendana na mada.
  4. Bonyeza kiungo cha kwanza na uendeshe uthibitisho (assertions).

Hii inavurugika kwa sababu kadhaa zaidi ya uendeshaji wa sambamba (parallelism). Jaribio la kurudia (retry) kutoka kwenye uendeshaji uliopita ulioshindwa linaweza kuchelewa kuwasilishwa, na ghafla kuwa ujumbe mpya zaidi wakati jaribio lako la sasa linachunguza sanduku. Wafanyakazi wa nyuma ndani ya programu yako wanaweza kupanga foleni ya barua pepe mbili na kuwasilisha ya pili kabla ya ya kwanza. Mistari ya mada pekee ni utambulisho dhaifu; programu yako ya staging inaweza kutuma barua pepe zinazofanana kutoka njia tofauti. Kupanga kwa kutumia muda (timestamp) ni mbaya zaidi kuliko inavyoonekana kwa sababu tofauti ya saa (clock skew) kati ya CI runner na mtoa huduma wa barua pepe ni halisi, na API za barua pepe mara nyingi huhifadhi (cache) au kukusanya (batch) viashiria vyao.

Timestamp zinakuwa zisizo na uhakika katika mazingira yenye shughuli nyingi. Unahitaji kitu cha moja kwa moja.

Run Token Ni Nini Haswa

Run token ni mfululizo wa herufi (string) wa kipekee unaozalishwa mwanzoni mwa jaribio lako na kuingizwa kwenye barua pepe ambayo programu yako inatuma. Hauna haja ya kuonekana na mtumiaji, na hauna haja ya kuwa na muonekano mzuri. Unahitaji tu kuhakikisha kwamba unaweza kuthibitisha ujumbe huu mahususi unamilikiwa na utekelezaji huu mahususi wa jaribio.

Mifano halisi hufanya kazi vizuri zaidi. Kabla ya jaribio kuanza, zalisha token kama:

  • A UUID: 550e8400-e29b-41d4-a716-446655440001
  • A build-scoped request ID: req_ci_build_4821_a7f3
  • An invite slug or metadata suffix: signup-token-8k2m9n
  • A random hex string generated by the test runner: test-run-a4f9c2d1

Ikiwa unadhibiti kodi ya backend, pitisha token kwenye muktadha wa barua pepe na uionyeshe mahali fulani kwenye mwili (body) wa barua pepe. Ikiwa unafanyia majaribio programu ya "black-box", angalia kama programu tayari inakubali uwanja wa rejeleo (reference field) ambao unaweza kuutumia. Ikiwa sivyo, wakati mwingine unaweza kuingiza token kwenye sehemu ya ndani ya mpokeaji (local-part) ukitumia plus addressing—testuser+a4f9c2d1@example.com—ingawa hiyo inafanya kazi tu ikiwa programu yako inahifadhi na kuirudisha kwenye barua pepe.

Lengo ni kuacha kulinganisha kwa kutumia metadata ambayo mfumo wa barua pepe tayari unamiliki. Linganisha kwa kutumia data ambayo jaribio lako linamiliki.

Mtindo wa Kuaminika

Badilisha algoriti ya "ujumbe mpya zaidi" na utafutaji mdogo unaoendeshwa na token:

  1. Zalisha run token kabla ya kuamsha mtiririko wowote.
  2. Anza kitendo cha mtumiaji, ukihakikisha kuwa programu itajumuisha token kwenye barua pepe inayotumwa.
  3. Chunguza mtoa huduma wa barua pepe kwa kutumia vichujio vilivyowekewa kikomo kwenye token hiyo. Ikiwa API inasaidia utafutaji wa mwili (body search), itumie. Ikiwa sivyo, chukua ujumbe unaowezekana na utafute (grep) miili yao upande wa mteja (client-side).
  4. Thibitisha kuwa token ipo kwenye mwili wa ujumbe kabla ya kugusa viungo, vitufe, au kodi za uthibitisho.
  5. Baada ya hapo pekee, chukua URL ya uthibitisho au kodi na uendelee.

Mfuatano huu ni muhimu. Ikiwa utachukua kiungo kwanza na kisha ukakagua token, tayari umeshabonyeza barua pepe isiyo sahihi. Uthibitisho (assertion) ndio mlinzi wako.

Kwa vitendo, msaidizi wako (helper) anapaswa kutafuta Subject:"Welcome to AppName" AND Body:"a4f9c2d1" badala ya Subject:"Welcome to AppName" sort:-received. Huduma nyingi za majaribio ya barua pepe hutoa API za utafutaji zinazokubali vichujio vya maudhui ya mwili (body content filters). Zitumie. Ikiwa unafanya kazi na mtoa huduma rahisi zaidi, weka mantiki yako ya upokeaji (polling logic) mahali pamoja ili uweze kuongeza uchujaji wa upande wa mteja (client-side filtering) kwa uthabiti katika kila jaribio.

Kanuni Tatu za Kuifanya Mifumo Iwe ya Kweli

Token ya utendaji (run token) inafanya uteuzi uwe thabiti, lakini bado unahitaji nidhamu kuhusu jinsi unavyopokea barua pepe (poll) na unachofanya mambo yanapoharibika.

Rekodi hali ya sanduku la barua pepe (inbox) unapofeli. Jaribio linapofeli, toa utambulisho wa sanduku la barua pepe, mada (subject line) uliyoulizia, muda kamili (timestamp window), na jinsi barua pepe zilivyolingana na vigezo vyako. Hii inageuza hitilafu isiyo wazi ya "email haijapatikana" kuwa maelezo ya wazi. Ikiwa kazi (job) 7823 ilichukua ujumbe wa kujaribu tena (retry message) kutoka kazi 7821 kwa sababu uliwasili sekunde tatu baadaye, kumbukumbu zako (logs) zinapaswa kuonyesha hilo waziwazi. Bila muktadha huu, utalaumu muda na kuongeza muda mwingine wa kusubiri (sleep).

Weka upokeaji wote wa barua pepe katika faili moja la msaidizi (helper file). Usitawanye wito wa setTimeout na cy.task kwenye faili ishirini za majaribio. Unganisha mantiki inayosubiri ujumbe, inajaribu tena wito wa API, na inatumia mfumo wa kupunguza kasi (backoff). Ikiwa kila jaribio linatumia msaidizi uleule, sheria zako za uchujaji zitabaki kuwa thabiti, na unapoboresha mantiki ya utafutaji, kila jaribio litanufaika. Pia inafanya iwe rahisi kusimamia ukaguzi wa token; ikiwa msaidizi unahitaji hoja ya token (token argument), hakuna mtu anayeweza kurudi kwa bahati mbaya kwenye mbinu ya "ujumbe wa hivi karibuni" (latest message).

Angalia majaribio yako ya kurudia (retries). Majaribio ya kurudia ni ya kawaida katika CI, lakini kila jaribio la kurudia linatengeneza barua pepe nyingine kwenye sanduku la barua pepe. Ikiwa jaribio lako linapita katika jaribio la tatu, unaweza kusherehekea na kuendelea. Unachokosa ni kwamba majaribio ya kwanza na ya pili yalifichua hitilafu halisi—kama vile race condition, utumaji wa mara mbili, au kosa la kielelezo (missing index)—ambayo barua pepe za ziada zilificha. Ikiwa lazima utumie majaribio ya kurudia, angalia ikiwa sanduku la barua pepe lina nakala zinazojirudia zisizotarajiwa baada ya kufeli. Bora zaidi, fikiria kusafisha sanduku la barua pepe au kutumia anwani ya kipekee kwa kila kazi ikiwa mtoa huduma wako unasaidia sanduku za barua pepe zinazobadilika (dynamic inboxes). Majaribio ya kurudia yasitoke kuwa mkakati wa kuficha mantiki ya uteuzi isiyoaminika.

Hitimisho la Kweli

Kupanga sanduku la barua pepe kwa tarehe na kuchukua matokeo ya juu siyo jaribio. Ni kukisia kumevalishwa kodi. Token ya utendaji (run token) haigharimu karibu kitu—kigezo kimoja cha maandishi (string variable), parameter moja ya ziada ya kichujio, labda mabadiliko madogo ya kiolezo (template)—na inatoa utambulisho thabiti kwa jaribio lako. Inathibitisha kuwa ujumbe ulio mbele yako unahusiana na utendaji unaoufanya sasa hivi.

Acha kuongeza muda wa kusubiri (sleeps) na kutegemea mtandao utafanya kazi vizuri. Tengeneza token, iweke kwenye barua pepe, na uitafute moja kwa moja. Michakato yako ya CI itakuwa ya haraka zaidi, kumbukumbu zako (logs) zitakuwa zinazosomika, na hatimaye utaamini kile ambacho seti ya barua pepe inakuambia.