102 ንባባት

ንተመሳሳሊ ኮድ ብ Testing/Synctest ከመይ ጌርና ንፍትኖ ኣብዚ ኣሎ፡ Go 1.24

Go12m2025/04/06
Read on Terminal Reader

ኣዝዩ ነዊሕ፤ ንምንባብ

እዚ ጽሑፍ እዚ ነዚ ፈተነ ዝደረኾ ድርኺት ዝገልጽ፡ ከመይ ጌርካ ነቲ synctest package ከም እትጥቀመሉ ዘርኢ፡ ከምኡ’ውን ብዛዕባ መጻኢኡ ክዛተየሉ እዩ።
featured image - ንተመሳሳሊ ኮድ ብ Testing/Synctest ከመይ ጌርና ንፍትኖ ኣብዚ ኣሎ፡ Go 1.24
Go HackerNoon profile picture

ሓደ ካብቲ ናይ ጎ ፊርማ ባህርያት፡ ንተመሳሳሊ ምትእስሳር ዝኸውን ኣብ ውሽጡ ዝተሃንጸ ደገፍ እዩ። ጎሩቲንን ቻነላትን ንተመሳሳሊ መደባት ንምጽሓፍ ቀለልትን ውጽኢታውያንን ቀዳሞት እዮም።


ይኹን እምበር፡ ንተመሳሳሊ መደባት ምፍታን ከቢድን ንጌጋታት ዝቃላዕን ክኸውን ይኽእል።


ኣብ Go 1.24፡ ንፈተነ ተጓናጺ ኮድ ዝድግፍ ሓድሽ፡ ፈተነኣዊ testing/synctest ፓኬጅ ነተኣታቱ ኣለና። እዚ ጽሑፍ እዚ ነዚ ፈተነ ዝደረኾ ድርኺት ዝገልጽ፡ ከመይ ጌርካ ነቲ synctest package ከም እትጥቀመሉ ዘርኢ፡ ከምኡ’ውን ብዛዕባ መጻኢኡ ክዛተየሉ እዩ።


ኣብ Go 1.24 እቲ testing/synctest ፓኬጅ ፈተነ ዝግበረሉ ኮይኑ ናይ Go ምትእስሳር መብጽዓ ኣይግዛእን እዩ። ብነባሪ መልክዑ ኣይርአን እዩ። ንዕኡ ንምጥቃም፡ ኮድካ ምስ GOEXPERIMENT=synctest ኣብ ከባቢኻ ተሰሪዑ ኣጠቓልል።

ተደጋጋሚ መደባት ምፍታን ከቢድ እዩ።

ንመጀመርታ ግዜ፡ ሓደ ቀሊል ኣብነት እስከ ንርአ።


እቲ context.AfterFunc ፋንክሽን ድሕሪ ሓደ ዓውደ-ጽሑፍ ምስተሰረዘ ሓደ ፋንክሽን ኣብ ናይ ገዛእ ርእሱ goroutine ክጽዋዕ የዳሉ። AfterFunc ክኸውን ዝኽእል ፈተና ኣብዚ ኣሎ :

 func TestAfterFunc(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) calledCh := make(chan struct{}) // closed when AfterFunc is called context.AfterFunc(ctx, func() { close(calledCh) }) // TODO: Assert that the AfterFunc has not been called. cancel() // TODO: Assert that the AfterFunc has been called. }

ኣብዚ ፈተና ክልተ ኩነታት ክንፍትሽ ንደሊ፡ እቲ ፋንክሽን ቅድሚ እቲ ዓውደ-ጽሑፍ ምስራዙ ኣይጽዋዕን፡ እቲ ፋንክሽን ድማ ድሕሪ እቲ ዓውደ-ጽሑፍ ምስራዙ ይጽዋዕ


ኣብ ተጓናጺ ስርዓት ኣሉታዊ ምፍታሽ ኣጸጋሚ እዩ። እቲ ፋንክሽን ገና ከምዘይተጸውዐ ብቐሊሉ ክንፍትኖ ንኽእል ኢና , ግን ከመይ ጌርና ከምዘይጽዋዕ ንምርግጋጽ?


