SlideShare a Scribd company logo
Nuxt.js SSRにおけるE2Eテストの実装
Scramble Tech#1
株式会社 ミクシィ
太田 一行

構成
Nuxt.js SSRにおけるE2Eテストの実装
1. あらすじ
2. 背景
3. 実装例と運用してみた結果
4. 議論と今後の見通し
5. [image citations]
6. [self introduction]
あらすじ
Nuxt.js SSRにおけるE2Eテストの実装
E2Eテストの実装 安定したQAに自動化で貢献
Nuxt.js SSRにおけるE2Eテストの実装
使用する道具 いくつかの道具を組み合わせ
Nuxt.js SSRにおけるE2Eテストの実装
Our Application
Nuxt.jsで作成されたフロント
& Phoenixで作成されたサーバ
Nuxt.js SSRにおけるE2Eテストの実装
…with SSR
time-to-contentの改善が見込
める。ビジネス要件によって
は考えたい選択肢。
背景
Nuxt.js SSRにおけるE2Eテストの実装
E2Eテスト

実装の目的
❖ 機械的に確認できる部分を自動化し、

QAの省力化に貢献すること
❖ かつ、単体テストやAPIテストには

カバーできない項目が存在する
E2E テストについて
❖ ソフトウェアテストの一種
1. 自動でブラウザを操作
2. 作成したシナリオを実行
3. スクリーンショット(SS)撮影等
4. 期待した描画結果か調べる
E2E テストの役割
❖ チームでは3つを定義した
1.デザイン崩れの検出
2.デグレーションの検出
3.ページ遷移を保証
E2E テストの留意点
❖ 外部要因に影響を受け得る
❖ ネットワーク遅延等
❖ 変更コストやや増
❖ それ自体に保守コストが

かかる
単体テストの代わりではなく、

補完として
代表的なツール
❖ Puppeteer
❖ Headless Chrome Node.js API
❖ maintenance by Chrome dev team
❖ 要点
❖ Chromeをスクリプトから

操るライブラリ
❖ 採用理由
❖ vs puppeteer-core
❖ jest-puppeteerの存在
❖ jest テスト環境がすでに存在したため
App要件1:SSR概要
❖ WebAppはSever-Side-
Rendering (SSR)を採用
❖ HTML&propsを合わせて

事前レンダリングする
❖ JSで書かれたcomponentが
propsを参照しながら遅れて
描画される
❖ アルゴリズムは本スライドの
スコープ外
App要件1:SSR概要
❖ 採用理由
❖ time-to-contentの改善が

ビジネス上クリティカル
❖ E2Eテストからみた制約
❖ Node.js 実行環境が必要
アクセスして何かが表示
されるまでの時間
App要件2:SMS認証
❖ 所与の要件として、SMS認証を
認証に用いる
❖ Puppeteerは正規の方法で
SMS認証を突破できない
❖ E2Eテストからみた制約
❖ SMS認証をモックした

専用のサーバを立てる必要
要件の整理
1. CI/CDで定期実行する
2. ビジネス要件への適応
❖ SSRを実行できる環境
❖ 専用のサーバ
3. (できれば)テスト失敗時に

対応しやすい
❖ 問題箇所をすぐ特定
❖ 正しいSSをすぐデプロイ
実装例
アプリケーション部分
❖ Nuxt.js + Phoenix + Nginx
❖ Nuxt.js - Nginx間はDocker
ネットワークで繋がっている
❖ PhoenixにはE2Eテスト用の
環境設定を追加
❖ SMS認証はモックされている
アプリケーション部分
❖ 工夫したポイント
❖ Nuxt.jsはNodeコンテナに
❖ Phoenixのplugとして

SMS認証機能をモック

課題1を解決できた!
課題2を解決できた!
Docker-Compose on CircleCI
❖ Docker-Compose
❖ Nuxt.js コンテナ
❖ Nginx コンテナ
❖ Puppeteer コンテナ
❖ cronで定期実行
$ docker-compose up
Docker-Compose on CircleCI
❖ Nuxt.js コンテナ
❖ Node+ App本体
❖ Nginx コンテナ
❖ 本番ではS3-CloudFrontのメディア
サーバ
❖ Puppeteer コンテナ
❖ Node + Puppeteer + Chrome
❖ シナリオスクリプトや正解デー
タ、実際に撮影したSSなどのデー
タを含むテスト実行主体
Docker-Compose on CircleCI
❖ ローカルでも同じコマンド



