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
更多关于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)
}
// 创建测试客户端并运行测试...
}
最佳实践
-
服务隔离:在测试中为每个测试用例创建独立的LocalStack实例,避免测试间的相互影响。
-
资源清理:测试完成后,确保删除所有创建的资源。
-
版本控制:在团队中固定LocalStack版本,确保一致性。
-
性能考虑:LocalStack适合开发和测试,但不适合性能测试。
-
CI/CD集成:可以在CI流水线中使用LocalStack进行集成测试。
go-localstack简化了与LocalStack的交互,使得在本地开发和测试AWS应用程序变得更加容易,无需连接到真实的AWS环境。