golang AWS本地测试环境工具插件go-localstack的使用

golang AWS本地测试环境工具插件go-localstack的使用

go-localstack是一个用于在Go测试中使用localstack的封装工具。localstack是一个完整的AWS云服务本地模拟环境,可以在本地开发和测试AWS应用程序。

安装

请确保已安装Docker。

go get github.com/elgohr/go-localstack

使用示例

使用SDK V2 (EndpointResolverV2)

func ExampleLocalstackSdkV2EndpointResolverV2(t *testing.T) {
    // 创建localstack实例
    l, err := localstack.NewInstance()
    if err != nil {
        t.Fatalf("Could not connect to Docker %v", err)
    }
    // 启动localstack
    if err := l.Start(); err != nil {
        t.Fatalf("Could not start localstack %v", err)
    }
    // 测试完成后清理
    t.Cleanup(func() {
        if err := l.Stop(); err != nil {
            t.Fatalf("Could not stop localstack %v", err)
        }
    })
    
    // 创建AWS配置
    cfg, err := config.LoadDefaultConfig(ctx,
        config.WithRegion("us-east-1"),
        config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider("dummy", "dummy", "dummy")),
    )
    if err != nil {
        t.Fatalf("Could not get config %v", err)
    }
    // 创建DynamoDB解析器
    resolver := localstack.NewDynamoDbResolverV2(i)
    // 创建DynamoDB客户端
    client := dynamodb.NewFromConfig(cfg, dynamodb.WithEndpointResolverV2(resolver))
	
    // 使用客户端进行测试
    myTestWithV2Client(client)
}

使用SDK V2 (EndpointResolverV1)

func ExampleLocalstackSdkV2(t *testing.T) {
    l, err := localstack.NewInstance()
    if err != nil {
        t.Fatalf("Could not connect to Docker %v", err)
    }
    if err := l.Start(); err != nil {
        t.Fatalf("Could not start localstack %v", err)
    }
    t.Cleanup(func() {
        if err := l.Stop(); err != nil {
            t.Fatalf("Could not stop localstack %v", err)
        }
	})
    
    // 创建AWS配置,使用自定义端点解析器
    cfg, err := config.LoadDefaultConfig(ctx,
        config.WithRegion("us-east-1"),
        config.WithEndpointResolverWithOptions(aws.EndpointResolverWithOptionsFunc(func(_, _ string, _ ...interface{}) (aws.Endpoint, error) {
            return aws.Endpoint{
			    PartitionID:       "aws", 
			    URL:               l.EndpointV2(localstack.SQS), 
			    SigningRegion:     "us-east-1", 
			    HostnameImmutable: true,
		    }, nil
        })),
        config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider("dummy", "dummy", "dummy")),
    )
    if err != nil {
        t.Fatalf("Could not get config %v", err)
    }
    
    myTestWithV2(cfg)
}

使用SDK V1

func TestWithLocalStack(t *testing.T) {
    l, err := localstack.NewInstance()
    if err != nil {
        t.Fatalf("Could not connect to Docker %v", err)
    }
    if err := l.Start(); err != nil {
        t.Fatalf("Could not start localstack %v", err)
    }
    t.Cleanup(func() {
        if err := l.Stop(); err != nil {
            t.Fatalf("Could not stop localstack %v", err)
        }
    })

    // 创建AWS V1配置
    myTestWith(&aws.Config{
        Credentials: credentials.NewStaticCredentials("not", "empty", ""),
        DisableSSL:  aws.Bool(true),
        Region:      aws.String(endpoints.UsWest1RegionID),
        Endpoint:    aws.String(l.Endpoint(localstack.SQS)),
    })
}

以上示例展示了如何使用go-localstack在不同版本的AWS SDK中设置本地测试环境。根据您使用的SDK版本选择相应的示例代码。


更多关于golang AWS本地测试环境工具插件go-localstack的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang AWS本地测试环境工具插件go-localstack的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用go-localstack进行AWS本地测试环境开发

go-localstack是一个Golang库,用于与LocalStack集成,LocalStack是一个功能完整的本地AWS云服务栈,用于开发和测试AWS应用程序。

安装go-localstack

首先安装go-localstack库:

go get github.com/elgohr/go-localstack

基本使用示例

下面是一个使用go-localstack创建S3存储桶并上传文件的示例:

