亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何測試永遠循環的代碼

如何測試永遠循環的代碼

Go
江戶川亂折騰 2021-12-07 16:02:30
我有一個應用程序(epazote),一旦啟動就會永遠運行,但我想在它阻塞/等待直到ctrl+c被按下或被殺死之前測試一些值。這是一個小例子:http : //play.golang.org/p/t0spQRJB36package mainimport (    "fmt"    "os"    "os/signal")type IAddString interface {    AddString(string)}type addString struct{}func (self *addString) AddString(s string) {    fmt.Println(s)}func block(a IAddString, s string) {    // test this    a.AddString(s)    // ignore this while testing    block := make(chan os.Signal)    signal.Notify(block, os.Interrupt, os.Kill)    for {        signalType := <-block        switch signalType {        default:            signal.Stop(block)            fmt.Printf("%q signal received.", signalType)            os.Exit(0)        }    }}func main() {    a := &addString{}    block(a, "foo")}我想知道在測試時是否可以忽略代碼的某些部分,或者如何測試這種情況,我已經實現了一個接口,在這種情況下用于測試AddString 幫助我測試某些部分但不知道如何避免“阻塞”并進行測試。有任何想法嗎?更新:將代碼放入Addstring另一個函數的循環中有效但僅用于測試該函數,但是如果我想進行完整的代碼覆蓋,我仍然需要檢查/測試阻塞部分,例如如何測試它的行為是否正常當收到ctrl+c或 a 時kill -HUP,我在想可能會創建一個假的,signal.Notify但不知道如何覆蓋導入的包,以防萬一。
查看完整描述

2 回答

?
揚帆大魚

TA貢獻1799條經驗 獲得超9個贊

將測試委托引入您的代碼。

將您的循環提取到一個函數中,該函數接受 2 個函數作為參數:onBeginEvent 和 onEndEvent。函數簽名應采用:

  • 聲明您要在測試用例中檢查

  • 可選:循環編號的計數器(因此您可以識別每個循環)。它是可選的,因為實際的委托實現可以計算它被自身調用的次數。

在循環開始時,您調用 OnBegingEvent(counter, currentState); 比您的代碼完成其正常工作,最后您調用 OnEndEvent(counter, currentState); 大概你的代碼已經改變了 currentState。

在生產中,您可以使用函數委托的空實現或在循環中實現 nil 檢查。

您可以使用此模型根據需要對處理算法進行盡可能多的檢查。假設您有 5 張支票。現在你回過頭來看它并意識到這變得太難了。您創建一個接口來定義您的回調函數。這些回調函數是改變服務行為的強大方法。你再退一步,意識到接口實際上是你的“服務策略”;)

一旦你走那條路,你就會想以某種方式停止你的無限循環。如果您想在測試用例中進行嚴格控制,您可以采用第三個函數委托,如果需要退出循環,該委托將返回 true。共享變量是控制退出條件的選項。

這當然是比單元測試更高級別的測試,并且在復雜的服務中是必要的。


查看完整回答
反對 回復 2021-12-07
?
GCT1015

TA貢獻1827條經驗 獲得超4個贊

是的,這是可能的。將循環內的代碼放在一個單獨的函數中,并在沒有循環的情況下對該函數進行單元測試。


查看完整回答
反對 回復 2021-12-07
  • 2 回答
  • 0 關注
  • 175 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號