ልሙድ ኣገባብ፡ ሓደ ፍጻመ ከምዘይፍጸም ቅድሚ ምድምዳምካ፡ ንዝተወሰነ ግዜ ምጽባይ እዩ። ነዚ ዝገብር ኣብ ፈተናና ሓጋዚ ፋንክሽን ከነተኣታቱ ንፈትን።

 // funcCalled reports whether the function was called. funcCalled := func() bool { select { case <-calledCh: return true case <-time.After(10 * time.Millisecond): return false } } if funcCalled() { t.Fatalf("AfterFunc function called before context is canceled") } cancel() if !funcCalled() { t.Fatalf("AfterFunc function not called after context is canceled") }

እዚ ፈተና ቀስ ዝበለ እዩ: 10 ሚሊሰከንድ ብዙሕ ግዜ ኣይኮነን: ግን ኣብ ልዕሊ ብዙሕ ፈተናታት ይድመር።


እዚ ፈተና እዚ ውን ፍላኪ እዩ: 10 ሚሊሰከንድ ኣብ ቅልጡፍ ኮምፒተር ነዊሕ ግዜ እዩ፣ ኣብ ዝተኻፈለን ልዕሊ ዓቐን ዝተጻዕነን CI ስርዓታት ግን ንሓያሎ ካልኢታት ዝጸንሕ ዕረፍቲ ምርኣይ ዘይተለምደ ኣይኮነን።


ነቲ ፈተና ዝሓሰረ ንምግባር ብዋጋ ውሑድ ፍላኪ ክንገብሮ ንኽእል ኢና፡ ብዋጋ ፍላኪስ ንምግባር ድማ ውሑድ ስሉጥ ክንገብሮ ንኽእል ኢና፡ ግን ቅልጡፍን ዘተኣማምንን ክንገብሮ ኣይንኽእልን ኢና።

ምልላይ ናይ ፈተነ/ምትእስሳር ፓኬጅ

እቲ testing/synctest package ነዚ ጸገም ይፈትሖ። ነዚ ፈተና ቀሊልን ቅልጡፍን ዘተኣማምንን ክኸውን ዳግማይ ክንጽሕፎ የኽእለና፣ ኣብቲ ዝፍተን ኮድ ዝኾነ ለውጢ ከይገበርና።


እቲ ፓኬጅ ክልተ ተግባራት ጥራይ እዩ ዝሓዘ Run and Wait


Run ኣብ ሓድሽ goroutine ንሓደ ፋንክሽን ይጽውዕ። እዚ ጎሮቲንን ዝኾነ ብእኡ ዝጅምር ጎሮቲንን ኣብ ዝተነጸለ ሃዋህው ዝህሉ ኮይኑ ንሱ ድማ ፍንጣጣ ንብሎ ። Wait ኣብቲ ናይ ሕጂ ጎሮቲን ቡምባ ዘሎ ነፍሲ ወከፍ ጎሩቲን ኣብ ካልእ ጎሮቲን ኣብቲ ቡምባ ክዓግት ይጽበ።


ኣብ ላዕሊ ዘሎ ፈተናና testing/synctest package ተጠቒምና ዳግማይ ንጽሓፎ።

 func TestAfterFunc(t *testing.T) { synctest.Run(func() { ctx, cancel := context.WithCancel(context.Background()) funcCalled := false context.AfterFunc(ctx, func() { funcCalled = true }) synctest.Wait() if funcCalled { t.Fatalf("AfterFunc function called before context is canceled") } cancel() synctest.Wait() if !funcCalled { t.Fatalf("AfterFunc function not called after context is canceled") } }) }

እዚ ዳርጋ ምስቲ ናይ መጀመርታ ፈተናና ተመሳሳሊ እዩ፣ ግን ነቲ ፈተና ኣብ synctest.Run ጠቕሊልናዮ ኣለና።Run call and we call synctest.Wait እቲ ፋንክሽን ከምዝተጸውዐን ከምዘይተጸውዐን ቅድሚ ምርግጋጽና ተጸበ።


