天天看點

aws lambda 測試_在Go中對AWS Lambda進行單元測試

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.ClusterID
	if 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.State

	return string (clusterStatus), nil
}
           

要了解的重點是我如何在

DescribeClusterInput

上使用

&emr

。 如果您想使用任何其他AWS服務,那麼您應該做類似的事情。

現在開始測試

對于測試,我将使用Stretcher / Testify,因為它提供了模拟和斷言功能。 尤其是模拟非常重要。 當您編寫單元測試時,它不應該調用真實服務是至關重要的。 它應該始終調用模拟服務。

首先,我将建立模拟

emr

并建立

DescribeCluster

方法的模拟實作。 之後,我将建立

setup

方法

// mockEMR represents mock implementation of AWS EMR service
type mockEMR struct {
	emriface.EMRAPI
	mock.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 測試