JUnit/Javaテスティング界隈でBoostする為に『JUnit実践入門』を元に学習計画を立ててみる #junitbook

2012/11/21(水) 書籍『JUnit実践入門』発売!

ついに来週11/21(水)、書籍『JUnit実践入門』が発売されます。

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)


著者はブログ『やさしいデスマーチ』でお馴染み、Shuji Watanabe (TwitterID:@shuji_w6e)さん。1年近い執筆活動・レビューを経てようやく発売と相成りました。


上記エントリ『JUnit実践入門の読みどころ』に記載されている目次などを見るだけでも、JUnitを使ったユニットテストについて網羅的且つ詳細に記載・解説されている”実践ガイド"の決定版と言える内容になっている事は確認出来ると思います。

で、自身のJUnit/Testing鍛錬の道はと言うと…

TDDBC東京1.6を手始めにTDDBCにはこれまでに都合3回参加し(うち1回はスタッフ的立場で参加させて頂き)、その他関連イベントや個人的に勉強してみるなどもしてみたりもしました。

…んがしかし!JUnit及びJavaテストに関するスキルは向上したかと言えば、自信を持って『Yes!』とは正直言いがたい状況。(^_^;) まぁ確かにテストに触れる機会は増えているものの、職場等で日常的に日々テストを書いている訳でも無し、テストに関する深い造詣を得られている訳でもなし。

Bootはしたものの、Boostは出来ていない?的な。

そこで『JUnit実践入門』をベースに学習プランを立ててみる

…と思ってた所にこの書籍が近々発売されるそうだ、そして内容はこのような感じである、という情報を見て『ちょうど良いタイミングだし、この書籍をベースに色々勉強してみよう』と思い立ち、目標(と言うか計画)を先に立ててブログにUPする事でブログUP駆動?計画駆動?で勉強を後押ししてみようと。

"Boost"については個々人で意味合い、定義付けがそれぞれあると思いますが、ここでは

  • 直近で学んで居る言語(Java)についてTDDを初めてみる=Boot
  • Java(及びJava界隈の言語で)色々なテスティング手法について学ぶ=Boost

と位置付け、様々な環境手法でテスト出来る様になる事を目標にしてみようと思いました。ある程度到達出来たらまた別の側面でBoost出来るように色々考えてみる。

学習プラン(案)

基本は書籍『JUnit実践入門』をテーマに沿って読解&写経。

その後、そのテーマから関連・派生する技術、テーマ、環境等についてもその他の書籍やWeb資料を元に勉強を進め、ある程度まで行ったら一旦終了、次のテーマへ、と言う感じ。

『Day X』って分けてるけど別に1日で終えようと言う訳でも無く、区切りの意味合いで。

以下、shuji_w6eさんのエントリを参考に勉強したいテーマを並べていく。

Day 1:<JUnit入門・JUnitの機能について>
<Part1 JUnit入門>
Part1はチュートリアルとユニットテストの概論となっています。これからユニットテストを学びたいプログラマだけでなく、ユニットテストはなんとなく実施しているけど、どうももやっとしている方は、是非読んでください。体系的にユニットテストの知識を整理することで、本書の内容を深く理解できると思います。

<Part2 JUnitの機能と拡張>
Part2は本書のメインパートです。JUnitの様々な機能を、必要となった背景を踏まえて解説しています。JUnit4.10で使える機能はほぼ網羅していますので、しばらくJUnitを離れてた方にとっては新鮮な情報となるでしょう。
とはいえ、実践での使用頻度には差があると思います。まずは4章のアサーションと6章のテストコンテキストで紹介するEnclosedテストランナーは即効性の高い機能ですので、オススメです。

この部分についてはJUnit本体の機能解説なので、書籍をそのままなぞる形で。


(追記)この辺りに関しては、以前個人でもちょろっと調べたりしてみていた所でもあったりするのでおさらい・復習的な部分もあったりするが、せっかくなので(書籍の通り)Javaでも書いてみて、その上でGroovyで同じ内容のコードを書き直していくという試みをしてみても良いかなと思ってみたり。

