SlideShare a Scribd company logo
1 of 33
Download to read offline
Copyright Drecom Co., Ltd. All Rights Reserved.
RSpec Performance
Turning
@sue445
Copyright Drecom Co., Ltd. All Rights Reserved.
自己紹介
sue445
● @drecom
● 社内ツール系
● 最近炎上PJに投入された
● コミュニティ
○ TDD BootCamp
○ 目黒.rb, 渋谷.rb, 新宿.rb
○ appengine ja night
● 【自称】サザエヴァンジェリスト
● 【他称】歩くJenkins、テストマニア
● 好きな言語はJava
Copyright Drecom Co., Ltd. All Rights Reserved.
去年の7月
https://twitter.com/sue445/statuses/226247880187449345
Copyright Drecom Co., Ltd. All Rights Reserved.
1年経ったので数えた
● Rails app x 7, gem x 4
● Total Line: 12654
● Line of Code: 5187
● Total Coverrage: 平均95.34%
● Code Coverrage: 平均89.09%
● テスト:計1355個/人
http://sue445.hatenablog.
com/entry/2013/07/01/154915
Copyright Drecom Co., Ltd. All Rights Reserved.
【宣伝】8/3(土) プリキュアハッカソン
http://connpass.com/event/2772/
Copyright Drecom Co., Ltd. All Rights Reserved.
Agenda
1. なぜパフォーマンスチューニングが必要
か
2. スローテストを見つける
3. スローテストをつぶす
Copyright Drecom Co., Ltd. All Rights Reserved.
なぜテストコードにもパフォーマンスチューニン
グが必要か?
● テストコードもプロダクトコードと同様に
資産なので、メンテナンスすべき
○ 1回しか動かないテストコードは書くだけ無駄
● テストが遅いとTDDのサイクルが乱れ
る
○ Red -> Green -> Refactoring
○ テストが遅いとストレスがマッハで死ぬ
Copyright Drecom Co., Ltd. All Rights Reserved.
テストコードは高速に実行できるべき
遅いテストコードは結局実行されません。
状況が逼迫していれば実行に時間がかか
るテストはテストスイートから削除されてし
まいます。高速なテストコードを書いてくだ
さい
(from. クリーンコード)
Copyright Drecom Co., Ltd. All Rights Reserved.
【番外】テストコードのリファクタリング
● テストコードをリファクタリングして説明
的にすることで分かりやすくなる
○ setupと実行部を分けるだけでもだいぶ違う
● プロダクトコードと同様に資産なので(ry
● 「テストコード リファクタリング」でggrks
Copyright Drecom Co., Ltd. All Rights Reserved.
もしリファクタリングしな
かったら
Copyright Drecom Co., Ltd. All Rights Reserved.
rm -rf spec/
Copyright Drecom Co., Ltd. All Rights Reserved.
理由
● 某PJにアサインされた時にテストがメンテされ
て無くて全然動かない
○ 最終更新が半年前・・・
● 既存のテストを残したままでリファクタリングしよ
うと思ったけど断念
○ いろいろ初期化が重すぎてrspec起動だけで
2〜3分かかる(spring使っても数10秒くらい)
○ ストレスがマッハで1時間で断念
● 1から全部書きなおした方が早いと判断
○ 一応MergeRequestは通りましたw
Copyright Drecom Co., Ltd. All Rights Reserved.
Copyright Drecom Co., Ltd. All Rights Reserved.
2. スローテストを見つける
● rspec --profileでスローテストのワース
ト10を抽出
○ rspec 2.13.0以降なら --profile 5み
たいに件数指定できる
Copyright Drecom Co., Ltd. All Rights Reserved.
通常のテスト結果の下に出る
Copyright Drecom Co., Ltd. All Rights Reserved.
コンソール -> CSV -> Jenkinsでプロット
Jenkinsにスローテストのグラフを表示する
http://sue445.hatenablog.com/entry/2013/03/17/015836
Total
worst 5
Copyright Drecom Co., Ltd. All Rights Reserved.
3. スローテストをつぶす
Copyright Drecom Co., Ltd. All Rights Reserved.
Case1. テストの構造を見直す
● 1テストケースで1つだけテストする
○ プロダクトコードだけでなくテストコードもSRP
を心がける
■ SRP = Single Responsibility Principle =
単一責任の原則
○ 1つのitの中で複数のテストを実行しない
○ トータルの時間は変わらないけどit単体での
実行時間は短縮される
■ it単位でテストを実行する方法は後述
Copyright Drecom Co., Ltd. All Rights Reserved.
Case2. 外部API系
● Twitter APIとかFacebook APIとか
● webmockやmemoistで呼び出し回数を
なくす or 減らす
Copyright Drecom Co., Ltd. All Rights Reserved.
webmock
URLとパラメータに対するレスポンスを自由に設定
できる
Copyright Drecom Co., Ltd. All Rights Reserved.
memoist
同一引数に対するメソッドの戻り値を
キャッシュする
Copyright Drecom Co., Ltd. All Rights Reserved.
Case 3. DB系
● 毎回必要最低限のデータだけを用意す
る
○ データが多いとそれだけノイズになりメンテし
づらくなる
○ config.fixture_path = "#{Rails.root}
/db/seeds" とか○ねばいいと思うよ
Copyright Drecom Co., Ltd. All Rights Reserved.
Case 3. DB系
DBを呼ぶ部分をmockに置き換えた方が
いい?
● mockの多用は実装依存のコードになるりリファクタ
リング時にテストがすぐに落ちるためため個人的に
はおすすめしない
○ 前提条件をつくるためのデータのセットアップが
大変な場合にstub使うのはアリ(Controllerとか)
● なるべく本番に近い形でやった方がいいのでよっ
ぽど遅い場合以外は普通にDB叩いていいと思う
● testは通るのにdevelopmentやproductionで落ち
るのが一番面倒
Copyright Drecom Co., Ltd. All Rights Reserved.
Case 4. category test
● 時間のかかるテストは予めマーキング
しておく
○ 普段はそこだけテストを除外しつつ、Jenkins
とかではテストさせる
● --tag
○ https://www.relishapp.com/rspec/rspec-
core/v/2-4/docs/command-line/tag-option
Copyright Drecom Co., Ltd. All Rights Reserved.
4. more than faster !
Copyright Drecom Co., Ltd. All Rights Reserved.
rspec --line-number
● 任意の行に対してテストを走らせる
○ 行によって it, describe, context 単位で実行で
きる
○ JavaでいうところのQuick JUnit的なもの
○ ただしQuick Junitに比べたら若干違和感ある
● 手動で行番号設定するのは面倒なのでだいた
いエディタと連携する
○ vim: RubyとvimでQuick JUnit風にテスト実行
○ Emacs: できるよ!(by emacser)
○ RubyMine: 標準サポート
Copyright Drecom Co., Ltd. All Rights Reserved.
preloader
● rubyを予め起動しておいてテストの実
行を早くする仕組
● ruby 2.0で起動が早くなったのでいらな
いんじゃないか説
Copyright Drecom Co., Ltd. All Rights Reserved.
preloader比較
● spork
○ railsじゃなくても使える
○ gem作る時はこれ一択?
● zeus
○ railsだけ
○ 使ったことないけど、よくゾンビになるという
噂を聞くw
● spring
○ railsだけ
○ 爆速なんだけどfactoryの更新を(デフォルト
で?)リロードしてくれないのが難点
Copyright Drecom Co., Ltd. All Rights Reserved.
guard
● ファイルに更新があったらテストを実行
するgem
● テストが通ったら全部テスト実行してく
れる
● guard-shellと連携することで、RDocの
編集をほぼリアルタイムで確認できる
○ ファイル保存時にrdoc生成
○ ブラウザのオートリロード
Copyright Drecom Co., Ltd. All Rights Reserved.
guardであった悲しい話
● Twitter APIを使ったとあるアプリで
guardを入れた
● ファイル保存時にテスト実行
● Twitter APIのRate Limitを一瞬でオー
バー
● 規制解除されるまでテストが全部落ち
る
● それ以来テストでguardは使ってないw
Copyright Drecom Co., Ltd. All Rights Reserved.
結論
Copyright Drecom Co., Ltd. All Rights Reserved.
結論
レベルを上げて物理で殴
ればいい(真理)
Copyright Drecom Co., Ltd. All Rights Reserved.
結論
● 小手先のチューニングするよりもハイス
ペックマシン使った方が楽
● ハイスペックなJenkinsサーバ用意して
そこでテストする
○ ほとんどの場合において人間のコスト
>>>機械のコスト
○ fioに乗っければbundle installやDBのテスト
も一瞬で終わりそうw
○ 時間を金で買う時代

More Related Content

What's hot

プリキュアのRuby実装の紹介 #RubyHiroba
プリキュアのRuby実装の紹介 #RubyHirobaプリキュアのRuby実装の紹介 #RubyHiroba
プリキュアのRuby実装の紹介 #RubyHirobaGo Sueyoshi (a.k.a sue445)
 
Elixir-Conf-Japan-2017-session-ohr486
Elixir-Conf-Japan-2017-session-ohr486Elixir-Conf-Japan-2017-session-ohr486
Elixir-Conf-Japan-2017-session-ohr486Tsunenori Oohara
 
こんな辛いテストはいやだ
こんな辛いテストはいやだ こんな辛いテストはいやだ
こんな辛いテストはいやだ Takuya Mikami
 
Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話Tokoroten Nakayama
 
JavaのテストGroovyでいいのではないかという話
JavaのテストGroovyでいいのではないかという話JavaのテストGroovyでいいのではないかという話
JavaのテストGroovyでいいのではないかという話disc99_
 
Flutterで単体テストを行う方法とGitHub Actionsを使った自動化
Flutterで単体テストを行う方法とGitHub Actionsを使った自動化Flutterで単体テストを行う方法とGitHub Actionsを使った自動化
Flutterで単体テストを行う方法とGitHub Actionsを使った自動化Shinnosuke Tokuda
 
GitとCIとかチャットとかをオンプレで運用する話
GitとCIとかチャットとかをオンプレで運用する話GitとCIとかチャットとかをオンプレで運用する話
GitとCIとかチャットとかをオンプレで運用する話mdome
 
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1Y Watanabe
 
Webエンジニアがスタートダッシュをキメるためのローカル開発環境の勘所
Webエンジニアがスタートダッシュをキメるためのローカル開発環境の勘所Webエンジニアがスタートダッシュをキメるためのローカル開発環境の勘所
Webエンジニアがスタートダッシュをキメるためのローカル開発環境の勘所Y Watanabe
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Taku Miyakawa
 
Guide to GraalVM (Oracle Groundbreakers APAC 2019 Tour in Tokyo)
Guide to GraalVM (Oracle Groundbreakers APAC 2019 Tour in Tokyo)Guide to GraalVM (Oracle Groundbreakers APAC 2019 Tour in Tokyo)
Guide to GraalVM (Oracle Groundbreakers APAC 2019 Tour in Tokyo)Koichi Sakata
 
ソーシャルアプリを分析してみた
ソーシャルアプリを分析してみたソーシャルアプリを分析してみた
ソーシャルアプリを分析してみたDrecom Co., Ltd.
 
やさしいGitの内部構造 - yapcasia2013
やさしいGitの内部構造 - yapcasia2013やさしいGitの内部構造 - yapcasia2013
やさしいGitの内部構造 - yapcasia2013DQNEO
 
2014年を振り返る 今年の技術トレンドとDockerについて
2014年を振り返る 今年の技術トレンドとDockerについて2014年を振り返る 今年の技術トレンドとDockerについて
2014年を振り返る 今年の技術トレンドとDockerについてMasahito Zembutsu
 
Guide to GraalVM (JJUG CCC 2019 Fall)
Guide to GraalVM (JJUG CCC 2019 Fall)Guide to GraalVM (JJUG CCC 2019 Fall)
Guide to GraalVM (JJUG CCC 2019 Fall)Koichi Sakata
 
表参道.rb #1 Ruby Gold 2.1 に合格した話
表参道.rb #1 Ruby Gold 2.1 に合格した話表参道.rb #1 Ruby Gold 2.1 に合格した話
表参道.rb #1 Ruby Gold 2.1 に合格した話Yoshiaki Yoshida
 
Bicep + VS Code で楽々Azure Deploy
Bicep + VS Code で楽々Azure DeployBicep + VS Code で楽々Azure Deploy
Bicep + VS Code で楽々Azure DeployTakekazu Omi
 

What's hot (20)

プリキュアのRuby実装の紹介 #RubyHiroba
プリキュアのRuby実装の紹介 #RubyHirobaプリキュアのRuby実装の紹介 #RubyHiroba
プリキュアのRuby実装の紹介 #RubyHiroba
 
Elixir-Conf-Japan-2017-session-ohr486
Elixir-Conf-Japan-2017-session-ohr486Elixir-Conf-Japan-2017-session-ohr486
Elixir-Conf-Japan-2017-session-ohr486
 
こんな辛いテストはいやだ
こんな辛いテストはいやだ こんな辛いテストはいやだ
こんな辛いテストはいやだ
 
Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話
 
地獄Spec
地獄Spec地獄Spec
地獄Spec
 
JavaのテストGroovyでいいのではないかという話
JavaのテストGroovyでいいのではないかという話JavaのテストGroovyでいいのではないかという話
JavaのテストGroovyでいいのではないかという話
 
Flutterで単体テストを行う方法とGitHub Actionsを使った自動化
Flutterで単体テストを行う方法とGitHub Actionsを使った自動化Flutterで単体テストを行う方法とGitHub Actionsを使った自動化
Flutterで単体テストを行う方法とGitHub Actionsを使った自動化
 
GitとCIとかチャットとかをオンプレで運用する話
GitとCIとかチャットとかをオンプレで運用する話GitとCIとかチャットとかをオンプレで運用する話
GitとCIとかチャットとかをオンプレで運用する話
 
C#で速度を極めるいろは
C#で速度を極めるいろはC#で速度を極めるいろは
C#で速度を極めるいろは
 
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
 
Webエンジニアがスタートダッシュをキメるためのローカル開発環境の勘所
Webエンジニアがスタートダッシュをキメるためのローカル開発環境の勘所Webエンジニアがスタートダッシュをキメるためのローカル開発環境の勘所
Webエンジニアがスタートダッシュをキメるためのローカル開発環境の勘所
 
Gradle handson
Gradle handsonGradle handson
Gradle handson
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
 
Guide to GraalVM (Oracle Groundbreakers APAC 2019 Tour in Tokyo)
Guide to GraalVM (Oracle Groundbreakers APAC 2019 Tour in Tokyo)Guide to GraalVM (Oracle Groundbreakers APAC 2019 Tour in Tokyo)
Guide to GraalVM (Oracle Groundbreakers APAC 2019 Tour in Tokyo)
 
ソーシャルアプリを分析してみた
ソーシャルアプリを分析してみたソーシャルアプリを分析してみた
ソーシャルアプリを分析してみた
 
やさしいGitの内部構造 - yapcasia2013
やさしいGitの内部構造 - yapcasia2013やさしいGitの内部構造 - yapcasia2013
やさしいGitの内部構造 - yapcasia2013
 
2014年を振り返る 今年の技術トレンドとDockerについて
2014年を振り返る 今年の技術トレンドとDockerについて2014年を振り返る 今年の技術トレンドとDockerについて
2014年を振り返る 今年の技術トレンドとDockerについて
 
Guide to GraalVM (JJUG CCC 2019 Fall)
Guide to GraalVM (JJUG CCC 2019 Fall)Guide to GraalVM (JJUG CCC 2019 Fall)
Guide to GraalVM (JJUG CCC 2019 Fall)
 
表参道.rb #1 Ruby Gold 2.1 に合格した話
表参道.rb #1 Ruby Gold 2.1 に合格した話表参道.rb #1 Ruby Gold 2.1 に合格した話
表参道.rb #1 Ruby Gold 2.1 に合格した話
 
Bicep + VS Code で楽々Azure Deploy
Bicep + VS Code で楽々Azure DeployBicep + VS Code で楽々Azure Deploy
Bicep + VS Code で楽々Azure Deploy
 

Viewers also liked

やさしいGemパッチの作り方
やさしいGemパッチの作り方やさしいGemパッチの作り方
やさしいGemパッチの作り方Maki Toshio
 
Test::Kantan - Perl and Testing
Test::Kantan - Perl and TestingTest::Kantan - Perl and Testing
Test::Kantan - Perl and TestingTokuhiro Matsuno
 
How to Begin to Develop Ruby Core
How to Begin to Develop Ruby CoreHow to Begin to Develop Ruby Core
How to Begin to Develop Ruby CoreHiroshi SHIBATA
 
Quine・難解プログラミングについて
Quine・難解プログラミングについてQuine・難解プログラミングについて
Quine・難解プログラミングについてmametter
 
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 RubyをコンパイルしようCookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 RubyをコンパイルしようKoichi Sasada
 
Esoteric, Obfuscated, Artistic Programming in Ruby
Esoteric, Obfuscated, Artistic Programming in RubyEsoteric, Obfuscated, Artistic Programming in Ruby
Esoteric, Obfuscated, Artistic Programming in Rubymametter
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるpospome
 
Perfect Norikra 2nd Season
Perfect Norikra 2nd SeasonPerfect Norikra 2nd Season
Perfect Norikra 2nd SeasonSATOSHI TAGOMORI
 
Ruby and Distributed Storage Systems
Ruby and Distributed Storage SystemsRuby and Distributed Storage Systems
Ruby and Distributed Storage SystemsSATOSHI TAGOMORI
 

Viewers also liked (9)

やさしいGemパッチの作り方
やさしいGemパッチの作り方やさしいGemパッチの作り方
やさしいGemパッチの作り方
 
Test::Kantan - Perl and Testing
Test::Kantan - Perl and TestingTest::Kantan - Perl and Testing
Test::Kantan - Perl and Testing
 
How to Begin to Develop Ruby Core
How to Begin to Develop Ruby CoreHow to Begin to Develop Ruby Core
How to Begin to Develop Ruby Core
 
Quine・難解プログラミングについて
Quine・難解プログラミングについてQuine・難解プログラミングについて
Quine・難解プログラミングについて
 
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 RubyをコンパイルしようCookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
 
Esoteric, Obfuscated, Artistic Programming in Ruby
Esoteric, Obfuscated, Artistic Programming in RubyEsoteric, Obfuscated, Artistic Programming in Ruby
Esoteric, Obfuscated, Artistic Programming in Ruby
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
 
Perfect Norikra 2nd Season
Perfect Norikra 2nd SeasonPerfect Norikra 2nd Season
Perfect Norikra 2nd Season
 
Ruby and Distributed Storage Systems
Ruby and Distributed Storage SystemsRuby and Distributed Storage Systems
Ruby and Distributed Storage Systems
 

Similar to RSpec Performance Turning

実録!Railsのはまりポイント10選
実録!Railsのはまりポイント10選実録!Railsのはまりポイント10選
実録!Railsのはまりポイント10選Drecom Co., Ltd.
 
Riverpodでテストを書こう
Riverpodでテストを書こうRiverpodでテストを書こう
Riverpodでテストを書こうShinnosuke Tokuda
 
Ahead-of-Time Compilation with JDK 9 [Java Day Tokyo 2017 D1-A1]
Ahead-of-Time Compilation with JDK 9 [Java Day Tokyo 2017 D1-A1]Ahead-of-Time Compilation with JDK 9 [Java Day Tokyo 2017 D1-A1]
Ahead-of-Time Compilation with JDK 9 [Java Day Tokyo 2017 D1-A1]David Buck
 
Logicadの秒間16万リクエストをさばく広告入札システムにおける、gRPCの活用事例
Logicadの秒間16万リクエストをさばく広告入札システムにおける、gRPCの活用事例Logicadの秒間16万リクエストをさばく広告入札システムにおける、gRPCの活用事例
Logicadの秒間16万リクエストをさばく広告入札システムにおける、gRPCの活用事例Hironobu Isoda
 
itamae + Serverspecで テスト駆動インフラやってみた #shibuyarb
itamae + Serverspecで テスト駆動インフラやってみた #shibuyarbitamae + Serverspecで テスト駆動インフラやってみた #shibuyarb
itamae + Serverspecで テスト駆動インフラやってみた #shibuyarbGo Sueyoshi (a.k.a sue445)
 
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜	【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜 虎の穴 開発室
 
Test-Driven Development for [Embedded] C by James Grenning at Agile Japan 2013
Test-Driven Development for [Embedded] C by James Grenning at Agile Japan 2013Test-Driven Development for [Embedded] C by James Grenning at Agile Japan 2013
Test-Driven Development for [Embedded] C by James Grenning at Agile Japan 2013Yohei Onishi
 
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]David Buck
 