でテスト実行できる
$ docker-compose up
テストの実行と通知
❖ Puppeteerがテストを実行
❖ S3から正解画像を取得し、
コンテナに含めてビルド
❖ 作成したSSはArtifact化
❖ ブラウザからすぐ見られる!
❖ 結果はURLつきで

Slackに通知 問題の早期特定に役立つ!
1. Slackに毎朝実行結果が通知される
2. 失敗していたら、Artifactとして保存したSSを参照。

失敗した理由を特定する。
3. コードを修正する。
4. ローカルから$docker-compose up
5. 正しく生成した画像をS3にプッシュ
運用フロー
CIで

定期実行 !
2step!
要件再掲
1. CI/CDで定期実行したい
2. ビジネス要件への適応
❖ SSRを実行できる環境
❖ 専用のサーバ
3. (できれば)テスト失敗時に

対応しやすい
❖ 問題箇所をすぐ特定
❖ 正しいSSをすぐデプロイ
要件を満たせた!
2ヶ月ほど運用した結果
❖ 設定した目標は実現できていそう
❖ デザイン崩れ防止
❖ デグレーション防止
❖ ページ遷移の保証
❖ 副次的なありがたみもいくらかある
❖ 単体テストやAPIテストのヌケが見つかることも
議論と今後の見通し
議論
❖ これは正しいend-to-endテストと呼べるのか?
❖ end-to-endとはいえない

なぜならサーバ側を厳密に保証できていないから
1. DB、インフラの性質が本番とは異なる
2. SMS認証部がモックされている
❖ SMS認証を回避しつつサーバコード全体をそのまま残すこと
ができればend-to-endと呼べるか? 1も同様に必須か?
皆さんの良いアイデアお待ちしていますmm
今後の課題
❖ E2Eテストの保守性向上
❖ E2Eテストは腐りやすい
❖ 更新ツールを整備して腐りにくく
❖ 単体テスト、APIテストのカバレッジ向上
❖ E2Eテストに依存せず、バランスの良いテスト体制を
余談(実装した感想)
❖ 実装時、CORSがエラーしがちで辛い
❖ Chrome devtool, curlの用法に詳しくなる
❖ フロント、サーバ、インフラを横断するタスク
❖ 全てのエンジニアが全てのコードに責任をもつ

@ガイドライン
❖ DockerとCircleCIに親しみを持てるようになった
ご清聴ありがとうございました
freepik contributions:
https://jp.freepik.com/free-vector/flat-robot-character-with-different-poses-collection_1510587.htm#page=2&query=robot&position=1

https://www.freepik.com/free-vector/businessman-holding-thumb-finger-stopwatch_1311422.htm#page=1&query=quickly&position=1
https://www.freepik.com/free-vector/maintenance-concept-illustration_5421740.htm#page=1&query=maintenance&position=0
https://jp.freepik.com/free-vector/bundle-of-engineering-set-icons_5984951.htm#query=computer%20tools&position=16
https://jp.freepik.com/free-vector/the-browser-window-with-the-donate-button_4015769.htm#page=1&query=browser&position=7
https://jp.freepik.com/free-photo/work-desk-coffee-documents-and-laptop_1189547.htm#page=1&query=%E6%9B%B8%E9%A1%9E&position=13

Google2段階認証プロセス - Google https://www.google.com/landing/2step/?hl=ja
phoenix - seeklogo https://seeklogo.com/vector-logo/273793/phoenix
image citation
太田 一行
❖ Software Engineer1年目
❖ フロントエンド
❖ 機械学習
❖ 略歴
❖ 2019.4 株式会社ミクシィ
❖ 2019.3 京都大学大学院 

情報学研究科 知能情報学専攻 卒
❖ 連絡先
❖ @samayotta
❖ samayotta@gmail.com

More Related Content

What's hot

帰ってきた インフラ野郎 Azureチーム ~Azure データセンターテクノロジー解体新書2018春~ - de:code2018
帰ってきた インフラ野郎 Azureチーム ~Azure データセンターテクノロジー解体新書2018春~ - de:code2018帰ってきた インフラ野郎 Azureチーム ~Azure データセンターテクノロジー解体新書2018春~ - de:code2018
帰ってきた インフラ野郎 Azureチーム ~Azure データセンターテクノロジー解体新書2018春~ - de:code2018
Toru Makabe
 

What's hot (20)

半日でわかる コンテナー技術 (応用編)
半日でわかる コンテナー技術 (応用編)半日でわかる コンテナー技術 (応用編)
半日でわかる コンテナー技術 (応用編)
 
