为了账号安全,请及时绑定邮箱和手机立即绑定

如何测试永远循环的代码

如何测试永远循环的代码

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 关注
  • 137 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信