热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

awslambda测试_在Go中对AWSLambda进行单元测试

awslambda测试当我开始在Go和AWSLambda中工作时,我面临的困难之一是单元测试。我对什么是单元测试有一个不错的想法,并且知道如何在Ruby

aws lambda 测试

当我开始在Go和AWS Lambda中工作时,我面临的困难之一是单元测试。 我对什么是单元测试有一个不错的想法,并且知道如何在Ruby中进行测试,但是在Go中,我不知道是什么原因,因为我是一个初学者。

学习围棋本身就是一个挑战。 主要是因为Go不是一种OOP语言。 我开始在Go上阅读文章,并在YouTube上观看了许多视频系列。 几天后,我逐渐好起来,并且能够理解事物。 但是我想学习如何进行单元测试,不幸的是,没有很多好的博客来说明如何使用Go进行AWS单元测试。 因此,此博客旨在解释如何使用Go正确地对AWS服务进行单元测试。

在博客中,我将演示如何对在Go中使用EMR服务的Lambda进行单元测试。 代码很简单,给出了集群ID,我必须获取集群状态。

永远记住,如果要在Go中进行单元测试,则必须使用接口,并尽可能避免使用具体的API或函数。 所以对于aws-sdk-go ,我们有一些接口,例如dynamodb
dynamodbiface您可以看到aws-sdk-go来查看服务的iface名称是什么。 通常,其service-nameiface.

现在开始编码

首先,我将创建将集群ID作为输入并将emr接口作为API的结构

// ClusterInput represent input which will be given to the lambda
type ClusterInput struct {ClusterID string `json:"clusterID"`
}// awsService represents emr interface
type awsService struct {emr emriface.EMRAPI
}

接下来,我将创建一个函数,其功能是创建一个新的AWS会话并创建一个新的emr服务

// newAWSService returns a new instance of emr
func newAWSService () * awsService {awsConfig := &aws.Config{Region: aws.String( "us-west-2" )}sess, err := session.NewSession(awsConfig)if err != nil {log.Errorf( "error while creating AWS session - %s" , err.Error())}return &awsService{emr: emr.New(sess),}
}

现在,来了肉的部分。 我将进行输入验证,并准备输入DescribeCluster emr API方法。 休息就很简单。

// getClusterStatus returns current cluster status along with an error
func (svc *awsService) getClusterStatus (input ClusterInput) ( string , error) {clusterID := input.ClusterIDif clusterID == "" {return "" , errors.New( "clusterID is empty" )}describeClusterInput := &emr.DescribeClusterInput{ClusterId: aws.String(clusterID),}clusterDetails, err := svc.emr.DescribeCluster(describeClusterInput)if err != nil {log.Errorf( "DescribeCluster error - %s" , err)return "" , err}if clusterDetails == nil {log.Errorf( "clusterID does not exist" )return "" , errors.New( "clusterID does not exist" )}clusterStatus := *clusterDetails.Cluster.Status.Statereturn string (clusterStatus), nil
}

要了解的重点是我如何在DescribeClusterInput上使用&emr 。 如果您想使用任何其他AWS服务,那么您应该做类似的事情。

现在开始测试

对于测试,我将使用Stretcher / Testify,因为它提供了模拟和断言功能。 尤其是模拟非常重要。 当您编写单元测试时,它不应该调用真实服务是至关重要的。 它应该始终调用模拟服务。

首先,我将创建模拟emr并创建DescribeCluster方法的模拟实现。 之后,我将创建setup方法

// mockEMR represents mock implementation of AWS EMR service
type mockEMR struct {emriface.EMRAPImock.Mock
}// DescribeCluster is a mocked method which return the cluster status
func (m *mockEMR) DescribeCluster (input *emr.DescribeClusterInput) (*emr.DescribeClusterOutput, error) {args := m.Called(input)return args.Get( 0 ).(*emr.DescribeClusterOutput), args.Error( 1 )
}func setup () (*mockEMR, *awsService) {mockEMRClient := new (mockEMR)mockEMR := &awsService{emr: mockEMRClient,}return mockEMRClient, mockEMR
}

