Testing 如何在goroutine中测试结果而不等待测试

Testing 如何在goroutine中测试结果而不等待测试,testing,go,goroutine,Testing,Go,Goroutine,当我离开golang时,我有时需要在goroutine中测试结果,我在利用时间。睡眠来测试,我想知道有没有更好的方法来测试 假设我有这样一个示例代码 func Hello() { go func() { // do something and store the result for example in db }() // do something } 然后当我测试func时,我想在goroutine中测试这两个结果, 我正在这样做: func Te

当我离开golang时,我有时需要在goroutine中测试结果,我在利用时间。睡眠来测试,我想知道有没有更好的方法来测试

假设我有这样一个示例代码

func Hello() {
    go func() {
        // do something and store the result for example in db
    }()
    // do something
}
然后当我测试func时,我想在goroutine中测试这两个结果, 我正在这样做:

 func TestHello(t *testing.T) {
        Hello()
        time.Sleep(time.Second) // sleep for a while so that goroutine can finish
        // test the result of goroutine
 }
有没有更好的方法来测试这一点


基本上,在真实的逻辑中,我不在乎goroutine中的结果,我不需要等待它完成。但是在测试中,我想在它完成后进行检查。

如果您真的想检查goroutine的结果,您应该使用如下通道:

package main

import (
    "fmt"
)

func main() {
    // in test
    c := Hello()
    if <-c != "done" {
        fmt.Println("assert error")
    }

    // not want to check result
    Hello()
}

func Hello() <-chan string {
    c := make(chan string)
    go func() {
        fmt.Println("do something")
        c <- "done"
    }()
    return c
}
主程序包
进口(
“fmt”
)
func main(){
//试验中
c:=你好()
如果大多数“如何测试X?”的问题往往归结为X太大

在您的情况下,最简单的解决方案是在测试中不使用goroutines。单独测试每个函数。将代码更改为:

func Hello() {
    go updateDatabase()
    doSomething()
}

func updateDatabase() {
    // do something and store the result for example in db
}

func doSomething() {
    // do something
}

然后分别为
updateDatabase
doSomething

编写测试。我听说过使用上下文,但找不到与我的用例类似的确切示例。我不太明白你想做什么。为什么要在goroutine中设置
b
?如果你不想使用睡眠,请使用waitgroup。对不起,我觉得我的例子很混乱,我改变了我的例子有时候你需要测试带有func的goroutine是否已经被预期的参数集调用了。那么应该如何测试这种情况呢?@OlehHolovko:这和你检查goroutine中是否有func被正确调用的方法差不多。可能是用一些dependenc类似的问题在这里已经被问过很多次了。我建议搜索一下,如果你找不到答案,可能需要另外问一个问题。