Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
20分のフルテストを5分にした話
Search
HiroshiToriyabe
January 23, 2018
Technology
0
220
20分のフルテストを5分にした話
HiroshiToriyabe
January 23, 2018
Tweet
Share
More Decks by HiroshiToriyabe
See All by HiroshiToriyabe
PerlでJVMをつくろう
toricor
1
220
Other Decks in Technology
See All in Technology
退屈なことはDevinにやらせよう〜〜Devin APIを使ったVisual Regression Testの自動追加〜
kawamataryo
4
1.1k
生成AI時代に必要な価値ある意思決定を育てる「開発プロセス定義」を用いた中期戦略
kakehashi
PRO
1
250
【初心者向け】ローカルLLMの色々な動かし方まとめ
aratako
7
2.7k
「魔法少女まどか☆マギカ Magia Exedra」の必殺技演出を徹底解剖! -キャラクターの魅力を最大限にファンに届けるためのこだわり-
gree_tech
PRO
0
450
おやつは300円まで!の最適化を模索してみた
techtekt
PRO
0
260
PRDの正しい使い方 ~AI時代にも効く思考・対話・成長ツールとして~
techtekt
PRO
0
510
AI時代にPdMとPMMはどう連携すべきか / PdM–PMM-collaboration-in-AI-era
rakus_dev
0
260
大「個人開発サービス」時代に僕たちはどう生きるか
sotarok
15
7.4k
シークレット管理だけじゃない!HashiCorp Vault でデータ暗号化をしよう / Beyond Secret Management! Let's Encrypt Data with HashiCorp Vault
nnstt1
3
140
ヒューリスティック評価を用いたゲームQA実践事例
gree_tech
PRO
0
430
Language Update: Java
skrb
2
230
DuckDB-Wasmを使って ブラウザ上でRDBMSを動かす
hacusk
1
140
Featured
See All Featured
What's in a price? How to price your products and services
michaelherold
246
12k
Faster Mobile Websites
deanohume
309
31k
How GitHub (no longer) Works
holman
315
140k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4k
For a Future-Friendly Web
brad_frost
179
9.9k
How to Ace a Technical Interview
jacobian
279
23k
Designing for Performance
lara
610
69k
The Language of Interfaces
destraynor
160
25k
Code Reviewing Like a Champion
maltzj
525
40k
A better future with KSS
kneath
239
17k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Transcript
20分のフルテストを5分にした 話 鳥谷部 啓
自己紹介 - 鳥谷部 啓 (とりやべ ひろし Github: toricor) - 大学院では生物学を専攻して生き物のお世話の日々
- 新卒1年目エンジニア - 新卒同期から“Jenkinsおじさん”扱いを受ける
CI/CDしてますか?自動化してますか?一日何回デプロイできますか? - 継続的インテグレーション(Continuous Integration) - 頻繁にビルドしてテストを回して問題点を早期に検出する - 継続的デリバリー(Continuous Delivery) -
頻繁にデプロイして価値をユーザーに届ける ビルド テスト インスペクション デプロイ CI(CD)サーバ
CI/CDしてますか?自動化してますか?一日何回デプロイできますか? - 継続的インテグレーション(Continuous Integration) - 頻繁にビルドしてテストを回して問題点を早期に検出する - 継続的デリバリー(Continuous Delivery) -
頻繁にデプロイして価値をユーザーに届ける ビルド テスト インスペクション デプロイ CI(CD)サーバ 今日はここの話 ・サービスの成長とともにテストは増加し、実行時間も長くなるが、どう対処するか
目次 - フルテストを早く終わらせたい!実際に自分で導入した施策たち - マシンパワー増強 - Jenkins Pipelineの機能の利用 - テストケースの分散実行
要約: - 20分のテストを5分で済むようにした - 計算資源を追加することで高速化できるようにした
某プロジェクトではテストに20分強かかっていた 特にサーバサイドのテストファイル数が1000を超えており、時間がかかる。 テスト = フロントエンドのテスト + サーバサイドのテスト フロントテスト サーバサイドテスト テスト
強いマシンでテストが8分で終わるようになった 某プロジェクトのクラウド化によってDB用の強いサーバが空いたので、CIサーバに転用 した CPUのコア数が倍、メモリも 4倍になった フロントテスト サーバサイドテスト テスト やはり金の力か... エンジニアの数も多いのでテスト数は増加し、すぐに実行時間
9分台へ
CIといえばJenkins、高速化に使える機能があるぞ! - Travis CI? Circle CI? 知らない子ですね - Jenkins Pipeline
Pluginを使った - CIフローをgroovyのDSLを用いてコードとして記述 - Pipeline as Code - parallel関数を用いてフロントテストとサーバサイドのテ ストを同時に実行させるようにした - (sample) https://gist.github.com/toricor/00c399fdec4affd76d4c6774dbbe6bef
CIといえばJenkins、高速化に使える機能があるぞ! - Travis CI? Circle CI? 知らない子ですね - Jenkins Pipeline
Pluginを使った - CIフローをgroovyのDSLを用いてコードとして記述 - Pipeline as Code - parallel関数を用いてフロントテストとサーバサイドのテ ストを同時に実行させるようにした フルテストが8分から7分になった!! - (sample) https://gist.github.com/toricor/00c399fdec4affd76d4c6774dbbe6bef
テストを2台のサーバで分散実行させ、フルテストは5分で済むようになった - テストをn台で分担して実行して、あとで結果だけまとめればよいのでは? - サーバサイドのテストを分割した - Java系の人ならParallel Executer Pluginを使えばOKらしい -
PerlではApp::Ikarosがあるぞ http://yapcasia.org/2013/talk/show/767463b0-d8fd-11e2-971a-72936aeab6a4
テストを2台のサーバで分散実行させ、フルテストは5分で済むようになった - テストをn台で分担して実行して、あとで結果だけまとめればよいのでは? - サーバサイドのテストを分割した - Java系の人ならParallel Executer Pluginを使えばOKらしい -
PerlではApp::Ikarosがあるぞ - 使えるサーバが2台しかなかったので2台で - App::Ikarosが前回のテストごとの実行時間にもとづき、いい感じに振り分け - 結果としてテストの実行順がランダムになっていい感じ 最初20分(実は現在23分) → 8分 → 7分 → 5分 で済むようになった!!
Jenkins Stage View Pluginによる、CI各ステップにかかる時間の可視化 cloudbee社HPより CI改善施策がわかりやすく可視化されていくので良い
付録: テスト高速化手法あれこれ - テストしない - テストを並列実行する ex. carton exec prove
-j16 t/ - 不要なDB接続、外部API接続をmockする - テストのときだけインメモリDBを用いる - テストのときだけtmpfsにmysqlのデータをのせる - モジュールをまとめて事前に読み込んでおく ex. forkprove
まとめ - マシンパワーの増強 - Jenkins Pipelineの機能の利用 - テスト分散実行モジュールの利用 これらの施策によりテストを20分->5分へと高速化できた! 気楽にフルテストをぶん回そう!
Jenkinsはいいぞ https://medium.com/@ricardoespsanto/jenkins-is-dead-long-live-concourse-ce13f94e4975