Java でTDD(FizzBuzz問題)

表記、先日こちらのブログでもお伝えした通り自分のJavaプログラミングスキル自体が足りず、結局意味が分からなくて終わりにしました。

そこからJava入門の本を買って読んだりして、少しずつJavaのことを理解しようとしています。

本はこちらを購入しました。めちゃくちゃ分厚くて、まだ半分もいけていません。

スッキリわかるJava入門第3版 [ 中山清喬 ]

価格:2,860円
(2022/11/21 15:02時点)
感想(13件)

また、こちらのサイトを参考にしながら、ひたすら写経をしています。ほんとこちらの執筆をされた@tentomさんという方に足を向けて眠れないような感覚。

とはいえ、こちらのサイトで割愛されているところが私には到底難しくて分からず、けどなんとかしようということで、今頑張っているところです。
そのあたりを、こちらで書いていこうと思います。

前提

  • Visual Studio をMacにインストールして、そこで書いています
  • Extensionとして、Test Runner for Javaをインストールしています

とっかかり

まずは上記で書かれている、2の引数まで通るコードを書きました。
で、3は数字そのままではなく、Fizzを返す必要があるんですね。

FizzBuzzTestのほう。引数に3を与えたらFizzを返すところまで含めています
FizzBuzzのほう。参考にさせてもらってるブログで、2まで通ってるところそのまま
そのまま通し、怒られているところ。FizzがExpectedなのに3が返ってきてる!と怒られています

3でFizzが返ってくるようにFizzbuzz.javaを修正する

ここで、私の少ない知識をフル稼働させ、修正を試みます。

参考にさせてもらったサイトから、必要と思われているところを抜き出したもの。

3だけ条件式を作り、それ以外はそのまま、という流れ、ということなのかな、、半分くらい理解できていません。。

全部通りました。

次は5

3に倣い、5でBuzzが返ってくるようなものを作ってみます。

5のテストコードを追加したところ
はい、失敗。そりゃそうだ、Buzzが返ってくるようなコードを書いてないんだから。

ここで、普通に5を条件分岐で追加すれば良いのですが、

5の条件分岐を通したもの。
テストも通りました。

この辺で一度リファクタリングを

この辺りで、テストコードの方、毎回インスタンスを立ち上げる式を追加していて、これは冗長だなと思われます。

        FizzBuzz fizzbuzz = new FizzBuzz();

このコードを毎回追加するのではなく、最初にまとめて書けたらいいなぁと思いながら見てると、はい、元のサイトで以下のように追加しているのに気づきました。こういうふうに、立ち上げ時にやるんすね。

@Beforeとして最初にインスタンスを作るとこだけ切り出して書く
残念、、全部通らなくなってしまいました。

何が悪いのか。おそらく、メソッドを先に追加しなかったからなのかな、と。

今イマ、こんな感じ。@Beforeから始まるところを追加しています。fizzbuzzのところに赤いアンダーラインがあるということは、ここが悪い、ということですね。。

参照させてもらってるサイトを参考にし、メソッドを追加することにします。

赤いアンダーラインが消えた!(まだテスト実行はしていません

早速テストを流してみます。

全部通りませんでした。。ううーん。メソッドを追加したのは正解ではなかった模様です。
良く見ると、
@Before

のところに赤いアンダーラインが引いてあるんですよね。

“Before cannot be resolved to a type”とあります。ううーん。
カーソルを移動していくと、 @Beforeではなく、@BeforeAllの方が良さそう、みたいな提案を受けました。

再度流しても失敗。

また怒られて、長い英文が。。読むの辛い。

これはもう後で考えることにしよう。。コードを元に戻します。

気を取り直して15を

テスト用のコードに追加して、本文には15の倍数に関して何も追加しなかったのに、テストが通ってしまった図。

これはおかしい。3の倍数、5の倍数のところで先に処理しちゃってるから、ここに引っかかるものがなく通過してしまっているような気がします。

怪しいので最初に15の倍数を通るように処理を
すると、失敗しました。FizzBuzzを期待したのに、結果はFizzBuzzFizzBuzzと。
思わず笑ってしまいました。

多分、3と5の倍数でもあるから、そのせいなのかなと思ったり、、

試しに、5の倍数でBuzzっていうのを削除して、トライしてみると、

はいビンゴ、FizzFizzBuzzが返ってきました。

うーん。3と5を通らずに、15だけできるものは、、

答えはelse if

ぱっと思いつきました。そうじゃん、ifを並列に書いてたからダメで、else if を使って分岐させればいいんじゃん、と思いつきました。

else if を追加して書いたもの
テストもこの通り。

ここまできたら大きな山は超えたかな、という気分です。

0にトライ

あとは1未満と、101以上を超えたらダメですよ、を、元のサイトを参考にして追加してみます。

0のテストコードを追加。
何も変更していないのでエラー。ちなみに0ではFizzBuzzが返ってくるそうです。

ちなみに0では、なぜFizzBuzzが返ってくるのか。
以下、条件分岐のところで、最初に15の倍数で当ててるから、そこに0を入れても0になっちゃう、ということでFizzBuzzが返ってくるのかな、と思います。

今イマの、FizzBuzzのコード。

num < 1 の時にエラーを返すコードを追加しました。
うーん、なんか違うって言われました。。

本日のおさらい

  • FizzBuzz問題という題材を使って、3の倍数、5の倍数、15の倍数でそれぞれ処理させ、テストして内容が正しいことを学びました。
  • 1未満の時にエラー処理をさせたかったのですが、それがうまくコーディングできず、時間切れとなりました。
  • 101以上についても時間が足りず、作成していません。
  • 参照させてもらってるコードで、StringBuilderというパーツ?を使っていて、その内容をきちんと理解せずに使っています。多分、数字を入力する時に使うものなんだと思ってます。