Share
Embed
LocalStackを利用した単体テストのすすめ / First Steps in Unit Testing using LocalStack
osamu.arita
September 07, 2022
Transcript
20 slides
-
ABOUT ME • LINE Fukuokaのエンジニア ◦ 「LINE SMART CITY GovTech
プログラム」の開発サポート全般 • 社会人歴16年 / 社歴2年目 ◦ AWS / Firebase / Ruby on Rails / PHP(Laravel、etc..) ◦ iOS(swift)/ Android(Kotlin / Java)/ Flutter(Dart) • スプラトゥーン3 予約しました • slack - #z_osamu osamu_arita osamu.arita -
やりたいこと • AWSサーバレス構成のプロジェクトに単体テスト追加 • 開発メンバーによる単体テストの書き方のゆらぎを抑えたい エンジニアAさん ソースコード エンジニアBさん deploy (AWS
CloudFormation, AWS SAM) AWSサーバレス構成 ・Frontend ・Backend 単体テスト -
技術スタック • Frontend ◦ Vue.js(TypeScript) ◦ S3 + CloudFront •
Backend ◦ Node.js(TypeScript) ◦ API Gateway + Lambda + DynamoDB • Infrastructure as Code(IaC) ◦ AWS CloudFormation, AWS SAM -
技術スタック • Frontend ◦ Vue.js(TypeScript) ◦ S3 + CloudFront •
Backend ◦ Node.js(TypeScript) ◦ API Gateway + Lambda + DynamoDB • Infrastructure as Code(IaC) ◦ AWS CloudFormation, AWS SAM Node.js EOL(End Of Life) v12:2022-04-30 v14:2023-04-30 ★来年サポート切れ v16:2024-04-30 ★推奨 2022/11/14:LambdaランタイムNode.js 12 バージョンが廃止 -
テスト対象 • Frontend ◦ Vue.js(TypeScript) ◦ S3 + CloudFront •
Backend ◦ Node.js(TypeScript) ◦ API Gateway + Lambda + DynamoDB • Infrastructure as Code(IaC) ◦ AWS CloudFormation, AWS SAM デプロイのテスト API、DB操作、 バッチ処理のテスト コンポーネントや API通信のテスト -
テスト対象 • Frontend ◦ Vue.js(TypeScript) ◦ S3 + CloudFront •
Backend ◦ Node.js(TypeScript) ◦ API Gateway + Lambda + DynamoDB • Infrastructure as Code(IaC) ◦ AWS CloudFormation, AWS SAM デプロイのテスト API、DB操作、 バッチ処理のテスト コンポーネントや API通信のテスト 複数メンバーで開発していると、 割とAPI周りでバグが起きることが多かった → Backendの単体テストを強化したい -
テスト対象(Backend)を深堀り • ソースコード ◦ Lambda - Node.js(TypeScript) ▪ Hander
▪ Controllers • AWSリソース ◦ API Gateway ◦ Lambda ◦ DynamoDB -
テスト対象(Backend)を深堀り • ソースコード ◦ Lambda - Node.js(TypeScript) ▪ Hander
▪ Controllers • AWSリソース ◦ API Gateway ◦ Lambda ◦ DynamoDB 単体テストする際、外部要因による依存を少なくしたい ・選択肢 ・Mockを利用 ・コンテナを利用 -
• メリット ◦ AWSリソースをMockとして利用可能 • デメリット ◦ aws-sdk-mock、JestのMockなど選択肢あり ▪ https://www.npmjs.com/package/aws-sdk-mock
▪ https://archive.jestjs.io/docs/ja/23.x/mock-functions ▪ https://jestjs.io/ja/docs/dynamodb ◦ 開発メンバーによる書き方のゆらぎが発生する Mockを利用する場合 -
テストピラミッド 引用: https://developer.android.com/training/testing/fundamentals https://testing.googleblog.com/2010/12/test-sizes.html ・Small Tests ローカルユニットテスト実行 Controllersや関連メソッドのテスト
不安定、低速、高コスト 安定、高速、低コスト ・Large Tests 実際にAWSデプロイ してテスト実行 Test Sizes Medium Testsとして考えれば違和感なし ・Medium Tests コンテナを利用したテスト実行 (dynamodb-localやLocalStack) -
LocalStackとは • https://github.com/localstack/localstack • AWSの各リソースをコンテナ上でシミュレートしたもの • OSSとして提供 • 2022/7/25:バージョン1.0に到達、正式リリース ◦
https://localstack.cloud/blog/2022-07-13-announcing-localstack-v1-general-availability -
LocalStackを利用した単体テスト A. CloudFormationのStackをLocalStackにデプロイ deploy (AWS CloudFormation, AWS SAM) LocalStack
単体テスト 必要なStackだけデプロイ 単体テストから利用 複数Stackを持つプロジェクト -
LocalStackを利用した単体テスト A. CloudFormationのStackをLocalStackにデプロイ deploy (AWS CloudFormation, AWS SAM) LocalStack
単体テスト 必要なStackだけデプロイ 単体テストから利用 複数Stackを持つプロジェクト ・メリット Mockを作成せずともAWSリソースにアクセス可能 ・デメリット DynamoDBのテーブルなど、Stack間でリソース 依存が存在する場合、全デプロイしないといけない -
LocalStackを利用した単体テスト B. 関連リソースのみLocalStackにデプロイ deploy (AWS CloudFormation, AWS SAM) LocalStack
単体テスト 関連リソースだけデプロイ 単体テストから利用 複数Stackを持つプロジェクト -
LocalStackを利用した単体テスト B. 関連リソースのみLocalStackにデプロイ deploy (AWS CloudFormation, AWS SAM) LocalStack
単体テスト 関連リソースだけデプロイ 単体テストから利用 複数Stackを持つプロジェクト ・メリット Mockを作成せずともAWSリソースにアクセス可能 ・デメリット 関連リソースだけ抜粋して先にデプロイする必要があ る -
まとめ • LocalStackを利用することで、単体テストのAWSリソースアクセスは代替でき そう • プロジェクトの構成によっては、Stack単位、関連リソース単位で事前デプ ロイするかは要検討 • おまけ ◦
2022/11/14:LambdaランタイムNode.js 12バージョンが廃止。 Node.js16以降を利用しましょう!