እቲ Wait ዝብል ተግባር ኣብ ቡምባ ናይቲ ደዋሊ ዘሎ ነፍሲ ወከፍ ጎሮቲን ክሳብ ዝዓግት ይጽበ። ምስ ተመልሰ፡ እቲ ናይ ዓውዲ ፓኬጅ ወይ ነቲ ፋንክሽን ከም ዝጸውዖ፡ ወይ ድማ ገለ ተወሳኺ ስጉምቲ ክሳብ ዘይንወስድ ከምዘይጽውዖ ንፈልጥ።


እዚ ፈተና ሕጂ ቅልጡፍን ዘተኣማምንን ኮይኑ ኣሎ።


እቲ ፈተና እውን ዝቐለለ እዩ: ነቲ calledCh ቻነል ብቡልያን ተኪእናዮ ኣለና። ቅድሚ ሕጂ ኣብ መንጎ test goroutineን AfterFunc goroutineን ናይ ዳታ ውድድር ንኸይፍጠር ቻነል ክንጥቀም የድልየና ነይሩ፡ ሕጂ ግን Wait function ነቲ synchronization ይህብ።


እቲ ናይ ውድድር መፍለጢ ንጻውዒት Wait ይርድኦ እዩ፣ እዚ ፈተና ድማ ምስ -race ክጎዪ ከሎ ይሓልፍ። ካልኣይ Wait ጻውዒት እንተኣሊናዮ፡ እቲ ናይ ውድድር ዲቴክተር ኣብቲ ፈተና ናይ ዳታ ውድድር ብትኽክል ክሕብር እዩ።

ናይ ፈተና ግዜ

መብዛሕትኡ ግዜ ተደጋጋሚ ኮድ ምስ ግዜ እዩ ዝዛረብ።


ምስ ግዜ ዝሰርሕ ኮድ ምፍታን ከቢድ ክኸውን ይኽእል እዩ። ኣብ ፈተነታት ሓቀኛ ግዜ ምጥቃም ከምቲ ኣብ ላዕሊ ዝረኣናዮ ቀስ ዝበለን ቅራፍ ዘለዎን ፈተነታት የስዕብ። ናይ ሓሶት ግዜ ምጥቃም ካብ time ፓኬጅ ተግባራት ምውጋድ የድሊ፣ ከምኡ’ውን ነቲ ኣብ ፈተነ ዘሎ ኮድ ምስ ኣማራጺ ናይ ሓሶት ሰዓት ክሰርሕ ምህዛን የድሊ።


እቲ testing/synctest package ግዜ ዝጥቀም ኮድ ንምፍታን ቀሊል ይገብሮ።


ኣብቲ ብ Run ዝተጀመረ ጎሮቲናት ናይ ሓሶት ሰዓት ይጥቀሙ። ኣብ ውሽጢ እቲ ቡምባ፡ ኣብቲ time ፓኬጅ ዝርከቡ ተግባራት ኣብቲ ናይ ሓሶት ሰዓት ይሰርሑ። ኩሉ ጎሮቲን ምስ ተዓጽወ ኣብቲ ቡምባ ግዜ ይግስግስ።