现在,该编写表驱动测试并调用原始函数了。 一旦调用了原始函数,我就可以断言预期结果是否与实际结果匹配。

mockEMRClient, mockEMR := setup()mockDescribeClusterInput := &emr.DescribeClusterInput{ClusterId: aws.String(testCase.clusterID),
}mockDescribeClusterOutput := &emr.DescribeClusterOutput{Cluster: &emr.Cluster{Status: &emr.ClusterStatus{State: aws.String(testCase.expectedClusterStatus),},},
}mockEMRClient.On("DescribeCluster" , mockDescribeClusterInput).Return(mockDescribeClusterOutput, testCase.emrError)
res, err := mockEMR.getClusterStatus(testCase.expectedInput)assert.Equal(t, testCase.expectedClusterStatus, res, testCase.message)
assert.IsType(t, testCase.expectedError, err, testCase.message)

而已! 我希望阅读此博客后,您可以了解Go中的一点单元测试AWS Lambda。

检出aws-unit-test-golang以获取完整代码

翻译自: https://hackernoon.com/unit-test-aws-lambda-in-go-h85l3ymz

aws lambda 测试



推荐阅读
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 本文探讨了 RESTful API 和传统接口之间的关键差异,解释了为什么 RESTful API 在设计和实现上具有独特的优势。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 本题探讨如何通过最大流算法解决农场排水系统的设计问题。题目要求计算从水源点到汇合点的最大水流速率,使用经典的EK(Edmonds-Karp)和Dinic算法进行求解。 ... [详细]
  • 本文详细介绍了如何准备和安装 Eclipse 开发环境及其相关插件,包括 JDK、Tomcat、Struts 等组件的安装步骤及配置方法。 ... [详细]
  • 为了解决不同服务器间共享图片的需求,我们最初考虑建立一个FTP图片服务器。然而,考虑到项目是一个简单的CMS系统,为了简化流程,团队决定探索七牛云存储的解决方案。本文将详细介绍使用七牛云存储的过程和心得。 ... [详细]
  • 尝试执行数据库模式加载时遇到错误'Mysql2::Error: 指定的键太长;最大键长度为767字节'。本文将探讨这一问题的成因及解决方案。 ... [详细]
  • 高效解决应用崩溃问题!友盟新版错误分析工具全面升级
    友盟推出的最新版错误分析工具,专为移动开发者设计,提供强大的Crash收集与分析功能。该工具能够实时监控App运行状态,快速发现并修复错误,显著提升应用的稳定性和用户体验。 ... [详细]
  • 堆是一种常见的数据结构,广泛应用于计算机科学领域。它通常表示为一棵完全二叉树,并可通过数组实现。堆的主要特性是每个节点的值与其父节点的值之间存在特定的关系,这使得堆在优先队列和排序算法中非常有用。 ... [详细]
  • 金山与万普广告争议:APP开发者权益受侵害
    探讨了金山毒霸对嵌入特定广告SDK的APP进行封禁的行为,分析其对安卓开发者的影响,并揭示了这一系列事件背后的复杂性。 ... [详细]
  • 在创建新的Android项目时,您可能会遇到aapt错误,提示无法打开libstdc++.so.6共享对象文件。本文将探讨该问题的原因及解决方案。 ... [详细]
  • Android Studio 安装与配置指南
    本教程详细介绍了如何下载并安装 Android Studio,包括设置 SDK 路径和优化启动性能的方法。通过这些步骤,您可以顺利地开始开发 Android 应用。 ... [详细]
  • 云函数与数据库API实现增删查改的对比
    本文将深入探讨使用云函数和数据库API实现数据操作(增删查改)的不同方法,通过详细的代码示例帮助读者更好地理解和掌握这些技术。文章不仅提供代码实现,还解释了每种方法的特点和适用场景。 ... [详细]
  • MongoDB的核心特性与架构解析
    本文深入探讨了MongoDB的核心特性,包括其强大的查询语言、灵活的文档模型以及高效的索引机制。此外,还详细介绍了MongoDB的体系结构,解释了其文档、集合和数据库的层次关系,并对比了MongoDB与传统关系型数据库(如MySQL)的逻辑结构。 ... [详细]
author-avatar
腾讯财经321
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有