Batch Reinforcement Learning
Batch Reinforcement LearningBatch Reinforcement Learning
Batch Reinforcement LearningTakuma Oda
 
Rocroにおけるgcp活用事例
Rocroにおけるgcp活用事例Rocroにおけるgcp活用事例
Rocroにおけるgcp活用事例Kishin Yagami
 
アドテク×Scala×パフォーマンスチューニング
アドテク×Scala×パフォーマンスチューニングアドテク×Scala×パフォーマンスチューニング
アドテク×Scala×パフォーマンスチューニングYosuke Mizutani
 
20120421中国gtug
20120421中国gtug20120421中国gtug
20120421中国gtugYusuke Sato
 
Goji とレイヤ化アーキテクチャ
Goji とレイヤ化アーキテクチャGoji とレイヤ化アーキテクチャ
Goji とレイヤ化アーキテクチャShiroyagi Corporation
 
Behat Driven Development
Behat Driven DevelopmentBehat Driven Development
Behat Driven DevelopmentRyo Tomidokoro
 

Similar to RSpec Performance Turning (20)

ドリコムJenkins勉強会資料
ドリコムJenkins勉強会資料ドリコムJenkins勉強会資料
ドリコムJenkins勉強会資料
 
実録!Railsのはまりポイント10選
実録!Railsのはまりポイント10選実録!Railsのはまりポイント10選
実録!Railsのはまりポイント10選
 
