Slide 1

Slide 1 text

Cookpad Ruby Hack Challenge #4 カバレッジ特別回 2018/06/23 (Sat.)

Slide 2

Slide 2 text

事務連絡 • Gitter にお入りください – https://gitter.im/rubyhackchallenge/Lobby – URL やテキストの共有にお使いください • この資料は slideshare にあります – (あとでリンクにする) • 今日の資料は github にあります – https://github.com/ko1/rubyhackchallenge /blob/master/JA/6_coverage.md

Slide 3

Slide 3 text

今日の予定 • 13:00~ オープニングと自己紹介 • 13:20~ 講義 • 14:00~ 実習 • 16:30~ 成果発表 • 17:00 解散 ※すでに資料を読んできた人は講義を聞かずに実習を 始めても大丈夫です

Slide 4

Slide 4 text

今日の内容 • コードカバレッジを参考に Ruby のテストを書く – カバレッジ:どのコードを実行したか・していないか – 例:lib/irb/context.rb – https://rubyci.s3.amazonaws.com/debian8-coverage/ruby-trunk/lcov/ruby/lib/irb/context.rb.gcov.html 青:実行されている行 赤:実行されていない行 青:elseに 進んだ 赤:thenに 進んでない

Slide 5

Slide 5 text

今日の内容 • コードカバレッジを参考に Ruby のテストを書く – つまりどういうことかというと…… verbose? メソッド自体は 呼ばれているが @verbose = nil の 状態で呼ぶテストが 足りない模様

Slide 6

Slide 6 text

今日の内容 • コードカバレッジを参考に Ruby のテストを書く – 適当にテストを書き足してみる IRB.conf[:VERBOSE] = nil で @verbose = nil にできるらしい この条件下で verbose? メソッドを呼ぶテスト

Slide 7

Slide 7 text

今日の内容 • コードカバレッジを参考に Ruby のテストを書く – カバレッジの変化 @verbose.nil? の分岐が then 節に進んだ! then 節に 進んでいなかったのが まだ実行されてない 部分はあるけれども

Slide 8

Slide 8 text

目次 • Ruby のビルドとテストのやりかた(特急版) • カバレッジの測定方法 – C 言語コード(処理系本体)の部分 – Ruby コード(標準添付ライブラリ)の部分 • Ruby テストの構成と書き足し方

Slide 9

Slide 9 text

Ruby のビルドとテストのやり方(特急版) • 依存関係を入れる(Debian 系の場合) – sudo apt-get install git ruby autoconf bison gcc make zlib1g-dev libffi-dev libreadline-dev libgdbm-dev libssl-dev lcov • ソースを取ってくる – git https://git.ruby-lang.org/ruby.git • ビルドする – cd ruby – autoconf – ./configure --prefix=`pwd`/local – make • テストを実行する – make test-all

Slide 10

Slide 10 text

カバレッジの測定方法(C言語) • 古いビルド結果を全部消す(重要) – git clean -fxd • ビルド時の configure にオプションをつける – autoconf – ./configure --prefix=`pwd`/local --enable-gcov – make • テストを実行する – make test-all • カバレッジを可視化する – make lcov – ブラウザで lcov-c-out/index.html を開く

Slide 11

Slide 11 text

カバレッジの測定方法(Ruby) • 古いビルド結果を全部消す(重要) – git clean –fxd • ビルドは普通にやる – autoconf – ./configure --prefix=`pwd`/local – make • テストを COVERAGE=true 付きで実行する – make test-all COVERAGE=true – (coverage/index.html で可視化したものが見えるはず) • オプション:LCOV でカバレッジを可視化する – make lcov – ブラウザで lcov-rb-out/index.html を開く

Slide 12

Slide 12 text

Ruby テストの構成 • Ruby にはいっぱいテストスイートがある – make btest / make test-all / make test-spec – 遠藤は test-all しかよく知らない • make test-all の実態は test/ ディレクトリ – test/ruby: コアのテスト – test/(標準添付ライブラリ名): ライブラリのテスト – 他にも雰囲気でいろいろ置いてある • 特定のテストファイルだけを実行する方法 – make test-all TESTS=test/irb/test_context.rb – 指定しないと全部実行して遅いので、 テストを書き足したらそのファイルだけ実行してみるとよい

Slide 13

Slide 13 text

Ruby テストの書き足し方 • カバレッジを見て実行したい箇所の狙いをつける • 試行錯誤を繰り返していろいろ考える – ライブラリのコードを読解し、どうすれば実行できるか – 既存テストを読解し、どのようなテストを書けば良いか – テストを書いて実行し、当該箇所に徐々に迫っていく • make test-all TESTS=テストファイル で、テストを書き 足したファイルだけ実行すると速い • 毎回カバレッジをとっても良いが、当該箇所付近に出力 コードを突っ込んで print デバッグしたほうが速いかも – (マニュアル化したやり方はない、基本的に気合い)

Slide 14

Slide 14 text

ポイント:古いビルド結果を消す • C言語コードのテストを書く場合 – C言語コードのカバレッジは、gcc(C コンパイラ)に カバレッジ測定用バイナリを生成させて測定している – ソースコードを編集・リビルドすると、測定結果が おかしなことになる – C言語コードのテストを書くときは、ハマりたくなければビル ド結果を消す方がよい • Rubyコードのテストを書く場合 – ビルド全体を消す必要はないが、テスト実行のたびに test-coverage.dat ファイルを消す • Ruby のカバレッジデータを蓄積しているファイル