"Unable to start NATS Server in Go Routine" 正在测试
"Unable to start NATS Server in Go Routine" while testing
我正在尝试分开测试以使用不同的 NATS 服务器。 (我还不确定是不是NATS,但是我的测试是相互影响的。)
在 运行 进行单个测试或测试单个包时,这样做效果很好。 运行 go test ./...
在我所有的包裹上(如 CI 中所做的那样)我收到此错误(匿名路径):
panic: Unable to start NATS Server in Go Routine
goroutine 1 [running]:
github.com/nats-io/gnatsd/test.RunServer(0xc000163400, 0xc000163400)
./go/pkg/mod/github.com/nats-io/gnatsd@v1.4.1/test/test.go:66 +0xbd
./lib/msgQueue/nats.NewTestConn(0xc0002adf68, 0x1879e12)
./lib/msgQueue/nats/testconn.go:19 +0x80
似乎 Go 启动了 goroutines 以在其中进行 运行 测试。在测试中使用 TestMain
和 init
都没有解决问题。
是否可以在每次测试时启动服务器而不 运行 进入 goroutine
错误?或者是否有一些轻量级但可在内存中运行的替代品?
这里是一些代码:
// +build !build
package myNats
import (
"fmt"
"github.com/pkg/errors"
"github.com/nats-io/gnatsd/server"
"github.com/nats-io/gnatsd/test"
gonats "github.com/nats-io/go-nats"
)
type Conn struct {
db *gonats.Conn
}
func NewTestConn() (conn *Conn, shutdown func()) {
opts := server.Options{
Host: "localhost",
Port: 53347,
NoLog: true,
NoSigs: true,
}
gnatsd := test.RunServer(&opts)
if gnatsd == nil {
panic("could not start NATS test server")
}
url := fmt.Sprintf("nats://%s:%d", opts.Host, opts.Port)
conn, err := open(url)
if err != nil {
panic(errors.Wrap(err, "could not connect to test NATS"))
}
return conn, func() {
conn.close()
gnatsd.Shutdown()
}
}
func open(addr string) (*Conn, error) {
// Connect to NATS
nc, err := gonats.Connect(addr)
if err != nil {
return nil, errors.Wrapf(err, "nats not reachable on %s", addr)
}
if !nc.IsConnected() {
errorMsg := fmt.Errorf("could not establish connection to nats-server at: %s", addr)
return nil, errorMsg
}
return &Conn{
db: nc,
}, nil
}
我的目标是每次测试都有一台服务器:
func TestSomeThing(t *testing.T) {
conn, shutdown := myNats.NewTestConn()
defer shutdown()
_ = conn
// test code here
}
它可能已经为每个测试启动了一个服务器。没有 goroutine,你不能同时 运行 事情。该错误实际上没有任何意义 - Go 中的任何内容都必须能够 运行 在 goroutine 中,事实上所有 does 运行 在 goroutine 中(甚至 main
),所以不清楚他们在这里真正想说什么(我绝对建议打开一个关于它的错误报告,因为该错误消息是 可怕的 )。同时,您可以将 go test
从 运行 与 -parallel 1
同时保留(如 go help testflag
中所示),这可能会有所帮助。
我怀疑错误信息:
Unable to start NATS Server in Go Routine
具有误导性。关于 Go Routine 的部分可能只是它如何尝试启动 NATS 服务器的实现细节。我怀疑服务器无法启动,因为您在选项中硬编码了您的端口,并且因为多个测试包可能是 运行 并行。只有一个测试包能够绑定到端口以启动 NATS 服务器,其他所有测试包都将失败。
-parallel n
Allow parallel execution of test functions that call t.Parallel.
The value of this flag is the maximum number of tests to run
simultaneously; by default, it is set to the value of GOMAXPROCS.
Note that -parallel only applies within a single test binary.
The 'go test' command may run tests for different packages
in parallel as well, according to the setting of the -p flag
(see 'go help build').
除非您在给定的测试套件中进行了并行测试(我假设您没有),否则问题可能是不同的包 运行 并行进行。顺着上面最后的线索,我们来看一下build flags:
-p n
the number of programs, such as build commands or
test binaries, that can be run in parallel.
The default is the number of CPUs available.
这是来自 "Compile packages and dependencies" docs。请注意,您可以将构建标志 和 测试标志传递给 go test
:
$ go test -h
usage: go test [build/test flags] [packages] [build/test flags & test binary flags]
Run 'go help test' for details.
所以考虑运行宁go test -p 1 ./...
。或者,将选项传递给 RunServer
函数,允许多个选项安全地并行发生。
在我的例子中,问题是我已经 运行 一个 nats-server 的实例,所以测试失败了。通过停止服务器,测试成功通过。
我正在尝试分开测试以使用不同的 NATS 服务器。 (我还不确定是不是NATS,但是我的测试是相互影响的。)
在 运行 进行单个测试或测试单个包时,这样做效果很好。 运行 go test ./...
在我所有的包裹上(如 CI 中所做的那样)我收到此错误(匿名路径):
panic: Unable to start NATS Server in Go Routine
goroutine 1 [running]:
github.com/nats-io/gnatsd/test.RunServer(0xc000163400, 0xc000163400)
./go/pkg/mod/github.com/nats-io/gnatsd@v1.4.1/test/test.go:66 +0xbd
./lib/msgQueue/nats.NewTestConn(0xc0002adf68, 0x1879e12)
./lib/msgQueue/nats/testconn.go:19 +0x80
似乎 Go 启动了 goroutines 以在其中进行 运行 测试。在测试中使用 TestMain
和 init
都没有解决问题。
是否可以在每次测试时启动服务器而不 运行 进入 goroutine
错误?或者是否有一些轻量级但可在内存中运行的替代品?
这里是一些代码:
// +build !build
package myNats
import (
"fmt"
"github.com/pkg/errors"
"github.com/nats-io/gnatsd/server"
"github.com/nats-io/gnatsd/test"
gonats "github.com/nats-io/go-nats"
)
type Conn struct {
db *gonats.Conn
}
func NewTestConn() (conn *Conn, shutdown func()) {
opts := server.Options{
Host: "localhost",
Port: 53347,
NoLog: true,
NoSigs: true,
}
gnatsd := test.RunServer(&opts)
if gnatsd == nil {
panic("could not start NATS test server")
}
url := fmt.Sprintf("nats://%s:%d", opts.Host, opts.Port)
conn, err := open(url)
if err != nil {
panic(errors.Wrap(err, "could not connect to test NATS"))
}
return conn, func() {
conn.close()
gnatsd.Shutdown()
}
}
func open(addr string) (*Conn, error) {
// Connect to NATS
nc, err := gonats.Connect(addr)
if err != nil {
return nil, errors.Wrapf(err, "nats not reachable on %s", addr)
}
if !nc.IsConnected() {
errorMsg := fmt.Errorf("could not establish connection to nats-server at: %s", addr)
return nil, errorMsg
}
return &Conn{
db: nc,
}, nil
}
我的目标是每次测试都有一台服务器:
func TestSomeThing(t *testing.T) {
conn, shutdown := myNats.NewTestConn()
defer shutdown()
_ = conn
// test code here
}
它可能已经为每个测试启动了一个服务器。没有 goroutine,你不能同时 运行 事情。该错误实际上没有任何意义 - Go 中的任何内容都必须能够 运行 在 goroutine 中,事实上所有 does 运行 在 goroutine 中(甚至 main
),所以不清楚他们在这里真正想说什么(我绝对建议打开一个关于它的错误报告,因为该错误消息是 可怕的 )。同时,您可以将 go test
从 运行 与 -parallel 1
同时保留(如 go help testflag
中所示),这可能会有所帮助。
我怀疑错误信息:
Unable to start NATS Server in Go Routine
具有误导性。关于 Go Routine 的部分可能只是它如何尝试启动 NATS 服务器的实现细节。我怀疑服务器无法启动,因为您在选项中硬编码了您的端口,并且因为多个测试包可能是 运行 并行。只有一个测试包能够绑定到端口以启动 NATS 服务器,其他所有测试包都将失败。
-parallel n
Allow parallel execution of test functions that call t.Parallel.
The value of this flag is the maximum number of tests to run
simultaneously; by default, it is set to the value of GOMAXPROCS.
Note that -parallel only applies within a single test binary.
The 'go test' command may run tests for different packages
in parallel as well, according to the setting of the -p flag
(see 'go help build').
除非您在给定的测试套件中进行了并行测试(我假设您没有),否则问题可能是不同的包 运行 并行进行。顺着上面最后的线索,我们来看一下build flags:
-p n
the number of programs, such as build commands or
test binaries, that can be run in parallel.
The default is the number of CPUs available.
这是来自 "Compile packages and dependencies" docs。请注意,您可以将构建标志 和 测试标志传递给 go test
:
$ go test -h
usage: go test [build/test flags] [packages] [build/test flags & test binary flags]
Run 'go help test' for details.
所以考虑运行宁go test -p 1 ./...
。或者,将选项传递给 RunServer
函数,允许多个选项安全地并行发生。
在我的例子中,问题是我已经 运行 一个 nats-server 的实例,所以测试失败了。通过停止服务器,测试成功通过。