20130823 cloudpacknight AutoHealing
20130823 cloudpacknight AutoHealing20130823 cloudpacknight AutoHealing
20130823 cloudpacknight AutoHealing
 
帰ってきた インフラ野郎 Azureチーム ~Azure データセンターテクノロジー解体新書2018春~ - de:code2018
帰ってきた インフラ野郎 Azureチーム ~Azure データセンターテクノロジー解体新書2018春~ - de:code2018帰ってきた インフラ野郎 Azureチーム ~Azure データセンターテクノロジー解体新書2018春~ - de:code2018
帰ってきた インフラ野郎 Azureチーム ~Azure データセンターテクノロジー解体新書2018春~ - de:code2018
 
俺の Kubernetes Workflow with HashiStack
俺の Kubernetes Workflow with HashiStack俺の Kubernetes Workflow with HashiStack
俺の Kubernetes Workflow with HashiStack
 
Real World Azure RBAC
Real World Azure RBACReal World Azure RBAC
Real World Azure RBAC
 
インフラ野郎AzureチームProX
インフラ野郎AzureチームProXインフラ野郎AzureチームProX
インフラ野郎AzureチームProX
 
Non-coding! Azure
Non-coding! AzureNon-coding! Azure
Non-coding! Azure
 
cloudpackサーバ仕様書(サンプル)
cloudpackサーバ仕様書(サンプル)cloudpackサーバ仕様書(サンプル)
cloudpackサーバ仕様書(サンプル)
 
半日でわかる コンテナー技術 (入門編)
半日でわかる コンテナー技術 (入門編)半日でわかる コンテナー技術 (入門編)
半日でわかる コンテナー技術 (入門編)
 
深層学習 環境構築 Azure
深層学習 環境構築 Azure深層学習 環境構築 Azure
深層学習 環境構築 Azure
 
Ingress on Azure Kubernetes Service
Ingress on Azure Kubernetes ServiceIngress on Azure Kubernetes Service
Ingress on Azure Kubernetes Service
 
インフラ野郎 Azureチーム at クラウド boost
インフラ野郎 Azureチーム at クラウド boostインフラ野郎 Azureチーム at クラウド boost
インフラ野郎 Azureチーム at クラウド boost
 
Google Web Toolkit(GWT)入門
Google Web Toolkit(GWT)入門Google Web Toolkit(GWT)入門
Google Web Toolkit(GWT)入門
 
俺とHashiCorp
俺とHashiCorp俺とHashiCorp
俺とHashiCorp
 
ダイ・ハード in the Kubernetes world
ダイ・ハード in the Kubernetes worldダイ・ハード in the Kubernetes world
ダイ・ハード in the Kubernetes world
 
20210925_jazug_azure_what_to_do_first
20210925_jazug_azure_what_to_do_first20210925_jazug_azure_what_to_do_first
20210925_jazug_azure_what_to_do_first
 
Azure Infrastructure as Code 体験入隊
Azure Infrastructure as Code 体験入隊Azure Infrastructure as Code 体験入隊
Azure Infrastructure as Code 体験入隊
 
msal.js v2を触る
msal.js v2を触るmsal.js v2を触る
msal.js v2を触る
 
ミッション : メガクラウドを安全にアップデートせよ!
ミッション : メガクラウドを安全にアップデートせよ!ミッション : メガクラウドを安全にアップデートせよ!
ミッション : メガクラウドを安全にアップデートせよ!
 
Essentials of container
Essentials of containerEssentials of container
Essentials of container
 

Similar to E2E test on Nuxt.js with SSR

OpenStack on OpenStack with CI
OpenStack on OpenStack with CIOpenStack on OpenStack with CI
OpenStack on OpenStack with CI
kanabuchi
 
Hokuriku.net 2013 01-26 node.js
Hokuriku.net 2013 01-26 node.jsHokuriku.net 2013 01-26 node.js
Hokuriku.net 2013 01-26 node.js
Tadahiro Ishisaka
 
Applibot presents Smartphone Game on AWS
Applibot presents Smartphone Game on AWSApplibot presents Smartphone Game on AWS
Applibot presents Smartphone Game on AWS
Kenta Yasukawa
 
M20_Azure SQL Database 最新アップデートをまとめてキャッチアップ [Microsoft Japan Digital Days]
M20_Azure SQL Database 最新アップデートをまとめてキャッチアップ [Microsoft Japan Digital Days]M20_Azure SQL Database 最新アップデートをまとめてキャッチアップ [Microsoft Japan Digital Days]
M20_Azure SQL Database 最新アップデートをまとめてキャッチアップ [Microsoft Japan Digital Days]
日本マイクロソフト株式会社
 