Riverpodでテストを書こう
Riverpodでテストを書こうRiverpodでテストを書こう
Riverpodでテストを書こう
 
Ahead-of-Time Compilation with JDK 9 [Java Day Tokyo 2017 D1-A1]
Ahead-of-Time Compilation with JDK 9 [Java Day Tokyo 2017 D1-A1]Ahead-of-Time Compilation with JDK 9 [Java Day Tokyo 2017 D1-A1]
Ahead-of-Time Compilation with JDK 9 [Java Day Tokyo 2017 D1-A1]
 
Logicadの秒間16万リクエストをさばく広告入札システムにおける、gRPCの活用事例
Logicadの秒間16万リクエストをさばく広告入札システムにおける、gRPCの活用事例Logicadの秒間16万リクエストをさばく広告入札システムにおける、gRPCの活用事例
Logicadの秒間16万リクエストをさばく広告入札システムにおける、gRPCの活用事例
 
itamae + Serverspecで テスト駆動インフラやってみた #shibuyarb
itamae + Serverspecで テスト駆動インフラやってみた #shibuyarbitamae + Serverspecで テスト駆動インフラやってみた #shibuyarb
itamae + Serverspecで テスト駆動インフラやってみた #shibuyarb
 
RgGen ご紹介
RgGen ご紹介RgGen ご紹介
RgGen ご紹介
 
