An introduction and future of Ruby coverage library

Similar documents
目次 1. Serverspec とは 1.1. Serverspecとは 1.2. Serverspecで出来る事 2. セットアップ 2.1. 必要なもの 2.2. インストール 3. デモ 3.1. デモ環境について 3.2. テスト対象サーバーの登録 3.3. サンプルテストの中身 3.4.

クックパッドのテスト自動化

ruby novice ruby novice ruby novice.

スライド 1

CodeRecorderでカバレッジ

10th Developer Camp - B6

Ruby演習テキスト1

利用者

untitled

メソッドのまとめ

untitled

2 概要 市場で不具合が発生にした時 修正箇所は正常に動作するようにしたけど将来のことを考えるとメンテナンス性を向上させたいと考えた リファクタリングを実施して改善しようと考えた レガシーコードなのでどこから手をつけて良いものかわからない メトリクスを使ってリファクタリング対象を自動抽出する仕組みを

untitled

Microsoft PowerPoint - w5.pptx

Microsoft PowerPoint - ruby_instruction.ppt

Sinatra と MongoDB 今回は Sinatra で MongoDB の操作を体験してみます 進捗に合わせて ドライバから Ruby で使える便利な ORM の紹介をします

Microsoft PowerPoint - A1-2_株式会社ネクスト_藤澤正通_S _005.pptx

第 3 回 TERAS 成果報告会 TERAS V3 紹介と今後の展開 Tool Environment for Reliable and Accountable Software 一般社団法人 TERAS 理事開発委員長渡辺政彦 2014 年 3 月 12 日

1

1

1

V8.1新規機能紹介記事

S2BaseとZend Framework

slide5.pptx


コンパイラ演習第 11 回 2006/1/19 大山恵弘 佐藤秀明 今回の内容 バリアント / レコード 表現方法 型付け パターンマッチ 型付け switch 文への変換 簡単な最適化 マッチング漏れ 以降のフェーズでの処理 発展 exhaustivenessinformation の利用 パター

PowerPoint プレゼンテーション

1 現コンフィギュレータの問題点 1.1 独自言語 TOPPERS カーネル開発者 ( 特に TOPPERS カーネルのポーティングを行う者 ) は 現コンフィギュレータが提供する tf を使用する必要がある しかし tf は TOPPERS の独自言語であり 初めて TOPPERS カーネルを開発

bdd.gby

サービス付き高齢者向け住宅賠償責任保険.indd

大学等における社会人の受け入れ状況調査

機能検証トレーニング コース一覧

Microsoft PowerPoint - B4_理解度WG.pptx

Oracle Business Rules

Proc luaを初めて使ってみた -SASでの処理を条件に応じて変える- 淺井友紀 ( エイツーヘルスケア株式会社 ) I tried PROC LUA for the first time Tomoki Asai A2 Healthcare Corporation

目次 ペトリネットの概要 適用事例

Microsoft Word - VBA基礎(6).docx

プレポスト【解説】

sinfI2005_VBA.doc

2017_Eishin_Style_H01

81

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

Microsoft Word - no11.docx

PowerPoint プレゼンテーション

Using VectorCAST/C++ with Test Driven Development

HIGIS 3/プレゼンテーション資料/J_GrayA.ppt

PowerPoint プレゼンテーション

memcached 方式 (No Replication) 認証情報は ログインした tomcat と設定された各 memcached サーバーに認証情報を分割し振り分けて保管する memcached の方系がダウンした場合は ログインしたことのあるサーバーへのアクセスでは tomcat に認証情報