Similar to E2E test on Nuxt.js with SSR (20)

スクリプト実行可能なサーバーサイド拡張(SSE)の実装例とその応用 - Node.js編
スクリプト実行可能なサーバーサイド拡張(SSE)の実装例とその応用 - Node.js編スクリプト実行可能なサーバーサイド拡張(SSE)の実装例とその応用 - Node.js編
スクリプト実行可能なサーバーサイド拡張(SSE)の実装例とその応用 - Node.js編
 
Android e2e testing at mercari
Android e2e testing at mercariAndroid e2e testing at mercari
Android e2e testing at mercari
 
20190319 xtech recochoku_15m_pub
20190319 xtech recochoku_15m_pub20190319 xtech recochoku_15m_pub
20190319 xtech recochoku_15m_pub
 
機械学習 / Deep Learning 大全 (5) Tool編
機械学習 / Deep Learning 大全 (5) Tool編機械学習 / Deep Learning 大全 (5) Tool編
機械学習 / Deep Learning 大全 (5) Tool編
 
Pwa
PwaPwa
Pwa
 
OpenStack on OpenStack with CI
OpenStack on OpenStack with CIOpenStack on OpenStack with CI
OpenStack on OpenStack with CI
 
Test automation strategy for .net core 3 transition
Test automation strategy for .net core 3 transitionTest automation strategy for .net core 3 transition
Test automation strategy for .net core 3 transition
 
Windows Azure and PowerShell DSC
Windows Azure and PowerShell DSCWindows Azure and PowerShell DSC
Windows Azure and PowerShell DSC
 
ゼロから作るKubernetesによるJupyter as a Service ー Kubernetes Meetup Tokyo #43
ゼロから作るKubernetesによるJupyter as a Service ー Kubernetes Meetup Tokyo #43ゼロから作るKubernetesによるJupyter as a Service ー Kubernetes Meetup Tokyo #43
ゼロから作るKubernetesによるJupyter as a Service ー Kubernetes Meetup Tokyo #43
 
Hokuriku.net 2013 01-26 node.js
Hokuriku.net 2013 01-26 node.jsHokuriku.net 2013 01-26 node.js
Hokuriku.net 2013 01-26 node.js
 
Applibot presents Smartphone Game on AWS
Applibot presents Smartphone Game on AWSApplibot presents Smartphone Game on AWS
Applibot presents Smartphone Game on AWS
 
Microsoft AI Solution Update / DLL community Update
Microsoft AI Solution Update / DLL community UpdateMicrosoft AI Solution Update / DLL community Update
Microsoft AI Solution Update / DLL community Update
 
[MW11] OSS on Azure で構築する ウェブアプリケーション
[MW11] OSS on Azure で構築する ウェブアプリケーション[MW11] OSS on Azure で構築する ウェブアプリケーション
[MW11] OSS on Azure で構築する ウェブアプリケーション
 
1000人規模で使う分析基盤構築 〜redshiftを活用したeuc
1000人規模で使う分析基盤構築  〜redshiftを活用したeuc1000人規模で使う分析基盤構築  〜redshiftを活用したeuc
1000人規模で使う分析基盤構築 〜redshiftを活用したeuc
 
【BS14】Blazor WebAssemblyとJavaScriptのインターオペラビリティ
【BS14】Blazor WebAssemblyとJavaScriptのインターオペラビリティ 【BS14】Blazor WebAssemblyとJavaScriptのインターオペラビリティ
【BS14】Blazor WebAssemblyとJavaScriptのインターオペラビリティ
 
M20_Azure SQL Database 最新アップデートをまとめてキャッチアップ [Microsoft Japan Digital Days]
M20_Azure SQL Database 最新アップデートをまとめてキャッチアップ [Microsoft Japan Digital Days]M20_Azure SQL Database 最新アップデートをまとめてキャッチアップ [Microsoft Japan Digital Days]
M20_Azure SQL Database 最新アップデートをまとめてキャッチアップ [Microsoft Japan Digital Days]
 
Azure Antenna AI 概要
Azure Antenna AI 概要Azure Antenna AI 概要
Azure Antenna AI 概要
 
[TL04] .NET 15 周年の今こそ考えるクラウドネイティブ アプリケーションと .NET の活用
[TL04] .NET 15 周年の今こそ考えるクラウドネイティブ アプリケーションと .NET の活用[TL04] .NET 15 周年の今こそ考えるクラウドネイティブ アプリケーションと .NET の活用
[TL04] .NET 15 周年の今こそ考えるクラウドネイティブ アプリケーションと .NET の活用
 
