ðgolang§的毫不费力地集成测试与测试范围
#测试 #go #testcontainers #integrationtesting

测试是软件开发的重要组成部分,可确保您的应用程序按照现实情况下的预期运行。但是,编写有效的集成和功能测试可能具有挑战性,尤其是在处理数据库,消息经纪人和外部服务时。在本文中,我们将探讨如何利用测试范围的力量简化Golang的测试。无论您是初学者还是经验丰富的开发人员,您都将获得宝贵的见解,以使用TestContainers编写强大的集成和功能测试。

ð设置您的开发环境

在我们研究代码示例之前,让我们确保您的开发环境已准备就绪。我们将介绍Windows和MacOS上的Golang。

在Windows上安装Golang

  1. official Golang website下载Windows安装程序。
  2. 运行安装程序并按照屏幕上的说明。
  3. 打开命令提示符并运行go version以验证安装。

在MacOS上安装Golang

有2个选项可以在MacOS上安装Golang

遵循正式文档:

  1. official Golang website下载MacOS安装程序。
  2. 打开下载的软件包并按照安装说明。
  3. 开放终端并运行go version以验证安装。

或使用自制

brew install go

ð�安装TestContainers Go包

现在,让我们安装TestContainers Go软件包。打开终端/命令提示符并运行:

go get github.com/testcontainers/testcontainers-go

ð设置项目

让我们假设我们正在处理与PostgreSQL数据库和KAFKA消息代理交互的Golang应用程序。我们想为这些组件编写集成和功能测试。

项目结构

这是一个典型的项目结构:

myapp/
|-- main.go
|-- database/
|   |-- database.go
|   |-- database_test.go
|-- messaging/
|   |-- kafka.go
|   |-- kafka_test.go
|-- test/
|   |-- integration_test.go

在此结构中:

  • main.go包含您的应用程序代码。
  • database/database.go处理数据库交互。
  • database/database_test.go处理数据库单元测试(本文我们不感兴趣)。
  • messaging/kafka.go管理Kafka通信,创建Kafka消费者和/或生产者。
  • messaging/kafka_test.go处理KAFKA单元测试(本文我们不感兴趣)。
  • test/是我们编写集成测试的地方。

ð编写测试

让我们为PostgreSQL数据库创建一个集成测试。在integration_test.go中,添加以下代码:

package test

import (
    "context"
    "database/sql"
    "testing"

    "github.com/testcontainers/testcontainers-go"
    "github.com/testcontainers/testcontainers-go/wait"
    _ "github.com/lib/pq" // Import the PostgreSQL driver
)

func TestPostgreSQLIntegration(t *testing.T) {
    ctx := context.Background()

    // Define a PostgreSQL container
    req := testcontainers.ContainerRequest{
        Image:        "postgres:latest",
        ExposedPorts: []string{"5432/tcp"},
        WaitingFor:   wait.ForLog("database system is ready to accept connections"),
    }

    // Create the container
    container, err := testcontainers.GenericContainer(ctx, testcontainers.GenericContainerRequest{
        ContainerRequest: req,
        Started:          true,
    })
    if err != nil {
        t.Fatal(err)
    }
    defer container.Terminate(ctx)

    // Get the PostgreSQL port
    host, port, _ := container.Host(ctx)
    dsn := "user=postgres password=postgres dbname=postgres sslmode=disable host=" + host + " port=" + port

    // Connect to the database
    db, err := sql.Open("postgres", dsn)
    if err != nil {
        t.Fatal(err)
    }
    defer db.Close()

    // Your database test code here

    // Clean up
    if err := container.Terminate(ctx); err != nil {
        t.Fatal(err)
    }
}

在此测试中:

  • 我们使用TestContainers定义了一个PostgreSQL容器。
  • 我们启动容器并检索数据库连接的主机和端口。
  • 我们连接到数据库并执行我们的测试操作。
  • 最后,我们通过终止容器来清理。

这确保每个测试都在一个孤立的PostgreSQL容器中运行。

ð测试卡夫卡

同样,您可以为Kafka创建集成测试。在integration_test.go中,添加以下代码:

package test

import (
    "context"
    "testing"

    "github.com/testcontainers/testcontainers-go"
    "github.com/testcontainers/testcontainers-go/wait"
)

func TestKafkaIntegration(t *testing.T) {
    ctx := context.Background()

    // Define a Kafka container
    req := testcontainers.ContainerRequest{
        Image:        "confluentinc/cp-kafka:latest",
        ExposedPorts: []string{"9092/tcp"},
        WaitingFor:   wait.ForLog("listeners started on advertised listener"),
    }

    // Create the container
    container, err := testcontainers.GenericContainer(ctx, testcontainers.GenericContainerRequest{
        ContainerRequest: req,
        Started:          true,
    })
    if err != nil {
        t.Fatal(err)
    }
    defer container.Terminate(ctx)

    // Your Kafka test code here

    // Clean up
    if err := container.Terminate(ctx); err != nil {
        t.Fatal(err)
    }
}

ð运行测试

您可以使用go test命令进行测试:

go test ./test/

有关使用GolangPostgres testContainers的完整示例,请查看此GitHub repository

ð替代方案和比较

虽然TestContainers是一种强大的工具,但必须了解替代方案以及何时使用它们:

  1. 嘲笑:对于单位测试,您可能会选择嘲笑github.com/stretchr/testify/mock之类的库来模拟数据库和Kafka交互。这种方法适合单位测试,但缺乏实际容器的现实性。

  2. docker compose :如果您希望使用Docker撰写测试,它提供了更多的灵活性,但需要额外的设置和维护。

- 结论

Golang中的测试范围内的测试范围为有效整合和功能测试打开了大门。它使您能够毫不费力地创建和管理容器,从而确保您的测试反映了现实世界的情况。使用TestContainers,您可以为Golang应用程序编写可靠的可靠测试。

快乐测试! ð7

ð进一步阅读