热门标签 | 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 测试



推荐阅读
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
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社区 版权所有