開発者のための機械学習入門:Azure Machine Learning Studioで構造化データから予測分析
開発者のための機械学習入門:Azure Machine Learning Studioで構造化データから予測分析開発者のための機械学習入門:Azure Machine Learning Studioで構造化データから予測分析
開発者のための機械学習入門:Azure Machine Learning Studioで構造化データから予測分析
 
Oracleがnode.jsをやり始めたというのだが!
Oracleがnode.jsをやり始めたというのだが!Oracleがnode.jsをやり始めたというのだが!
Oracleがnode.jsをやり始めたというのだが!
 

Recently uploaded

ビジュアルプログラミングIotLT17-オープンソース化されたビジュアルプログラミング環境Noodlの紹介
ビジュアルプログラミングIotLT17-オープンソース化されたビジュアルプログラミング環境Noodlの紹介ビジュアルプログラミングIotLT17-オープンソース化されたビジュアルプログラミング環境Noodlの紹介
ビジュアルプログラミングIotLT17-オープンソース化されたビジュアルプログラミング環境Noodlの紹介
miyp
 

Recently uploaded (8)

エンジニアのセルフブランディングと技術情報発信の重要性 テクニカルライターになろう 講演資料
エンジニアのセルフブランディングと技術情報発信の重要性 テクニカルライターになろう 講演資料エンジニアのセルフブランディングと技術情報発信の重要性 テクニカルライターになろう 講演資料
エンジニアのセルフブランディングと技術情報発信の重要性 テクニカルライターになろう 講演資料
 
人的資本経営のための地理情報インテリジェンス 作業パターン分析と心身状態把握に関する実証事例
人的資本経営のための地理情報インテリジェンス 作業パターン分析と心身状態把握に関する実証事例人的資本経営のための地理情報インテリジェンス 作業パターン分析と心身状態把握に関する実証事例
人的資本経営のための地理情報インテリジェンス 作業パターン分析と心身状態把握に関する実証事例
 
ビジュアルプログラミングIotLT17-オープンソース化されたビジュアルプログラミング環境Noodlの紹介
ビジュアルプログラミングIotLT17-オープンソース化されたビジュアルプログラミング環境Noodlの紹介ビジュアルプログラミングIotLT17-オープンソース化されたビジュアルプログラミング環境Noodlの紹介
ビジュアルプログラミングIotLT17-オープンソース化されたビジュアルプログラミング環境Noodlの紹介
 
本の感想共有会「データモデリングでドメインを駆動する」本が突きつける我々の課題について
本の感想共有会「データモデリングでドメインを駆動する」本が突きつける我々の課題について本の感想共有会「データモデリングでドメインを駆動する」本が突きつける我々の課題について
本の感想共有会「データモデリングでドメインを駆動する」本が突きつける我々の課題について
 
今さら聞けない人のためのDevOps超入門 OSC2024名古屋 セミナー資料
今さら聞けない人のためのDevOps超入門 OSC2024名古屋  セミナー資料今さら聞けない人のためのDevOps超入門 OSC2024名古屋  セミナー資料
今さら聞けない人のためのDevOps超入門 OSC2024名古屋 セミナー資料
 
【登壇資料】スタートアップCTO経験からキャリアについて再考する CTO・VPoEに聞く by DIGGLE CTO 水上
【登壇資料】スタートアップCTO経験からキャリアについて再考する  CTO・VPoEに聞く by DIGGLE CTO 水上【登壇資料】スタートアップCTO経験からキャリアについて再考する  CTO・VPoEに聞く by DIGGLE CTO 水上
【登壇資料】スタートアップCTO経験からキャリアについて再考する CTO・VPoEに聞く by DIGGLE CTO 水上
 
Linuxサーバー構築 学習のポイントと環境構築 OSC2024名古屋 セミナー資料
Linuxサーバー構築 学習のポイントと環境構築 OSC2024名古屋 セミナー資料Linuxサーバー構築 学習のポイントと環境構築 OSC2024名古屋 セミナー資料
Linuxサーバー構築 学習のポイントと環境構築 OSC2024名古屋 セミナー資料
 
Compute Units/Budget最適化 - Solana Developer Hub Online 6 #SolDevHub
Compute Units/Budget最適化 - Solana Developer Hub Online 6 #SolDevHubCompute Units/Budget最適化 - Solana Developer Hub Online 6 #SolDevHub
Compute Units/Budget最適化 - Solana Developer Hub Online 6 #SolDevHub
 

E2E test on Nuxt.js with SSR