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

测试 Golang Goroutine

测试 Golang Goroutine

Go
www说 2021-09-20 10:46:41
我一直在四处寻找,但到目前为止,只有Ariejan de Vroom在这里写过类似的文章。我想知道我是否可以将 goroutine 引入单元测试,以便它可以精确计算正在运行的 goroutine 的并发数量,并可以告诉我它们是否按照我所说的数量正确生成了 goroutine。例如,我有以下代码..import (    "testing"    "github.com/stretchr/testify/assert")func createList(job int, done chan bool) {    time.Sleep(500)    // do something    time.Sleep(500)    done <- true    return}func TestNewList(t *testing.T) {  list := NewList()  if assert.NotNil(t, list) {    const numGoRoutines = 16    jobs := make(chan int, numGoRoutines)    done := make(chan bool, 1)    for j := 1; j <= numGoRoutines; j++ {        jobs <- j        go createList(j, done)        fmt.Println("sent job", j)    }    close(jobs)    fmt.Println("sent all jobs")    <-done}
查看完整描述

2 回答

?
慕村9548890

TA贡献1884条经验 获得超4个赞

据我了解,您愿意限制同时运行的例程数量并验证它是否正常工作。我建议编写一个函数,它将一个例程作为参数并使用模拟例程来测试它。

在下面的示例中,spawn函数运行fn例程count次数,但不超过limit例程并发。我将它包装到 main 函数中以在操场上运行它,但您可以对您的测试方法使用相同的方法。


package main


import (

    "fmt"

    "sync"

    "time"

)


func spawn(fn func(), count int, limit int) {

    limiter := make(chan bool, limit)


    spawned := func() {

        defer func() { <-limiter }()

        fn()

    }


    for i := 0; i < count; i++ {

        limiter <- true

        go spawned()

    }

}


func main() {


    count := 10

    limit := 3


    var wg sync.WaitGroup

    wg.Add(count)


    concurrentCount := 0

    failed := false


    var mock = func() {

        defer func() {

            wg.Done()

            concurrentCount--

        }()


        concurrentCount++

        if concurrentCount > limit {

            failed = true // test could be failed here without waiting all routines finish

        }


        time.Sleep(100)

    }


    spawn(mock, count, limit)


    wg.Wait()


    if failed {

        fmt.Println("Test failed")

    } else {

        fmt.Println("Test passed")

    }

}


查看完整回答
反对 回复 2021-09-20
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

一种可能的方法是使用runtime.Stack()或分析 的输出,runtime.debug.PrintStack()以便在给定时间查看所有 goroutine。



查看完整回答
反对 回复 2021-09-20
  • 2 回答
  • 0 关注
  • 232 浏览
慕课专栏
更多

添加回答

举报

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