package main

import (
	"context"
	"fmt"
	"log"
	"os"

	"github.com/aws/aws-sdk-go-v2/aws"
	"github.com/aws/aws-sdk-go-v2/config"
	"github.com/aws/aws-sdk-go-v2/service/s3"
	"github.com/elgohr/go-localstack/localstack"
)

func main() {
	// 启动LocalStack服务
	ls, err := localstack.NewInstance()
	if err != nil {
		log.Fatalf("创建LocalStack实例失败: %v", err)
	}
	defer ls.Stop()

	// 等待服务启动
	if err := ls.Wait(); err != nil {
		log.Fatalf("等待LocalStack启动失败: %v", err)
	}

	// 创建AWS配置,使用LocalStack端点
	cfg, err := config.LoadDefaultConfig(context.TODO(),
		config.WithRegion("us-east-1"),
		config.WithEndpointResolver(aws.EndpointResolverFunc(
			func(service, region string) (aws.Endpoint, error) {
				return aws.Endpoint{
					URL:           ls.Endpoint(service),
					SigningRegion: region,
				}, nil
			}),
		),
	)
	if err != nil {
		log.Fatalf("创建AWS配置失败: %v", err)
	}

	// 创建S3客户端
	s3Client := s3.NewFromConfig(cfg)

	// 创建存储桶
	bucketName := "test-bucket"
	_, err = s3Client.CreateBucket(context.TODO(), &s3.CreateBucketInput{
		Bucket: aws.String(bucketName),
	})
	if err != nil {
		log.Fatalf("创建存储桶失败: %v", err)
	}
	fmt.Printf("存储桶 %s 创建成功\n", bucketName)

	// 上传文件到存储桶
	fileContent := []byte("Hello, LocalStack!")
	_, err = s3Client.PutObject(context.TODO(), &s3.PutObjectInput{
		Bucket: aws.String(bucketName),
		Key:    aws.String("test-file.txt"),
		Body:   bytes.NewReader(fileContent),
	})
	if err != nil {
		log.Fatalf("上传文件失败: %v", err)
	}
	fmt.Println("文件上传成功")
}

高级功能

1. 自定义服务配置

ls, err := localstack.NewInstance(
	localstack.WithServices(localstack.S3, localstack.DynamoDB), // 只启动S3和DynamoDB
	localstack.WithPort(4566), // 自定义端口
	localstack.WithVersion("0.12.12"), // 指定LocalStack版本
)

2. 使用DynamoDB示例

// 创建DynamoDB客户端
dynamoClient := dynamodb.NewFromConfig(cfg)

// 创建表
_, err = dynamoClient.CreateTable(context.TODO(), &dynamodb.CreateTableInput{
	TableName: aws.String("test-table"),
	AttributeDefinitions: []types.AttributeDefinition{
		{
			AttributeName: aws.String("id"),
			AttributeType: types.ScalarAttributeTypeS,
		},
	},
	KeySchema: []types.KeySchemaElement{
		{
			AttributeName: aws.String("id"),
			KeyType:       types.KeyTypeHash,
		},
	},
	BillingMode: types.BillingModePayPerRequest,
})
if err != nil {
	log.Fatalf("创建表失败: %v", err)
}

3. 测试环境集成

func TestS3Operations(t *testing.T) {
	ls, err := localstack.NewInstance(localstack.WithServices(localstack.S3))
	if err != nil {
		t.Fatalf("创建LocalStack实例失败: %v", err)
	}
	defer ls.Stop()

	if err := ls.Wait(); err != nil {
		t.Fatalf("等待LocalStack启动失败: %v", err)
	}

	// 创建测试客户端并运行测试...
}

最佳实践

  1. 服务隔离:在测试中为每个测试用例创建独立的LocalStack实例,避免测试间的相互影响。

  2. 资源清理:测试完成后,确保删除所有创建的资源。

  3. 版本控制:在团队中固定LocalStack版本,确保一致性。

  4. 性能考虑:LocalStack适合开发和测试,但不适合性能测试。

  5. CI/CD集成:可以在CI流水线中使用LocalStack进行集成测试。

go-localstack简化了与LocalStack的交互,使得在本地开发和测试AWS应用程序变得更加容易,无需连接到真实的AWS环境。

回到顶部