社内テストファースト勉強会
社内テストファースト勉強会社内テストファースト勉強会
社内テストファースト勉強会
 
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜	【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜
 
Ad stirの裏側
Ad stirの裏側Ad stirの裏側
Ad stirの裏側
 
Test-Driven Development for [Embedded] C by James Grenning at Agile Japan 2013
Test-Driven Development for [Embedded] C by James Grenning at Agile Japan 2013Test-Driven Development for [Embedded] C by James Grenning at Agile Japan 2013
Test-Driven Development for [Embedded] C by James Grenning at Agile Japan 2013
 
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
 
Batch Reinforcement Learning
Batch Reinforcement LearningBatch Reinforcement Learning
Batch Reinforcement Learning
 
Rocroにおけるgcp活用事例
Rocroにおけるgcp活用事例Rocroにおけるgcp活用事例
Rocroにおけるgcp活用事例
 
アドテク×Scala×パフォーマンスチューニング
アドテク×Scala×パフォーマンスチューニングアドテク×Scala×パフォーマンスチューニング
アドテク×Scala×パフォーマンスチューニング
 
快適・簡単・安心なアプリE2Eテストの実行環境 #stac2017
快適・簡単・安心なアプリE2Eテストの実行環境 #stac2017快適・簡単・安心なアプリE2Eテストの実行環境 #stac2017
快適・簡単・安心なアプリE2Eテストの実行環境 #stac2017
 
