测试我的代码不等待的Goroutine

时间:2015-01-22 15:07:41

标签: unit-testing testing concurrency go goroutine

我有一个同时执行的功能。它的任务是运行命​​令行方法,如果有错误则记录错误。我的主要执行线程不等待此方法完成。它只是乐观地回报。

我如何测试我的功能?假设我给它cmdStr,例如{"sleep", "1"},它可以正常工作但是没有立即返回,我怎样才能让我的测试等待这个功能完成?

我想确保运行此操作的实际程序而不是必须等待它完成。

func runCmd(cmdStr []string, errChan chan error) {
  cmd := exec.Command(cmdStr...)
  var out bytes.Buffer
  cmd.Stdout = &out
  err := cmd.Start()
  if err != nil {
    errChan <- err
    return
  }
  // Command started successfully, so our caller can continue.
  errChan <- nil
  err = cmd.Wait()
  if err != nil {
    log.Println(err)
  }
}

2 个答案:

答案 0 :(得分:1)

使用等待组

wg := sync.WaitGroup{}
errc := make(chan error)
wg.Add(1)
go func() {
    runCmd([]string{"sleep", 1}, errc)
    wg.Done()
}()
err <- errc
if err != nil {
    // handle error
}
wg.Wait()

答案 1 :(得分:0)

了解所有goroutings的最简单方法是添加select{}作为最后main.main()语句。但main()永远不会以这种方式返回,你应该明确地杀死进程。 等待其他人也更温和runtime.Goshed(),但它无法提供如此强有力的保证。 而规范的方式将是

wg := sync.WaitGroup
...
wg.Add(1)
go runCmd(...)
...
wg.Wait()