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(&parallelFlag, "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
}

这样可以直接运行预编译的测试二进制文件,同时支持并行运行、聚焦测试等功能,并且能够正确处理容器终止信号。

回到顶部