卒業研究でテスト駆動開発(TDD)を研究してると聞いて

TLで面白いつぶやきを見つけた。

最近Javaやってないし、久しぶりにJUnitで遊んでみようかなぁー。
という訳で、やってみた。

まずはJUnitLogGetをインストールする

と、いきなりエラーにw

Cannot complete the install because of a conflicting dependency.
  Software being installed: JUnitLogGet 1.0.2.201006180845 (jp.sagauniv.JUnitLogGet.feature.feature.group 1.0.2.201006180845)
  Software currently installed: Eclipse IDE for Java EE Developers 1.2.1.20090918-0703 (epp.package.jee 1.2.1.20090918-0703)
  Only one of the following can be installed at once: 
    Core Resource Management 3.5.0.v20090512 (org.eclipse.core.resources 3.5.0.v20090512)
    Core Resource Management 3.5.2.R35x_v20091203-1235 (org.eclipse.core.resources 3.5.2.R35x_v20091203-1235)
    Core Resource Management 3.5.1.R35x_v20090826-0451 (org.eclipse.core.resources 3.5.1.R35x_v20090826-0451)
  Cannot satisfy dependency:
    From: Eclipse IDE for Java EE Developers 1.2.1.20090918-0703 (epp.package.jee 1.2.1.20090918-0703)
    To: org.eclipse.epp.package.jee.feature.feature.group [1.2.1.20090918-0703]
  Cannot satisfy dependency:
    From: JUnitLogGet 1.0.2.201006180845 (jp.sagauniv.JUnitLogGet.feature.feature.group 1.0.2.201006180845)
    To: org.eclipse.core.resources 3.5.2
  Cannot satisfy dependency:
    From: Java EE IDE Feature 1.2.1.20090918-0703 (org.eclipse.epp.package.jee.feature.feature.group 1.2.1.20090918-0703)
    To: org.eclipse.platform.feature.group [3.5.1.R35x_v20090910-9gEeG1_FthkNDSP2odXdThaOu9GFDPn83DGB7]
  Cannot satisfy dependency:
    From: Eclipse Platform 3.5.1.R35x_v20090910-9gEeG1_FthkNDSP2odXdThaOu9GFDPn83DGB7 (org.eclipse.platform.feature.group 3.5.1.R35x_v20090910-9gEeG1_FthkNDSP2odXdThaOu9GFDPn83DGB7)
    To: org.eclipse.core.resources [3.5.1.R35x_v20090826-0451]

Java EE Developersが無いのが原因かな?
「ヘルプ」→「更新の確認」でチェックしてみると、Java EE Developersの項目があったので更新してみた。

そして、再度JUnitLogGetをインストールすると上手くインストールできました。

課題に掛かった時間

  • 課題1(10分)
  • 課題2(20分)
  • 課題3(25分)
  • 課題4(1時間35分)


課題4の「Readerを引数にとるコンストラクタ」を確認するテストケースを書こうとして、ハマりました。
少し時間掛かりましたが、途中で「コンストラクタのテストが要るのか?」と考え、コンストラクタ部分のテストコードは書かずに進めました。*1

気になるところをリファクタ

コメントを付けたり、テスト・スイートにまとめたり。

  • リファクタ(30分)

課題4の仕様について

MyDataWriterの仕様が少し曖昧な気がする。

  • MyDataWriter
    • Writerオブジェクトを受け取ってそれを保持するコンストラク
    • 変数名とその値を受け取って、Writerに格納するvoid writeData(String name, String value)
  • writeDataメソッドの動作例は以下のようになります。
    • 初期状態が””(空)である文字列に対してwriteData(“test”, “value”)した場合、文字列は”test:value\n”に変更される
    • 初期状態が””(空)である文字列に対してwriteData(“”, “anydata”)またはwriteData(null, “anydata”)した場合、文字列は””(空)のまま

初期状態が””(空)でない文字列に対してwriteDataメソッドを呼び出したときの仕様が不明確。
少なくとも、下記のパターンの仕様が欲しい。

  • 初期状態が”test:value\n”である文字列に対してwriteData(“test”, “value”)した場合、文字列は○○に変更される
  • 初期状態が”test:value\n”である文字列に対してwriteData(“sample”, “example”)した場合、文字列は○○に変更される
  • 初期状態が”test:value\n”である文字列に対してwriteData(“”, “anydata”)またはwriteData(null, “anydata”)した場合、文字列は○○(のまま/に変更される)


それとも、ここまで考えずに最小限の仕様を満たせばOKという課題なのかな。
とりあえず、最小限のテストケースを通る物は作り終わった。

感想

やっぱりテストコードを書いた経験が少ないため、どのようにテストを書くべきか分からない所が多い。例えば、

  • テストメソッドを増やすか?それともassertThatを増やすか?
  • コメント、Javadocはどの程度書くのが良いのか?(どの程度時間を掛けるか?)
  • 仕様にない部分(限界値、起こりうるException)をどの程度テストコードに書くのか?

たぶん経験によるものも多いだろうけど、機会があれば勉強会でも聞いてみたい。

*1:テストコードが書けなかったという理由もありますが。。。