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

Goconvey 在 Jenkins 上使用 goroutine 引起恐慌

Goconvey 在 Jenkins 上使用 goroutine 引起恐慌

Go
天涯尽头无女友 2021-08-30 15:08:34
我有一组使用 GoConvey 和 Go 1.3.1 的测试,在本地工作得很好。但是,当我使用 Jenkins 触发构建时,也使用 Go 1.3.1,我从 Goconvey 那里得到了与我在测试中使用的 go 例程相关的恐慌。测试可以在这里看到:func TestListApplication(t *testing.T) {    s := &Session{}    s.Username = "foo"    s.Password = "bar"    ts := serveHTTP(t)    defer ts.Close()    s.Baseurl = ts.URL    s.initialize()    go func() {        <-s.Comms.AppCount    }()    Convey("TestListApplication", t, func() {        s.Comms.MainWaitGroup.Add(1)        application := &Application{}        err := json.Unmarshal(applicationJSON(), application)        So(err, ShouldBeNil)        revisions := &Revisions{}        err = json.Unmarshal(revisionsJSON(), revisions)        So(err, ShouldBeNil)        var wg sync.WaitGroup        wg.Add(1)        go func() {            defer wg.Done()            line := <-s.Comms.Msg            So(line, ShouldEqual, "3        admin       foo\n")        }()        s.listApplication(application, revisions)        wg.Wait()    })}
查看完整描述

2 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

因为您正在尝试从另一个 goroutine 执行断言,所以您需要C在func()签名中使用最近添加的上下文结构 ( ) ,然后调用So该上下文。这是您的版本,稍作修改:


Convey("TestListApplication", t, func(c C) {

    s.Comms.MainWaitGroup.Add(1)


    application := &Application{}

    err := json.Unmarshal(applicationJSON(), application)

    So(err, ShouldBeNil)


    revisions := &Revisions{}

    err = json.Unmarshal(revisionsJSON(), revisions)

    So(err, ShouldBeNil)


    var wg sync.WaitGroup

    wg.Add(1)

    go func() {

        defer wg.Done()

        line := <-s.Comms.Msg

        c.So(line, ShouldEqual, "3        admin       foo\n")

    }()

    s.listApplication(application, revisions)

    wg.Wait()

})

这是 pull request #264的结果。


查看完整回答
反对 回复 2021-08-30
?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

此异常由 启动context.go#mustGetCurrentContext()。

你可以看到一个测试触发了相同的异常story_conventions_test.go#TestFailureModeNoContext


Convey("Foo", t, func() {

    done := make(chan int, 1)

    go func() {

        defer func() { done <- 1 }()

        defer expectPanic(t, noStackContext)

        So(len("I have no context"), ShouldBeGreaterThan, 0)

    }()

    <-done

})

从测试示例来看,如果从 Convey 测试中调用 goroutine 中的 goroutine 似乎会触发无上下文恐慌。


由于 Jenkins 从 goroutine 启动测试,这可能解释了为什么您的 GoConvey 测试失败(即使它在您go test直接调用时在 Jenkins 之外运行)


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

添加回答

举报

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