Upgrade to Pro — share decks privately, control downloads, hide ads and more …

LocalStackを利用した単体テストのすすめ / First Steps in Unit Testing using LocalStack

osamu.arita
September 07, 2022
930

LocalStackを利用した単体テストのすすめ / First Steps in Unit Testing using LocalStack

osamu.arita

September 07, 2022
Tweet

Transcript

  1. 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

  2. 技術スタック
 • Frontend
 ◦ Vue.js(TypeScript)
 ◦ S3 + CloudFront
 •

    Backend
 ◦ Node.js(TypeScript) 
 ◦ API Gateway + Lambda + DynamoDB
 • Infrastructure as Code(IaC)
 ◦ AWS CloudFormation, AWS SAM

  3. 技術スタック
 • 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 バージョンが廃止
  4. テスト対象
 • 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通信のテスト

  5. テスト対象
 • 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の単体テストを強化したい
  6. テスト対象(Backend)を深堀り
 • ソースコード
 ◦ Lambda - Node.js(TypeScript) 
 ▪ Hander


    ▪ Controllers
 • AWSリソース
 ◦ API Gateway
 ◦ Lambda
 ◦ DynamoDB

  7. テスト対象(Backend)を深堀り
 • ソースコード
 ◦ Lambda - Node.js(TypeScript) 
 ▪ Hander


    ▪ Controllers
 • AWSリソース
 ◦ API Gateway
 ◦ Lambda
 ◦ DynamoDB
 単体テストする際、外部要因による依存を少なくしたい ・選択肢  ・Mockを利用  ・コンテナを利用
  8. • メリット
 ◦ 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を利用する場合

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

  10. LocalStackを利用した単体テスト
 A. CloudFormationのStackをLocalStackにデプロイ
 deploy
 (AWS CloudFormation, AWS SAM) 
 LocalStack


    単体テスト
 必要なStackだけデプロイ
 単体テストから利用
 複数Stackを持つプロジェクト

  11. LocalStackを利用した単体テスト
 A. CloudFormationのStackをLocalStackにデプロイ
 deploy
 (AWS CloudFormation, AWS SAM) 
 LocalStack


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


    単体テスト
 関連リソースだけデプロイ
 単体テストから利用
 複数Stackを持つプロジェクト

  13. LocalStackを利用した単体テスト
 B. 関連リソースのみLocalStackにデプロイ
 deploy
 (AWS CloudFormation, AWS SAM) 
 LocalStack


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