20120421中国gtug
20120421中国gtug20120421中国gtug
20120421中国gtug
 
kyotovim#1
kyotovim#1kyotovim#1
kyotovim#1
 
Goji とレイヤ化アーキテクチャ
Goji とレイヤ化アーキテクチャGoji とレイヤ化アーキテクチャ
Goji とレイヤ化アーキテクチャ
 
Behat Driven Development
Behat Driven DevelopmentBehat Driven Development
Behat Driven Development
 

More from Go Sueyoshi (a.k.a sue445)

gemの複数バージョンカジュアルテスト #shibuyarb
gemの複数バージョンカジュアルテスト #shibuyarbgemの複数バージョンカジュアルテスト #shibuyarb
gemの複数バージョンカジュアルテスト #shibuyarbGo Sueyoshi (a.k.a sue445)
 
プリキュアのRuby実装の紹介 (2015 ver) #MeguroStartup
プリキュアのRuby実装の紹介 (2015 ver)  #MeguroStartupプリキュアのRuby実装の紹介 (2015 ver)  #MeguroStartup
プリキュアのRuby実装の紹介 (2015 ver) #MeguroStartupGo Sueyoshi (a.k.a sue445)
 
サザエ実況を支える技術 #sst_history
サザエ実況を支える技術 #sst_historyサザエ実況を支える技術 #sst_history
サザエ実況を支える技術 #sst_historyGo Sueyoshi (a.k.a sue445)
 
