猿问

如何测试永远循环的代码

我有一个应用程序(epazote),一旦启动就会永远运行,但我想在它阻塞/等待直到ctrl+c被按下或被杀死之前测试一些值。


这是一个小例子:http : //play.golang.org/p/t0spQRJB36


package main


import (

    "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但不知道如何覆盖导入的包,以防万一。


江户川乱折腾
浏览 138回答 2
2回答

扬帆大鱼

将测试委托引入您的代码。将您的循环提取到一个函数中,该函数接受 2 个函数作为参数:onBeginEvent 和 onEndEvent。函数签名应采用:声明您要在测试用例中检查可选:循环编号的计数器(因此您可以识别每个循环)。它是可选的,因为实际的委托实现可以计算它被自身调用的次数。在循环开始时,您调用 OnBegingEvent(counter, currentState);&nbsp;比您的代码完成其正常工作,最后您调用 OnEndEvent(counter, currentState);&nbsp;大概你的代码已经改变了 currentState。在生产中,您可以使用函数委托的空实现或在循环中实现 nil 检查。您可以使用此模型根据需要对处理算法进行尽可能多的检查。假设您有 5 张支票。现在你回过头来看它并意识到这变得太难了。您创建一个接口来定义您的回调函数。这些回调函数是改变服务行为的强大方法。你再退一步,意识到接口实际上是你的“服务策略”;)一旦你走那条路,你就会想以某种方式停止你的无限循环。如果您想在测试用例中进行严格控制,您可以采用第三个函数委托,如果需要退出循环,该委托将返回 true。共享变量是控制退出条件的选项。这当然是比单元测试更高级别的测试,并且在复杂的服务中是必要的。

GCT1015

是的,这是可能的。将循环内的代码放在一个单独的函数中,并在没有循环的情况下对该函数进行单元测试。
随时随地看视频慕课网APP

相关分类

Go
我要回答