Slide 1

Slide 1 text

LocalStackを利用した
 単体テストのすすめ
 osamu.arita - LINE Fukuoka
 夏休みの自由研究発表会 - 2022/09/06 


Slide 2

Slide 2 text

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


Slide 3

Slide 3 text

やりたいこと
 ● AWSサーバレス構成のプロジェクトに単体テスト追加
 ● 開発メンバーによる単体テストの書き方のゆらぎを抑えたい
 エンジニアAさん
 ソースコード
 エンジニアBさん
 deploy
 (AWS CloudFormation, AWS SAM) 
 AWSサーバレス構成
 ・Frontend
 ・Backend
 単体テスト


Slide 4

Slide 4 text

技術スタック
 ● Frontend
 ○ Vue.js(TypeScript)
 ○ S3 + CloudFront
 ● Backend
 ○ Node.js(TypeScript) 
 ○ API Gateway + Lambda + DynamoDB
 ● Infrastructure as Code(IaC)
 ○ AWS CloudFormation, AWS SAM


Slide 5

Slide 5 text

技術スタック
 ● 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 バージョンが廃止

Slide 6

Slide 6 text

テスト対象
 ● 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通信のテスト


Slide 7

Slide 7 text

テスト対象
 ● 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の単体テストを強化したい

Slide 8

Slide 8 text

テスト対象(Backend)を深堀り
 ● ソースコード
 ○ Lambda - Node.js(TypeScript) 
 ■ Hander
 ■ Controllers
 ● AWSリソース
 ○ API Gateway
 ○ Lambda
 ○ DynamoDB


Slide 9

Slide 9 text

テスト対象(Backend)を深堀り
 ● ソースコード
 ○ Lambda - Node.js(TypeScript) 
 ■ Hander
 ■ Controllers
 ● AWSリソース
 ○ API Gateway
 ○ Lambda
 ○ DynamoDB
 単体テストする際、外部要因による依存を少なくしたい ・選択肢  ・Mockを利用  ・コンテナを利用

Slide 10

Slide 10 text

● メリット
 ○ 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を利用する場合


Slide 11

Slide 11 text

● メリット
 ○ AWSリソースをコンテナとして利用可能
 ● デメリット
 ○ 単体テストに、コンテナ起動が伴う
 コンテナを利用する場合


Slide 12

Slide 12 text

テストピラミッド
 引用: 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) 


Slide 13

Slide 13 text

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


Slide 14

Slide 14 text

コンテナサービス比較
 一通りのAWSサービスを網羅


Slide 15

Slide 15 text

LocalStackを利用した単体テスト
 A. CloudFormationのStackをLocalStackにデプロイ
 deploy
 (AWS CloudFormation, AWS SAM) 
 LocalStack
 単体テスト
 必要なStackだけデプロイ
 単体テストから利用
 複数Stackを持つプロジェクト


Slide 16

Slide 16 text

LocalStackを利用した単体テスト
 A. CloudFormationのStackをLocalStackにデプロイ
 deploy
 (AWS CloudFormation, AWS SAM) 
 LocalStack
 単体テスト
 必要なStackだけデプロイ
 単体テストから利用
 複数Stackを持つプロジェクト
 ・メリット Mockを作成せずともAWSリソースにアクセス可能 ・デメリット DynamoDBのテーブルなど、Stack間でリソース 依存が存在する場合、全デプロイしないといけない

Slide 17

Slide 17 text

LocalStackを利用した単体テスト
 B. 関連リソースのみLocalStackにデプロイ
 deploy
 (AWS CloudFormation, AWS SAM) 
 LocalStack
 単体テスト
 関連リソースだけデプロイ
 単体テストから利用
 複数Stackを持つプロジェクト


Slide 18

Slide 18 text

LocalStackを利用した単体テスト
 B. 関連リソースのみLocalStackにデプロイ
 deploy
 (AWS CloudFormation, AWS SAM) 
 LocalStack
 単体テスト
 関連リソースだけデプロイ
 単体テストから利用
 複数Stackを持つプロジェクト
 ・メリット Mockを作成せずともAWSリソースにアクセス可能 ・デメリット 関連リソースだけ抜粋して先にデプロイする必要があ る

Slide 19

Slide 19 text

まとめ
 ● LocalStackを利用することで、単体テストのAWSリソースアクセスは代替でき そう
 ● プロジェクトの構成によっては、Stack単位、関連リソース単位で事前デプ ロイするかは要検討
 ● おまけ
 ○ 2022/11/14:LambdaランタイムNode.js 12バージョンが廃止。 Node.js16以降を利用しましょう!


Slide 20

Slide 20 text

Thank You !
 ご清聴ありがとうございました!