Paraductをエクストリームリリースします #428rk01
Paraductをエクストリームリリースします #428rk01Paraductをエクストリームリリースします #428rk01
Paraductをエクストリームリリースします #428rk01Go Sueyoshi (a.k.a sue445)
 
GemoireというYARDホスティングアプリを作った #shibuyarb
GemoireというYARDホスティングアプリを作った #shibuyarbGemoireというYARDホスティングアプリを作った #shibuyarb
GemoireというYARDホスティングアプリを作った #shibuyarbGo Sueyoshi (a.k.a sue445)
 
Githubエコシステムを活用したイマドキの趣味開発
Githubエコシステムを活用したイマドキの趣味開発Githubエコシステムを活用したイマドキの趣味開発
Githubエコシステムを活用したイマドキの趣味開発Go Sueyoshi (a.k.a sue445)
 
プリキュアハッカソン2 参加者アンケート集計結果 #cure_hack
プリキュアハッカソン2 参加者アンケート集計結果 #cure_hackプリキュアハッカソン2 参加者アンケート集計結果 #cure_hack
プリキュアハッカソン2 参加者アンケート集計結果 #cure_hackGo Sueyoshi (a.k.a sue445)
 

More from Go Sueyoshi (a.k.a sue445) (14)

gemの複数バージョンカジュアルテスト #shibuyarb
gemの複数バージョンカジュアルテスト #shibuyarbgemの複数バージョンカジュアルテスト #shibuyarb
gemの複数バージョンカジュアルテスト #shibuyarb
 
プリキュアのRuby実装の紹介 (2015 ver) #MeguroStartup
プリキュアのRuby実装の紹介 (2015 ver)  #MeguroStartupプリキュアのRuby実装の紹介 (2015 ver)  #MeguroStartup
プリキュアのRuby実装の紹介 (2015 ver) #MeguroStartup
 
サザエ実況を支える技術 #sst_history
サザエ実況を支える技術 #sst_historyサザエ実況を支える技術 #sst_history
サザエ実況を支える技術 #sst_history
 
プリキュアのRuby実装の紹介 #tqrk08
プリキュアのRuby実装の紹介 #tqrk08プリキュアのRuby実装の紹介 #tqrk08
プリキュアのRuby実装の紹介 #tqrk08
 
Paraductをエクストリームリリースします #428rk01
Paraductをエクストリームリリースします #428rk01Paraductをエクストリームリリースします #428rk01
Paraductをエクストリームリリースします #428rk01
 
GemoireというYARDホスティングアプリを作った #shibuyarb
GemoireというYARDホスティングアプリを作った #shibuyarbGemoireというYARDホスティングアプリを作った #shibuyarb
GemoireというYARDホスティングアプリを作った #shibuyarb
 
Githubエコシステムを活用したイマドキの趣味開発
Githubエコシステムを活用したイマドキの趣味開発Githubエコシステムを活用したイマドキの趣味開発
Githubエコシステムを活用したイマドキの趣味開発
 
プリキュアハッカソン2 参加者アンケート集計結果 #cure_hack
プリキュアハッカソン2 参加者アンケート集計結果 #cure_hackプリキュアハッカソン2 参加者アンケート集計結果 #cure_hack
プリキュアハッカソン2 参加者アンケート集計結果 #cure_hack
 
JavaScript TDD紹介 #agilesamurai
JavaScript TDD紹介 #agilesamuraiJavaScript TDD紹介 #agilesamurai
JavaScript TDD紹介 #agilesamurai
 