以前Yokohama.groovy絡みでJUnit x GroovyやGroovy Testingについて写経してみた事がありますが、ここで改めてGroovyを持ち出して色々試してみるのも面白そう。うむ、やってみよう。

Day 2:<CIとテストを絡めて学ぶ>
<第15章 継続的テスト―すばやいフィードバックを手に入れる―>
十分なユニットテストが作られたプロジェクトは、それだけで良いプロジェクトかもしれません。しかし、そこに達するにはモチベーションを高め、効果を最大限にする必要もあるでしょう。そのためには継続的テストを実践するため、Jenkinsを導入するのが一番です。
第15章では、継続的テストに必要となるバージョン管理・自動化・継続インテグレーションツールについて解説します。バージョン管理については触る程度ですが、Mavenで自動化をする方法については十分な解説を用意しました。Mavenでテストまで自動化できれば、あとはJenkinsに簡単な設定を行うだけです。すぐに継続的テストの環境を手に入れることができるでしょう。
<第14章 カバレッジ―テスト網羅率の測定―>
第14章はユニットテストを語る上では外せないカバレッジについて解説します。
カバレッジは使い方を間違えなければ心強いツールですが、使い方を間違えるととんでもないことになることは、皆さんご存じでしょう。本書では、カバレッジの目的と効果について誤った使い方がされないようにはっきりと記述しましたのでご安心ください。
本書ではEclipseから簡単に利用でき、Mavenからもカバレッジを測定しやすくなったEclEMMAを紹介します。

単体ベース?のテストクラスがあるプロジェクトをバージョン管理し、Jenkinsと連携し、各種解析機構でプロジェクトを計測・測定する部分について進めてみる。一度やっちゃえばどうって事無い(環境構築までのスピード感的に)んだろうけど、何気に着手出来てないのでここでやる。

Jenkins

Jenkins

Jenkins実践入門 ?ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)

Jenkins実践入門 ?ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)

Jenkins周りはこの辺りの書籍も参考にしつつ。

Day 3:
<第11章 テストダブル―テスタビリティと、モック/スタブによるテスト―>
第11章はテストダブルに関して解説し、ライブラリとしてMockitoを紹介しています。
テストダブルとは、モックやスタブなど代役として利用するオブジェクトを指す用語です。本章ではユニットテストでテストしにくい部分に、どのようにテストダブルを適用するかを解説しています。実際にテストダブルを活用するには、リファクタリングが必要不可欠ですが、テスタビリティを高めるために必要なリファクタリングテクニックは本書でも解説しています。

また、モックとスタブの違いなど、はまりやすい部分も解説しています。

Day2の前かも知れないし、後述するDBテスト等の後かも知れないが、トピックとして列挙。

書籍ではMockitoが挙げられていたが、その他のモック関連ライブラリも調べてみたい。

  • Mockito
  • その他Mock関連ライブラリ
    • JMockit
    • EasyMock
    • MockRunner
    • GroovyでMockとか
Day 4:<データベース周りのテストについて>
<第12章 データベースのテスト―テストコードで外部システムを制御する―>
第12章は、データベースのテストに関するポイントと、DbUnitについて解説しています。
この章では、データベースに依存する部分をどのように設計し、どのようにテスト設計をするかを解説しています。データベースのテストはデータベースの状態を管理することがすべてです。コツさえ掴めればそれほど難しくありません。
なお、本章ではDbUnitの解説はそれほど多くありません。DbUnitの機能をJUnit4で使うためにカスタムルールやカスタムMatcherを応用する方法を解説しました。

こちらは書籍にてDbUnitを扱っているのでまずはそこから。

次いで、そもそもデータベース周りのテストをやるにはどういう点に気を付けるべきかとか、トピック的な部分があれば調べてみる。
後はDBやO/Rマッパ周りのライブラリではどういう風にテストが出来るのか、辺りをちょろっと調べてみたいなと。