ንምርኣይ፡ ን context.WithTimeout function ዝኸውን ፈተና ንጽሓፍ። WithTimeout ውላድ ናይ ሓደ ዓውደ-ጽሑፍ ይፈጥር፣ እዚ ድማ ድሕሪ ዝተዋህበ ግዜ ምውዳእ ግዜኡ የብቅዕ።

 func TestWithTimeout(t *testing.T) { synctest.Run(func() { const timeout = 5 * time.Second ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() // Wait just less than the timeout. time.Sleep(timeout - time.Nanosecond) synctest.Wait() if err := ctx.Err(); err != nil { t.Fatalf("before timeout, ctx.Err() = %v; want nil", err) } // Wait the rest of the way until the timeout. time.Sleep(time.Nanosecond) synctest.Wait() if err := ctx.Err(); err != context.DeadlineExceeded { t.Fatalf("after timeout, ctx.Err() = %v; want DeadlineExceeded", err) } }) }

ነዚ ፈተና ልክዕ ምስ ሓቀኛ ግዜ ንሰርሕ ከም ዘለና ጌርና ኢና ንጽሕፎ። እቲ እንኮ ፍልልይ ነቲ ናይ ፈተነ ተግባር ኣብ synctest.Run ንጠቕልሎ ፣ ድሕሪ ነፍሲ ወከፍ time.Sleep ድማ synctest.Wait ንጽውዖ።ናይ ዓውደ-ጽሑፍ ፓኬጅ ታይመርስ ምጉያይ ክውድኡ ንጽበ ጻውዒት ድቃስ።

ምዕጋትን ምፍንጫልን

ኣብ testing/synctest ቁልፊ ኣምር እቲ ፍንጣጣ ብነባሪ መንገዲ ምዕጻው እዩ ። እዚ ዝኸውን ኣብቲ ቡምባ ዘሎ ነፍሲ ወከፍ ጎሮቲን ምስ ዝዕጾ፣ ኣብቲ ቡምባ ብኻልእ ጎሮቲን ጥራይ ክፍታሕ ዝኽእል።


ሓደ ፍንጣጣ ብነዊሕ እዋን ምስ ዝዕጾ፤

  • ዘይተኸፍለ Wait ጻውዒት እንተሃልዩ ይምለስ።
  • እንተዘይኮይኑ ግዜ ናብቲ ንሓደ ጎሮቲን እንተሃልዩ ክፈትሖ ዝኽእል ዝቕጽል ግዜ ይሰጋገር።
  • እንተዘይኮይኑ እቲ ዕንፍሩር ዕጽው ኮይኑ ሩን ስንባደ Run


ሓደ ፍንጣጣ ዝኾነ ጎሩቲን እንተተዓጽዩ ብነዊሕ እዋን ኣይዕገትን ግን ካብ ደገ እቲ ፍንጣጣ ብገለ ፍጻመ ክበራበር ይኽእል።


ምሉእ ዝርዝር ናይቶም ንሓደ ጎሮቲን ብነዊሕ እዋን ዝዓግቱ ስርሒታት፤

  • a send ወይ receive ኣብ nil ቻነል
  • ኣብ ውሽጢ ሓደ ቡምባ ኣብ ዝተፈጥረ ቻነል ዝተዓጽወ ምልኣኽ ወይ ምቕባል
  • ነፍሲ ወከፍ ጉዳይ ብነባሪ መንገዲ ዝዓግተሉ ምሩጽ መግለጺ
  • time.Sleep
  • sync.Cond.Wait
  • sync.WaitGroup.Wait

ሙቴክስ ዝበሃሉ።

ኣብ sync.Mutex ዝግበር ስርሒታት ብነባሪ ዝዓግት ኣይኮነን።


ፋንክሽን ዓለማዊ ሙቴክስ ምጥራይ ልሙድ እዩ። ንኣብነት ኣብቲ reflect package ዝርከቡ ብርክት ዝበሉ ተግባራት ብmutex ዝሕሎ ዓለማዊ ካሸ ይጥቀሙ። ኣብ ሲንክተስት ቡምባ ዝርከብ ጎሩቲን ካብቲ ቡምባ ወጻኢ ብጎሩቲን ዝተታሕዘ ሙቴክስ እናረኸበ ከሎ እንተዓጊቱ፡ ንነዊሕ እዋን ኣይዕገትን እዩ-ተዓጽዩ እዩ፡ ግን ካብ ቡምባ ወጻኢ ብዝመጽእ ጎሩቲን ክፍታሕ እዩ።


መብዛሕትኡ ግዜ ሙቴክስ ንነዊሕ እዋን ስለዘይሕዙ፡ ካብ testing/synctest 's consideration ጥራይ ኢና ነግልሎም።

ቻነላት

ኣብ ውሽጢ ዕንፍሩር ዝፍጠሩ ቻነላት ካብቶም ኣብ ደገ ዝተፈጥሩ ዝተፈለየ ባህሪ ኣለዎም።


ስርሓት ቻነል ብነባሪ ዝዕገት እቲ ቻነል ቡምባ (ኣብቲ ቡምባ ዝተፈጥረ) ምስ ዝኸውን ጥራይ እዩ። ካብ ደገ ቡምባ ኣብ ቡምባ ዘለዎ ቻነል ምስራሕ ስንባደ ይፈጥር።


እዞም ሕግታት እዚኦም ሓደ ጎሮቲን ኣብ ውሽጢ ፍንጣጣኡ ምስ ጎሮቲን ኣብ ዝረዳድኣሉ እዋን ጥራይ ብነባሪ መንገዲ ከም ዝዕገት የረጋግጹ።

I/O

ከም ካብ ምትእስሳር መርበብ ምንባብ ዝኣመሰሉ ናይ ደገ I/O ስርሓት ንነዊሕ እዋን ዝዓግቱ ኣይኮኑን።


ኔትወርክ ንባባት ካብ ደገ ቡምባ ብዝመጹ ጽሑፋት ክኽፈቱ ይኽእሉ እዮም፣ ምናልባት እውን ካብ ካልእ መስርሓት። ዋላ እቲ እንኮ ጸሓፊ ናብ ምትእስሳር መርበብ እውን ኣብ ሓደ ዓይነት ዕንፍሩር እንተሃለወ፡ እቲ ናይ ምዝዋር ግዜ ኣብ መንጎ ተወሳኺ ዳታ ክመጽእ ዝጽበ ምትእስሳርን እቲ ከርነል ዳታ ዝተቐበለሉን ኣብ መስርሕ ምብጻሕ ዝርከብን ርክብ ክፈሊ ኣይክእልን።


ንሓደ ኔትወርክ ሰርቨር ወይ ዓሚል ብ synctest ምፍታን ብሓፈሻ ናይ ሓሶት ኔትወርክ ኣተገባብራ ምቕራብ ከድሊ እዩ። ንኣብነት net.Pipe ፋንክሽን ኣብ ውሽጢ ዝኽሪ ኔትወርክ ምትእስሳር ዝጥቀሙን ኣብ synctest tests ክጥቀሙ ዝኽእሉን ጽምዲ net.Conn s ይፈጥር።

ዕድመ ቡምባ

እቲ Run ዝብል ፋንክሽን ኣብ ሓድሽ ቡምባ ሓደ goroutine ይጅምር። ኣብቲ ቡምባ ዘሎ ኩሉ ጎሩቲን ምስ ወጸ እዩ ዝምለስ። እቲ ዕንፍሩር ንነዊሕ እዋን እንተተዓጽዩን ብግዜ እናገስገሰ ክኽፈት እንተዘይክኢሉን ይስንብድ።


ነፍሲ ወከፍ ኣብቲ ቡምባ ዘሎ ጎሮቲን ቅድሚ ሩን ምምላሱ ክወጽእ ዝብል ጠለብ፡ ፈተነታት ቅድሚ ምዝዛሞም ዝኾነ ድሕረ ባይታ ጎሮቲን ንምጽራይ ክጥንቀቑ ኣለዎም ማለት እዩ።

ኔትወርክ ዘለዎ ኮድ ምፍታን

ካልእ ኣብነት ንርአ፡ ኣብዚ ግዜ እዚ testing/synctest package ተጠቒምና ንሓደ ኔትወርክ ዘለዎ ፕሮግራም ንፈትኖ። ነዚ ኣብነት እዚ፡ እቲ net/http package ዘለዎ ኣተሓሕዛ ናይቲ 100 Continue ዝብል መልሲ ክንፍትኖ ኢና።


ሓደ ሕቶ ዝልእኽ ዓሚል ኤችቲቲፒ፡ እቲ ዓሚል ክሰዶ ተወሳኺ ዳታ ከም ዘለዎ ነቲ ኣገልጋሊ ንምንጋር “ተጸበዮ: 100-ይቕጽል” ዝብል ርእሲ ከጠቓልል ይኽእል። ብድሕሪኡ እቲ ኣገልጋሊ ንዝተረፈ ሕቶ ንምሕታት ብ100 Continue ሓበሬታዊ መልሲ ክምልስ ይኽእል፣ ወይ ድማ ብገለ ካልእ ኩነታት ነቲ ዓሚል እቲ ትሕዝቶ ከምዘየድሊ ክነግሮ ይኽእል። ንኣብነት ሓደ ዓቢ ፋይል ዝሰቕል ዓሚል ነዚ ባህሪ ተጠቒሙ እቲ ኣገልጋሊ ነቲ ፋይል ቅድሚ ምልኣኹ ክቕበሎ ፍቓደኛ ምዃኑ ከረጋግጽ ይኽእል።


ፈተናና “ተጸበዩ: 100-ቀጽል” ዝብል ርእሲ ክሰድድ ከሎ እቲ ዓሚል HTTP ቅድሚ እቲ ኣገልጋሊ ምሕታቱ ትሕዝቶ ናይ ሓደ ሕቶ ከምዘይሰድድ፣ ከምኡ’ውን 100 ቀጽል ዝብል መልሲ ምስ ረኸበ ነቲ ትሕዝቶ ከም ዝልእኾ ከረጋግጽ እዩ።


መብዛሕትኡ ግዜ ፈተነታት ናይ ሓደ ርክብ ዝገብር ዓሚልን ኣገልጋልን ሉፕባክ መርበብ ምትእስሳር ክጥቀም ይኽእል። ምስ testing/synctest ክንሰርሕ ከለና ግን መብዛሕትኡ ግዜ ኩሎም ጎሩቲናት ኣብቲ መርበብ ምስ ተዓጽዉ ንኽንፈልጥ ዘኽእለና ናይ ሓሶት መርበብ ምትእስሳር ክንጥቀም ክንደሊ ኢና። ነዚ ፈተና ብ net.Pipe ዝተፈጥረ ናይ ውሽጢ መዘክር መርበብ ምትእስሳር ዝጥቀም http.Transport (HTTP client) ብምፍጣር ክንጅምሮ ኢና።

 func Test(t *testing.T) { synctest.Run(func() { srvConn, cliConn := net.Pipe() defer srvConn.Close() defer cliConn.Close() tr := &http.Transport{ DialContext: func(ctx context.Context, network, address string) (net.Conn, error) { return cliConn, nil }, // Setting a non-zero timeout enables "Expect: 100-continue" handling. // Since the following test does not sleep, // we will never encounter this timeout, // even if the test takes a long time to run on a slow machine. ExpectContinueTimeout: 5 * time.Second, }


ኣብዚ መጓዓዝያ እዚ “ተጸበዮ: 100-ቀጽል” ዝብል ርእሲ ስብስብ ሒዝና ሕቶ ንሰድድ። እቲ ሕቶ ክሳብ መወዳእታ እቲ ፈተና ስለዘይውዳእ ብሓድሽ ጎሮቲን ይለኣኽ።

 body := "request body" go func() { req, _ := http.NewRequest("PUT", "http://test.tld/", strings.NewReader(body)) req.Header.Set("Expect", "100-continue") resp, err := tr.RoundTrip(req) if err != nil { t.Errorf("RoundTrip: unexpected error %v", err) } else { resp.Body.Close() } }()


እቲ ዓሚል ዝለኣኾ ርእሲ ሕቶታት ነንብብ።

 req, err := http.ReadRequest(bufio.NewReader(srvConn)) if err != nil { t.Fatalf("ReadRequest: %v", err) }


ሕጂ ናብ ልቢ ፈተና ንመጽእ ኣለና። ዓሚል ገና ነቲ ናይ ሕቶ ኣካል ከምዘይሰዶ ከነረጋግጽ ንደሊ።


ነቲ ናብ ሰርቨር ዝተላእከ ኣካል ናብ strings.Builder ብምቕዳሕ ሓድሽ goroutine ንጅምር፣ ኩሎም ኣብቲ bubble ዘለዉ goroutines ክሳብ ዝዓግቱ ንጽበ፣ ካብቲ ኣካል ገና ዝኾነ ነገር ከምዘየንበብና ነረጋግጽ።


synctest.Wait call እንተረሲዕናዮ፡ እቲ race detector ብትኽክል ብዛዕባ data race ከማርር እዩ፡ ምስቲ Wait ግን እዚ ውሑስ እዩ።

 var gotBody strings.Builder go io.Copy(&gotBody, req.Body) synctest.Wait() if got := gotBody.String(); got != "" { t.Fatalf("before sending 100 Continue, unexpectedly read body: %q", got) }


ንዓሚል “100 Continue” ዝብል መልሲ ንጽሕፍ እሞ ሕጂ ነቲ ናይ ሕቶ ኣካል ከም ዝልእኾ ነረጋግጽ።

 srvConn.Write([]byte("HTTP/1.1 100 Continue\r\n\r\n")) synctest.Wait() if got := gotBody.String(); got != body { t.Fatalf("after sending 100 Continue, read body %q, want %q", got, body) }

ኣብ መወዳእታ ድማ ነቲ ሕቶ ንምዝዛም “200 OK” ዝብል መልሲ ብምልኣኽ ንውድኦ።


ኣብዚ ፈተና ሓያሎ ጎሩቲናት ጀሚርና ኣለና። እቲ synctest.Run ዝብል ጻውዒት ቅድሚ ምምላሱ ኩሎም ክወጹ ክጽበ እዩ።

 srvConn.Write([]byte("HTTP/1.1 200 OK\r\n\r\n")) }) }

እዚ ፈተና እዚ ንኻልኦት ባህርያት ንምፍታን ብቐሊሉ ክዝርጋሕ ይኽእል እዩ፣ ከም እቲ ኣገልጋሊ እንተዘይሓቲቱ እቲ ናይ ሕቶ ኣካል ከምዘይለኣኽ ምርግጋጽ፣ ወይ ድማ እቲ ኣገልጋሊ ኣብ ውሽጢ ግዜ ምቁራጽ መልሲ እንተዘይሂቡ ከምዝለኣኽ ምርግጋጽ።

ኩነታት ናይቲ ፈተነ

ኣብ Go 1.24 testing/synctest ከም ፈተነ ፓኬጅ ነተኣታቱ ኣለና። ከከም ግብረ መልስን ተመኩሮን ምስ ምምሕያሻት ይኹን ብዘይ ምምሕያሽ ክንዝርግሖ ንኽእል ኢና፣ ነቲ ፈተነ ክንቅጽሎ ንኽእል ኢና፣ ወይ ድማ ኣብ መጻኢ ስሪት ናይ Go ከነወግዶ ንኽእል ኢና።


እቲ ፓኬጅ ብነባሪ ኣይርአን እዩ። ንዕኡ ንምጥቃም፡ ኮድካ ምስ GOEXPERIMENT=synctest ኣብ ከባቢኻ ተሰሪዑ ኣጠቓልል።


ርእይቶኹም ክንሰምዕ ንደሊ! testing/synctest እንተፈቲንኩም፡ በጃኹም ተመኩሮታትኩም፡ ኣወንታዊ ይኹን ኣሉታዊ፡ ኣብ go.dev/issue/67434 ጸብጻብ ኣቕርቡ።


ስእሊ ፡ ዳሚን ኒል


ስእሊ ብጋብሪኤል ጉስማኦ ኣብ ኣንስፕላሽ


እዚ ጽሑፍ ኣብ... ዘ ጎ ብሎግ ብመሰረት ፍቓድ CC BY 4.0 DEED።


Trending Topics

blockchaincryptocurrencyhackernoon-top-storyprogrammingsoftware-developmenttechnologystartuphackernoon-booksBitcoinbooks