勉強会を始めるまで #java_ja
勉強会を始めるまで #java_ja勉強会を始めるまで #java_ja
勉強会を始めるまで #java_ja
 
アニメ実況実践入門
アニメ実況実践入門アニメ実況実践入門
アニメ実況実践入門
 
Sue445 Style TDD #atest_hack
Sue445 Style TDD #atest_hackSue445 Style TDD #atest_hack
Sue445 Style TDD #atest_hack
 
AZusaar!でのappengine活用事例 #ajn19
AZusaar!でのappengine活用事例 #ajn19AZusaar!でのappengine活用事例 #ajn19
AZusaar!でのappengine活用事例 #ajn19
 
appengine活用事例資料@TDDBC札幌2.1
appengine活用事例資料@TDDBC札幌2.1appengine活用事例資料@TDDBC札幌2.1
appengine活用事例資料@TDDBC札幌2.1
 

Recently uploaded

スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 

Recently uploaded (9)

スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 

RSpec Performance Turning

  • 1. Copyright Drecom Co., Ltd. All Rights Reserved. RSpec Performance Turning @sue445
  • 2. Copyright Drecom Co., Ltd. All Rights Reserved. 自己紹介 sue445 ● @drecom ● 社内ツール系 ● 最近炎上PJに投入された ● コミュニティ ○ TDD BootCamp ○ 目黒.rb, 渋谷.rb, 新宿.rb ○ appengine ja night ● 【自称】サザエヴァンジェリスト ● 【他称】歩くJenkins、テストマニア ● 好きな言語はJava
  • 3. Copyright Drecom Co., Ltd. All Rights Reserved. 去年の7月 https://twitter.com/sue445/statuses/226247880187449345
  • 4. Copyright Drecom Co., Ltd. All Rights Reserved. 1年経ったので数えた ● Rails app x 7, gem x 4 ● Total Line: 12654 ● Line of Code: 5187 ● Total Coverrage: 平均95.34% ● Code Coverrage: 平均89.09% ● テスト:計1355個/人 http://sue445.hatenablog. com/entry/2013/07/01/154915
  • 5. Copyright Drecom Co., Ltd. All Rights Reserved. 【宣伝】8/3(土) プリキュアハッカソン http://connpass.com/event/2772/
  • 6. Copyright Drecom Co., Ltd. All Rights Reserved. Agenda 1. なぜパフォーマンスチューニングが必要 か 2. スローテストを見つける 3. スローテストをつぶす
  • 7. Copyright Drecom Co., Ltd. All Rights Reserved. なぜテストコードにもパフォーマンスチューニン グが必要か? ● テストコードもプロダクトコードと同様に 資産なので、メンテナンスすべき ○ 1回しか動かないテストコードは書くだけ無駄 ● テストが遅いとTDDのサイクルが乱れ る ○ Red -> Green -> Refactoring ○ テストが遅いとストレスがマッハで死ぬ
  • 8. Copyright Drecom Co., Ltd. All Rights Reserved. テストコードは高速に実行できるべき 遅いテストコードは結局実行されません。 状況が逼迫していれば実行に時間がかか るテストはテストスイートから削除されてし まいます。高速なテストコードを書いてくだ さい (from. クリーンコード)
  • 9. Copyright Drecom Co., Ltd. All Rights Reserved. 【番外】テストコードのリファクタリング ● テストコードをリファクタリングして説明 的にすることで分かりやすくなる ○ setupと実行部を分けるだけでもだいぶ違う ● プロダクトコードと同様に資産なので(ry ● 「テストコード リファクタリング」でggrks
  • 10. Copyright Drecom Co., Ltd. All Rights Reserved. もしリファクタリングしな かったら
  • 11. Copyright Drecom Co., Ltd. All Rights Reserved. rm -rf spec/
  • 12. Copyright Drecom Co., Ltd. All Rights Reserved. 理由 ● 某PJにアサインされた時にテストがメンテされ て無くて全然動かない ○ 最終更新が半年前・・・ ● 既存のテストを残したままでリファクタリングしよ うと思ったけど断念 ○ いろいろ初期化が重すぎてrspec起動だけで 2〜3分かかる(spring使っても数10秒くらい) ○ ストレスがマッハで1時間で断念 ● 1から全部書きなおした方が早いと判断 ○ 一応MergeRequestは通りましたw
  • 13. Copyright Drecom Co., Ltd. All Rights Reserved.
  • 14. Copyright Drecom Co., Ltd. All Rights Reserved. 2. スローテストを見つける ● rspec --profileでスローテストのワース ト10を抽出 ○ rspec 2.13.0以降なら --profile 5み たいに件数指定できる
  • 15. Copyright Drecom Co., Ltd. All Rights Reserved. 通常のテスト結果の下に出る
  • 16. Copyright Drecom Co., Ltd. All Rights Reserved. コンソール -> CSV -> Jenkinsでプロット Jenkinsにスローテストのグラフを表示する http://sue445.hatenablog.com/entry/2013/03/17/015836 Total worst 5
  • 17. Copyright Drecom Co., Ltd. All Rights Reserved. 3. スローテストをつぶす
  • 18. Copyright Drecom Co., Ltd. All Rights Reserved. Case1. テストの構造を見直す ● 1テストケースで1つだけテストする ○ プロダクトコードだけでなくテストコードもSRP を心がける ■ SRP = Single Responsibility Principle = 単一責任の原則 ○ 1つのitの中で複数のテストを実行しない ○ トータルの時間は変わらないけどit単体での 実行時間は短縮される ■ it単位でテストを実行する方法は後述
  • 19. Copyright Drecom Co., Ltd. All Rights Reserved. Case2. 外部API系 ● Twitter APIとかFacebook APIとか ● webmockやmemoistで呼び出し回数を なくす or 減らす
  • 20. Copyright Drecom Co., Ltd. All Rights Reserved. webmock URLとパラメータに対するレスポンスを自由に設定 できる
  • 21. Copyright Drecom Co., Ltd. All Rights Reserved. memoist 同一引数に対するメソッドの戻り値を キャッシュする
  • 22. Copyright Drecom Co., Ltd. All Rights Reserved. Case 3. DB系 ● 毎回必要最低限のデータだけを用意す る ○ データが多いとそれだけノイズになりメンテし づらくなる ○ config.fixture_path = "#{Rails.root} /db/seeds" とか○ねばいいと思うよ
  • 23. Copyright Drecom Co., Ltd. All Rights Reserved. Case 3. DB系 DBを呼ぶ部分をmockに置き換えた方が いい? ● mockの多用は実装依存のコードになるりリファクタ リング時にテストがすぐに落ちるためため個人的に はおすすめしない ○ 前提条件をつくるためのデータのセットアップが 大変な場合にstub使うのはアリ(Controllerとか) ● なるべく本番に近い形でやった方がいいのでよっ ぽど遅い場合以外は普通にDB叩いていいと思う ● testは通るのにdevelopmentやproductionで落ち るのが一番面倒
  • 24. Copyright Drecom Co., Ltd. All Rights Reserved. Case 4. category test ● 時間のかかるテストは予めマーキング しておく ○ 普段はそこだけテストを除外しつつ、Jenkins とかではテストさせる ● --tag ○ https://www.relishapp.com/rspec/rspec- core/v/2-4/docs/command-line/tag-option
  • 25. Copyright Drecom Co., Ltd. All Rights Reserved. 4. more than faster !
  • 26. Copyright Drecom Co., Ltd. All Rights Reserved. rspec --line-number ● 任意の行に対してテストを走らせる ○ 行によって it, describe, context 単位で実行で きる ○ JavaでいうところのQuick JUnit的なもの ○ ただしQuick Junitに比べたら若干違和感ある ● 手動で行番号設定するのは面倒なのでだいた いエディタと連携する ○ vim: RubyとvimでQuick JUnit風にテスト実行 ○ Emacs: できるよ!(by emacser) ○ RubyMine: 標準サポート
  • 27. Copyright Drecom Co., Ltd. All Rights Reserved. preloader ● rubyを予め起動しておいてテストの実 行を早くする仕組 ● ruby 2.0で起動が早くなったのでいらな いんじゃないか説
  • 28. Copyright Drecom Co., Ltd. All Rights Reserved. preloader比較 ● spork ○ railsじゃなくても使える ○ gem作る時はこれ一択? ● zeus ○ railsだけ ○ 使ったことないけど、よくゾンビになるという 噂を聞くw ● spring ○ railsだけ ○ 爆速なんだけどfactoryの更新を(デフォルト で?)リロードしてくれないのが難点
  • 29. Copyright Drecom Co., Ltd. All Rights Reserved. guard ● ファイルに更新があったらテストを実行 するgem ● テストが通ったら全部テスト実行してく れる ● guard-shellと連携することで、RDocの 編集をほぼリアルタイムで確認できる ○ ファイル保存時にrdoc生成 ○ ブラウザのオートリロード
  • 30. Copyright Drecom Co., Ltd. All Rights Reserved. guardであった悲しい話 ● Twitter APIを使ったとあるアプリで guardを入れた ● ファイル保存時にテスト実行 ● Twitter APIのRate Limitを一瞬でオー バー ● 規制解除されるまでテストが全部落ち る ● それ以来テストでguardは使ってないw
  • 31. Copyright Drecom Co., Ltd. All Rights Reserved. 結論
  • 32. Copyright Drecom Co., Ltd. All Rights Reserved. 結論 レベルを上げて物理で殴 ればいい(真理)
  • 33. Copyright Drecom Co., Ltd. All Rights Reserved. 結論 ● 小手先のチューニングするよりもハイス ペックマシン使った方が楽 ● ハイスペックなJenkinsサーバ用意して そこでテストする ○ ほとんどの場合において人間のコスト >>>機械のコスト ○ fioに乗っければbundle installやDBのテスト も一瞬で終わりそうw ○ 時間を金で買う時代