Golang中如何在不使用ginkgo cli的情况下运行预编译测试包
Golang中如何在不使用ginkgo cli的情况下运行预编译测试包 我有一个Docker镜像:
FROM golang:1.14-alpine
ENV HOME /go
WORKDIR ${HOME}
COPY . ${HOME}/
RUN apk add --no-cache make bash g++ git && \
make dependencies && \
make install && \
ginkgo build tests
ENTRYPOINT ["tests.test"]
这里的 tests.test 是预编译的Go测试。
我不想使用ginkgo,因为它会启动两个进程:
PPID - 父进程 - ginkgo tests.test PID - /go/src/tests.test
当Pod终止时,ginkgo无法正确地终止容器。 我已在测试代码中使用了Go信号,它会处理信号并向容器返回正确的退出码。 因此,我想直接使用独立的预编译测试,而不是通过ginkgo。
有人能帮我吗?如何向独立的预编译测试传递并行运行选项、聚焦选项和其他选项?
更多关于Golang中如何在不使用ginkgo cli的情况下运行预编译测试包的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于Golang中如何在不使用ginkgo cli的情况下运行预编译测试包的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Golang中直接运行预编译的测试二进制文件是可行的,ginkgo构建的测试包本质上是一个标准的Go测试二进制文件。以下是几种处理方式:
1. 直接运行测试二进制文件
// Dockerfile修改
FROM golang:1.14-alpine
ENV HOME /go
WORKDIR ${HOME}
COPY . ${HOME}/
RUN apk add --no-cache make bash g++ git && \
make dependencies && \
make install && \
go test -c -o tests.test ./tests
ENTRYPOINT ["/go/tests.test"]
2. 传递命令行参数
测试二进制文件支持标准go test参数:
# 并行运行测试
./tests.test -test.parallel 4
# 运行特定测试
./tests.test -test.run "TestMyFunction"
# 显示详细输出
./tests.test -test.v
# 设置超时
./tests.test -test.timeout 30m
# 运行基准测试
./tests.test -test.bench "."
# 设置CPU数量
./tests.test -test.cpu 4
3. 处理ginkgo特定功能
如果需要ginkgo的聚焦功能,可以在测试代码中实现自定义参数解析:
// tests/main_test.go
package main
import (
"flag"
"os"
"testing"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
var (
focusFlag string
skipFlag string
parallelFlag int
)
func init() {
flag.StringVar(&focusFlag, "ginkgo.focus", "", "Focus on specs matching this regular expression")
flag.StringVar(&skipFlag, "ginkgo.skip", "", "Skip specs matching this regular expression")
flag.IntVar(¶llelFlag, "ginkgo.parallel", 1, "Number of parallel nodes")
flag.Parse()
}
func TestMain(m *testing.M) {
// 设置ginkgo配置
if focusFlag != "" {
Focus(focusFlag)
}
if skipFlag != "" {
Skip(skipFlag)
}
// 运行测试
os.Exit(m.Run())
}
func TestSuite(t *testing.T) {
RegisterFailHandler(Fail)
RunSpecs(t, "Test Suite")
}
4. 完整的Docker运行示例
# Dockerfile
FROM golang:1.14-alpine
ENV HOME /go
WORKDIR ${HOME}
COPY . ${HOME}/
RUN apk add --no-cache make bash g++ git && \
make dependencies && \
make install && \
go test -c -o /usr/local/bin/tests.test ./tests
ENTRYPOINT ["tests.test"]
CMD ["-test.v", "-test.parallel", "4"]
# Kubernetes部署示例
apiVersion: v1
kind: Pod
metadata:
name: test-runner
spec:
containers:
- name: tester
image: your-test-image:latest
command: ["tests.test"]
args: ["-test.v", "-test.timeout", "30m", "-test.parallel", "4"]
5. 信号处理示例
确保测试二进制文件正确处理信号:
// tests/signal_handler.go
package main
import (
"context"
"os"
"os/signal"
"syscall"
"testing"
)
func setupSignalHandler(ctx context.Context, t *testing.T) context.Context {
ctx, cancel := context.WithCancel(ctx)
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, syscall.SIGTERM, syscall.SIGINT)
go func() {
sig := <-sigChan
t.Logf("Received signal: %v", sig)
cancel()
}()
return ctx
}
这样可以直接运行预编译的测试二进制文件,同时支持并行运行、聚焦测试等功能,并且能够正确处理容器终止信号。