Taro-Basicの基礎・条件分岐(公

Si 知識情報処理

Microsoft Word 基_シラバス.doc

fp.gby

プログラミング実習I

<4D F736F F D208DCC91F088C48C8F955D89BF8F915F8DA196E5504A>

書式に示すように表示したい文字列をダブルクォーテーション (") の間に書けば良い ダブルクォーテーションで囲まれた文字列は 文字列リテラル と呼ばれる プログラム中では以下のように用いる プログラム例 1 printf(" 情報処理基礎 "); printf("c 言語の練習 "); printf

スライド 1

JavaScript Web JavaScript BitArrow BitArrow ( 4 ) Web VBA JavaScript JavaScript JavaScript Web Ajax(Asynchronous JavaScript + XML) Web. JavaScr

JUnit 概要 2015/4/16 版今泉俊幸 2015 bbreak Systems 1

PowerPoint プレゼンテーション

スライド 1

4校-報告書 pdf

多言語ドメイン名の実装 mdnkit 石曽根信 ( 株 ) SRA 2001/12/04 日本語ドメイン名解説 / mdnkit 1 mdnkit 多言語ドメイン名を扱うためのツールキット 正規化 エンコード変換等を提供するライブラリとコマンド 既存アプリケーシ

Prog1_10th

IronPython による柔軟なゲーム開発 筑波大学 AmusementCreators

LightSwitch で申請システム Windows ストアアプリで受付システムを構築してみた 情報政策グループ技術職員金森浩治 1. はじめに総合情報基盤センターでは 仮想サーバホスティングサービスや ソフトウェアライセンス貸与といった さまざまなエンドユーザ向けサービスを行っている 上記のよう

Ruby 2.3 のてざわり新機能と使いどころ Kunihiko Ito ESM 富山合同勉強会

Python によるジオプロセシング スクリプト入門

第 2 章 PL/SQL の基本記述 この章では PL/SQL プログラムの基本的な記述方法について説明します 1. 宣言部 2. 実行部 3. 例外処理部


情報実習Ⅱ

デジタル表現論・第6回

test.gby

PowerPoint プレゼンテーション

Microsoft PowerPoint - ●SWIM_ _INET掲載用.pptx


SERVIS Multi

数のディジタル化

POSIXスレッド

Java講座

(Microsoft PowerPoint - HP\227pWASABI\217\320\211\356\216\221\227\277.ppt)

Microsoft Word - Mac版 Eclipseの導入と設定.docx

プログラミングA

Microsoft PowerPoint - 13Kadai.pptx

目次 1. はじめに サービス概要 決済手段概要 契約体系 エンドユーザー向け購入手順 エンドユーザー向けサービス利用条件 エンドユーザー向け決済時認証方法..

REPORT



Python によるジオプロセシング スクリプト入門

. km. km. km

PowerPoint プレゼンテーション

プログラミング入門1

Microsoft PowerPoint - VBA解説1.ppt [互換モード]

はじめに パスワードセキュリティは 今日の情報セキュリティが直面している最も重要な問題の1つです 2017 Verizon Data Breach Reportによると 情報漏えいの81% はパスワードの脆弱さや盗難がきっかけで発生しています これらの問題を解決するため 多くの組織が多要素認証 (M

2. 目的 1RationalRose を利用する場合にプログラム仕様書としての最低限必要な記述項目を明確にする 2 プログラム仕様書として記載内容に不足がない事をチェックする 3UML の知識があるものであれば 仕様書の内容を理解できること 4Rose にて入力した内容を SoDaWord を利用

A4-3_ワースクアプリケーションズ大畠様_JaSST_2013_TOKYO_大畠悠介_公開.ppt

ソフトウェア基礎 Ⅰ Report#2 提出日 : 2009 年 8 月 11 日 所属 : 工学部情報工学科 学籍番号 : K 氏名 : 當銘孔太

PowerPoint プレゼンテーション

論理と計算(2)

haskell.gby

Microsoft PowerPoint ppt

Transcription:

Ruby の テストカバレッジ 測定機能の 改良と展望 クックパッド株式会社遠藤侑介 yusuke-oh@cookpad.com RubyWorld Conference 2017 (2017/11/01)

発表概要 発表内容 カバレッジとは カバレッジとの付き合い方 Ruby でのカバレッジ測定方法 クックパッドでのカバレッジ利用事例 発表者について フルタイム Ruby コミッタ (2017/09~) @ Cookpad Ruby プログラムの堅牢性を上げたい カバレッジから

発表概要 カバレッジとは カバレッジとの付き合い方 Rubyでのカバレッジ測定方法 クックパッドでのカバレッジ利用事例 まとめ

カバレッジとは テストの良さ を測る指標 コードカバレッジ テストカバレッジとも カバレッジを測定する効果 テストされていないコードがわかる テストの度合いを見積もれる Ruby ではカバレッジが極めて重要 現時点で テスト以外の検証手段が事実上ない Ruby 1.9 からカバレッジ測定機能を標準実装している 発表者が開発 メンテナンス中

カバレッジの種類 関数カバレッジ 行カバレッジ 分岐カバレッジ 他にも条件カバレッジ パスカバレッジなど

関数カバレッジ テストで実行された関数の割合 # code def foo; ; # def bar; ; # def baz; ; # # test foo baz 2/3 (67%) わかりやすい 可視化しやすい 指標としては弱い

行カバレッジ テストで実行された行の割合 # code def foo(x) if x == 0 p :foo else p :bar # test foo(1) # # # # 意味のない行は無視される 3/4 (75%) わかりやすい 可視化しやすい 指標としてはまだ弱い foo() if x == 0

分岐カバレッジ 真と偽の両方にジャンプした分岐の割合 # code def foo(x) p :foo if x == 0 # p :bar if x < 2 # # test foo(0) foo(1) 真の場合と偽の場合の両方が実行された 1/2 (50%) わりと網羅的 可視化が難しい

カバレッジの種類と Ruby の対応状況 わかりやすさ 可視化のしやすさ 関数カバレッジ行カバレッジ分岐カバレッジ 網羅性 Ruby 2.4 以下で測定できるか ユーザが実装可能 組み込みサポート 測定不可

カバレッジの種類と Ruby の対応状況 わかりやすさ 可視化のしやすさ 関数カバレッジ行カバレッジ分岐カバレッジ 網羅性 Ruby 2.4 以下で測定できるか Ruby 2.5 で測定できるか Ruby 2.5 は関数 分岐カバレッジを標準サポート予定 ( 開発版で実装済み )

発表概要 カバレッジとは カバレッジとの付き合い方 Rubyでのカバレッジ測定方法 クックパッドでのカバレッジ利用事例 まとめ

良いテスト とは コードに対して網羅的 カバレッジで測れる 仕様に対して網羅的 カバレッジで測れない

具体例 計算をする関数とテストを書いた # code def calculate(type, a, b) case type when "+" then a + b when "-" then a b # test calculate("+", 3, 4) #=> 7

具体例 計算をする関数とテストを書いた 分岐カバレッジを測定した テスト不足判明 # code def calculate(type, a, b) case type when "+" then a + b when "-" then a b # test calculate("+", 3, 4) #=> 7

具体例 計算をする関数とテストを書いた 分岐カバレッジを測定した テスト不足判明 テストを追加した カバレッジ 100% # code def calculate(type, a, b) case type when "+" then a + b when "-" then a b # test calculate("+", 3, 4) #=> 7 calculate("-", 4, 3) #=> 1

具体例 計算をする関数とテストを書いた 分岐カバレッジを測定した テスト不足判明 テストを追加した カバレッジ 100% 仕様で掛け算も要求されてた # code def calculate(type, a, b) case type when "+" then a + b when "-" then a b # test calculate("+", 3, 4) #=> 7 calculate("-", 4, 3) #=> 1

具体例 計算をする関数とテストを書いた 分岐カバレッジを測定した テスト不足判明 テストを追加した カバレッジ 100% 仕様で掛け算も要求されてた # code def calculate(type, a, b) case type when "+" then a + b when "-" then a b when "*" then a * b # test calculate("+", 3, 4) #=> 7 calculate("-", 4, 3) #=> 1 calculate("*", 2, 3) #=> 6

どうすればよかったか 計算をする関数とテストを書いた 分岐カバレッジを測定した テスト不足判明 この時点で焦ってテスト を書き足すのではなく どういう観点が不足していたか を考える # code def calculate(type, a, b) case type when "+" then a + b when "-" then a b # test calculate("+", 3, 4) #=> 7

カバレッジとの付き合い方 カバレッジは 考えるきっかけ として使う テスト不足のモジュール コードを見て テスト コードに不足していた観点を考える カバレッジは 目標 や 管理ツール ではない カバレッジ 90% 以上が必達目標! などというと 開発者は安易なテスト追加をしてしまう 安易なテストも無いよりマシだが 考えるきっかけ を失う

発表概要 カバレッジとは カバレッジとの付き合い方 Ruby でのカバレッジ測定方法 クックパッドでのカバレッジ利用事例 まとめ

Ruby でのカバレッジ測定方法 Ruby 組み込みカバレッジ測定機能を使う方法 coverage.so: 発表者が実装した標準ライブラリ Ruby 2.5 では関数 分岐カバレッジも測定できる SimpleCov を使う方法 ( 本日紹介 ) 広く普及している coverage.so のラッパ Ruby 2.4 でも動作する 現時点では行カバレッジのみ ( 将来的に関数 分岐カバレッジもサポート予定 )

例 コードとテストを書く code.rb def calculate(type, a, b) case type when "+" then a + b when "-" then a b code_spec.rb require "./code" describe " 計算 " do it "3 + 4 は 7 になること " do expect(calculate("+", 3, 4)).to eq 7

例 コードとテストを書く spec_helper.rb を右のように書く 必ずファイル先頭に書き足す.rspec ファイルも用意する code.rb def calculate(type, a, b) case type when "+" then a + b when "-" then a b code_spec.rb require "./code" describe " 計算 " do it "3 + 4 は 7 になること " do expect(calculate("+", 3, 4)).to eq 7 spec_helper.rb require "simplecov" SimpleCov.start.rspec --require./spec_helper

例 : 実行 $ rspec code_spec.rb. Finished in 0.00629 seconds (files took 0.20378 seconds to load) 1 example, 0 failures Coverage report generated for RSpec to /home/mame/tmp/coverage. 7 / 8 LOC (87.5%) covered.

例 : カバレッジの確認 ( 俯瞰 )

例 : カバレッジの確認 ( ファイル )

発表概要 カバレッジとは カバレッジとの付き合い方 Rubyでのカバレッジ測定方法 クックパッドでのカバレッジ利用事例 まとめ

クックパッドのサービス規模 レシピ数 :270 万品以上 月次利用者数 : 約 6000 万人 対応言語 :21 言語 67ヶ国 海外の月次利用者数 :3000 万人以上 プレミアム会員数 :190 万人以上

クックパッドのプログラム規模 世界でも有数の巨大 Rails アプリ https://speakerdeck.com/a_matsuda/ the-recipe-for-the-worlds-largest-rails-monolith

クックパッドのサービスのテスト 1 台の PC ではテスト実行に 2 日半 並列テスト実行システム (RRRSpec) で 10 分弱 RRRSpec master RRRSpec slave spec 実行 spec 実行 spec RRRSpec slave spec 実行 spec 実行 spec RRRSpec slave spec 実行 spec 実行 spec

カバレッジ測定 SimpleCov は独自並列実行を想定していない coverage.so で直接測定 集計した カバレッジ可視化ツール LCOV RRRSpec master カバレッジ集計サーバ カバレッジデータ RRRSpec slave spec 実行 spec 実行 spec RRRSpec slave spec 実行 spec 実行 spec RRRSpec slave spec 実行 spec 実行 spec

カバレッジ集計結果 Lines LOC クラス 数 メソッド数 関数 Cov. 行 Cov. Controllers は非常によくテストされている それ以外は改善の余地がありそう ( 既に不要なコードもあるので一概には言えないが ) 分岐 Cov. Controllers 47390 38179 516 3901 88% 90% 73% Helpers 15624 12763 18 1455 65% 73% 55% Models 91785 77238 1796 8537 63% 79% 52% Mailers 1847 1488 42 180 51% 65% 35% Workers 136 119 4 15 77% 87% 50% Chanko units 8387 6926 2 194 39% 57% 31% Libraries 43037 35667 598 3187 58% 69% 45%

カバレッジの分析例 (1) RecipeController#show この unless 文の中身が実行されたことがない メソッド先頭で同じ条件をチェック済みだった 不要なコードを発見できた 事後検証 : 先頭のチェックがあとから追加された

カバレッジの分析例 (2) レシピのモデル このあたりのメソッド群だけカバーされていない 現在はどこからも使われていないと判明 不要なコードを発見できた

カバレッジ分析の考察 事前知識なしでコードの改善点を発見できた 半日程度の分析で数カ所を発見した 発表者はクックパッドのソースコードだけでなく Rails の知識もほぼ持たない

発表概要 カバレッジとは カバレッジとの付き合い方 Rubyでのカバレッジ測定方法 クックパッドでのカバレッジ利用事例 まとめ

まとめ カバレッジとは何か : テストの良さ を測る指標 Ruby 2.4 で測定できる 行カバレッジ Ruby 2.5 で測定できる 行 関数 分岐カバレッジ カバレッジとの付き合い方 : 考えるきっかけ 目標 や 管理ツール として使わない Ruby でのカバレッジ測定方法 クックパッドの Rails アプリでカバレッジ利用事例 簡単な分析事例を紹介した