Day 5:
<第17章 振舞駆動開発―ストーリーをテスト可能にする―>
ここまで書いたならばBDDも入れてしまおうとCucumberによる受け入れテストの自動化が最後の章になります。テスト駆動開発はすぐれたプラクティスですが、どうしても「木を見て森を見ず」になりがちです。やはり、全体を俯瞰した視点でのテストは必要であり、そこから落とし込む方法は有効な開発手法です。
第17章ではCucumberを利用したアウトサイドインの開発について簡単なチュートリアルとなっています。WEB+DB Press誌での特集とほとんど同じ内容ですが、ユニットテストを学んだ上での受け入れテストとしては重要な章となります。

書籍ではcucumner(cucumber-junit)を採り上げているので、まずはそこから。次いでBDD x Java (及びG*)で比較的使われてそうなフレームワークを調べてみる。JavaでBDDだとJnarioってのが良いよ!というご意見を頂いたのでその辺も探ってみたい。

  • Cucumber-junit
  • その他BDD関連
Day 6:<ブラウザ・Webテストについて>

この項については書籍には載っていないのですが、Seleniumを中心としたテスト技法も昨今必須になってきているのでやらねばなるまい。と言う事でPickUp。Web周りと言う事で負荷テストツールも押さえておく。この辺あんままだ詳しくないので後日また調べて展開。

  • Selenium(Webテスト自動化:)
  • Geb(Webテスト自動化:Groovyを使ってJQuery風の要素指定ができるようにしたもの)
  • Betamax(Webテスト自動化:Webへのアクセスを記録して再生することのできるrecord/playback proxy)
  • 負荷テストツール(jMeterとか最近の新しいやつとか)
Day 7:<問題演習>

ここについてはイベント的に何か『皆で解いてみる』とか良いのでは無いかなと思いざっくり括ってみました。まぁ別に個別でも良いんですが。


まずは16章でTDDについて理解を深め、

<第16章 テスト駆動開発―テストファーストで設計する―>
前書きでも触れましたが、本書はTDD BootCampで id:t-wada さんから様々な刺激を受けた所が出発点です。したがって、テスト駆動開発(TDD)は触れないわけにはいかないでしょう。
第16章ではテスト駆動開発のチュートリアルとなっています。テスト駆動開発をやるために必要な考え方やテクニックが頭に入りやすいように工夫しました。TDDBCに参加するならば、先に読んでおくと和田さんの講演への理解が深まること必至です。
本書でユニットテストの基礎力を付けテスト駆動開発の雰囲気をつかみ、もっと学びたいと思ったならば「実践テスト駆動開発」で実践的な演習を行うとベストなのではないでしょうか?

18章以降の演習問題で実践力を鍛える。

<Part5 演習問題>
さて、ここまでで350ページ近くあるのですが、本当にユニットテストが実践できるようになれるのか、不安になるでしょう。やはり手を動かしてテストコードを書きまくらなければ、なかなか実践できるようにならないのです。本文中も豊富にサンプルコードを用意しましたが、もっとたくさんサンプルコードをということで、Part5に演習問題を用意しました。
演習問題は簡単なモノから応用力が必要なモノまで18題あります。写経するだけでも力がつくと思います。

演習問題の章だけでも60ページ18問ありますので、上記で言及されているように『力がつく』のでは。


『第13章 Androidのテスト』については現状ちょっと距離感が通いのもあるので(そっちのお仕事してればアレだけど)、ここでは挙げませんでした。機会があればその時って事で…(´・ω・`)


…とまぁ、7つのテーマに分けて思いつく限り勉強したい項目を挙げてみたんですけれど、とてもじゃないけど(ボリューム的に)7日間じゃ終わんねぇw

未踏の分野に足を踏み入れ、使えるスキルとして身に付けて行く為の第一歩って事で、ちょいと風呂敷を広げてみました。適宜学んだ内容等も何らかの形でアウトプット出来ればと思います。(※途中で頓挫してたとしても温かい目で見守ってやってください)