Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 如何测试永远循环的代码_Unit Testing_Go - Fatal编程技术网

Unit testing 如何测试永远循环的代码

Unit testing 如何测试永远循环的代码,unit-testing,go,Unit Testing,Go,我有一个应用程序()一旦启动就会永远运行,但我想在它阻塞/等待ctrl+c被按下或被终止之前测试一些值 下面是一个小例子: 主程序包 进口( “fmt” “操作系统” “操作系统/信号” ) 类型IAddString接口{ AddString(字符串) } 类型addString结构{} func(self*addString)addString(s string){ fmt.Println(s) } func块(IAddString,s字符串){ //测试这个 a、 添加字符串(s) //在测

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

下面是一个小例子:

主程序包
进口(
“fmt”
“操作系统”
“操作系统/信号”
)
类型IAddString接口{
AddString(字符串)
}
类型addString结构{}
func(self*addString)addString(s string){
fmt.Println(s)
}
func块(IAddString,s字符串){
//测试这个
a、 添加字符串(s)
//在测试时忽略这一点
块:=制造(转换操作信号)
信号通知(阻塞、操作系统中断、操作系统终止)
为了{

signalType:=是的,这是可能的。将循环中的代码放在单独的函数中,并在没有循环的情况下对该函数进行单元测试。

在代码中引入测试代理

将循环提取到一个函数中,该函数采用两个函数作为参数:onBeginEvent和onEndEvent。函数签名应采用:

  • 说明您要在测试用例内部检查
  • 可选:循环编号的计数器(这样您就可以识别每个循环)。它是可选的,因为实际的委托实现可以计算自己调用它的次数
在循环开始时调用OnBegingEvent(计数器,currentState);然后代码执行正常工作,最后调用OnEndEvent(计数器,currentState);可能代码已经更改了currentState

在生产环境中,您可以使用函数委托的空实现,或者在循环中实现nil check

您可以使用此模型对您的处理算法进行任意多的检查。假设您有5个检查。现在回顾一下,您会发现这太难了。您创建了一个定义回调函数的接口。这些回调函数是更改服务行为的强大方法。您可以后退一步更多时间,并认识到接口实际上是您的“服务策略”;)

一旦你选择了这条路线,你会想以某种方式停止你的无限循环。如果你想在测试用例中进行严格控制,你可以选择第三个函数委托,如果是退出循环的时候,它会返回true。共享变量是控制退出条件的一个选项


这当然是比单元测试更高级别的测试,在复杂的服务中是必要的。

是的,这是可能的。将循环中的代码放在单独的函数中,并在没有循环的情况下对该函数进行单元测试。我同意@GolezTrol.Golez,您应该将其放在答案部分,以便我可以对其进行投票;-)循环的代码永远?我想知道一个好的场景,当有一个无限循环是好的。这对性能真的不好。不是吗?永远循环与性能没有任何关系。例如,通常当你监听tcp连接时,你会在调用“接受”时无限循环,直到有人连接到你的套接字时才会被阻止。它不会忙于旋转并吃掉你的更新。有些东西是无法进行单元测试的。你必须接受它。所有类型的IO、主功能以及这个无休止的循环都是不稳定的,或者至少在使用单元测试时是不稳定的,除非你有一些退出条件可以从测试中触发。但仍然值得付出努力吗?代码覆盖率在一定程度上是有用的,但100%覆盖率并不意味着您已经测试了所有场景。首先关注测试核心功能的测试的质量。