JavaでTDDに挑戦してみる(n回目

何度挑戦しているか分からないんですが、相変わらず仕事の切れ目とか、ちょっと落ち着いた時間帯にやったりしています。

参考にしているのはこちら

私の現在地

  • Javaはほとんど初心者です。Hello, Java!は書けます
  • テスト駆動開発は、ケントベックさんの本を何度か読みました。そこで写経しつつ、JavaでのTDDを理解しました
  • 使ってるIDEはEclipseです。Javaをなんとか自分のものにしたかったので。
  • QA経験は長いです。キャリア17年とか。テスト駆動開発の良し悪しとか、JSTQBのALTM持ってたりとか。今は事業会社でQAやってます。

ケントベックさんの本はこちら。JavaとPythonで、TDDについて順を追って書いてあります。プログラムのことがわからなくても、読んでみると新たな発見があるかもしれません。

テスト駆動開発/KentBeck/和田卓人【3000円以上送料無料】

価格:3,080円
(2023/6/2 18:29時点)
感想(0件)

どこまで進んでいるか

上述した、参考にさせてもらってるサイトで、ここまで来ています。
とりあえず入力値をそのまま返すようプログラムを組み、テストの方は2を入れてそのまま返すところまで。

FizzBuzz.java
FizzBuzzTest.java

次のステップは、3を入れたらFizzと返すところでしょうか。

FizzBuzz問題のテストを考えてみる

ちょっとその前に、テストの組み立てを考えてみたいと思います。
今更ですがFizzBuzz問題の要件はこちら。まだ初心者なので簡略化しています。上述した、参考にさせてもらってるサイトではちゃんとしたものを書いているので、本物を知りたい方はそちらをご参照ください。

  1. 数字は1から100まで。
  2. 3では、Fizzと返す。
  3. 5では、Buzzと返す。
  4. 100では、FizzBuzzと返す。

さて、テストケースはどうなるか。
私はここで、同値分割を考えてみたいと思います。同値分割というのは、結果が同じになる範囲をひとまとまり(これを同値クラスと理解しています)にし、そこから適当な値をピックアップするやり方、という理解です。

  • 3の倍数クラス
  • 5の倍数クラス
  • 15の倍数クラス
  • 上記以外

シンプルに4つ、と言いたいところですが、3、5、15は公倍数があるので(45とか)、そこは15が優先されるというふうに考えると順番が変わるのかなと思います。ここで追加要件として、以下を追加してみたいと思います。

  • 2つ以上の組み合わせで公倍数となる場合は、数字の大きい方を優先する。

すると、以下のようになります。

  1. 15、5、3の倍数クラス
  2. 15、5の倍数クラス
  3. 15、3の倍数クラス
  4. 5、3の倍数クラス
  5. 15の倍数クラス
  6. 5の倍数クラス
  7. 3の倍数クラス
  8. 上記以外

さてここで問題が発生しました。
上記、1と、例えば6では、ピックアップする数字がかぶってしまうことがわかりました。
例えば、1では15と5と3なので、30を選ぶとしましょう。
そうすると、6でも、30が選べちゃうわけです。
こういう時、自分のルールとして、数字の若い方でピックアップされた数字は、選ばないということにしたいと思います。

さて、それでは数字を選んでみましょう。

/

No.クラス名ピックアップした数字
115, 5, 330
215, 545
315, 315
45, 360
51575
6510
739
8上記以外71
FizzBuzz問題の同値分割

これで十分でしょうか。私の要件であれば、十分なのかもしれないです、が、最初の要件(数字は1から100まで)を忘れていました。
ここは境界値分析が使えそうです。
ホントは0と101を加えたいんですが、残念ながら私のJavaスキルでは、どうやってもエラーを期待結果と置くことができなかったので、泣く泣く省略したいと思います。
なので、シンプルに、1と100を追加したいと思います。

上記の表に1と100を追加してみます。

No.クラス名ピックアップした数字期待結果
115, 5, 330FizzBuzz
215, 545FizzBuzz
315, 315FizzBuzz
45, 360Buzz
51575FizzBuzz
6510Buzz
739Fizz
8上記以外7171
9111
10100100100
FizzBuzz問題の同値分割(1と100を追加、そして期待結果も追加

これでようやく、全ケースが揃いました。ほんとは数字とか、全角半角とかもあるかなーと思ったんですが、ここではTDDを体験することが目的なので、上記で十分だろうということにします。

と思ったんですが、書いてて力尽きました。ここから先はまた改めて。こっからようやくTDDってところなんですけどね。