タグ: FizzBuzz

  • JavaでTDDに挑戦してみる(N+1回目

    JavaでTDDに挑戦してみる(N+1回目

    前回の記事はこちら

    参考にさせてもらってるのはこちら


    さて、前回までは、テストケースを作るところまで来ました。
    前回の参照

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

    さてここで、私はちょっと考えました。

    期待結果が同じものは、省いちゃっても良いんじゃないか説

    どっかで過去に学んだ説

    つまりNo. 1、2、3、5は、一つのケースにまとめてしまっても良いのではないか。
    クラス名のところ、組み合わせが、含まれているからです。

    • No.1は15, 5, 3
    • No.2は15, 5
    • No.3は15, 3
    • No.5は15

    これらが、細かな組み合わせによって出力するという設計になっているのであれば、それぞれ別のケースとして成立させる必要があるような気がしますが、今回はそんな設計にしていない(要件から、3の倍数はFizz、5の倍数はBuzz、15の倍数はFizzBuzzとするだけ)ので、端折っても良いのかなと思います。
    ただ、TDDという観点では、途中でリファクタリングを挟むことが一つのステップになっているので、まずは愚直に上記の10ケースを組んでいきたいと思います。

    No.1 30でFizzBuzzと表示させる

    前回の記事を見るとわかりますが、本プログラムの方では、現状ではまだ「入力した数字をそのまま返す」状態にしかなっていません。

    これで、テストコードのほうを、30を入力したらFizzBuzzと表示させる、のところまで持っていってみたいと思います。

    で、実行した結果がこちら。予想通り失敗しました。30を入力したら、30を出力する、ってプログラムなので当然ですね。

    さて、この赤いバーを、緑に変える必要があります。

    まずはシンプルに、30を入力したら、FizzBuzzを返す、としてみます。

    この上なくシンプルなコード。IF文で、30を入れたらFizzBuzzを返すというコードを追加しました。

    結果はこちら。緑になりました。そりゃそうだ。

    これでNo.1は完了です。

    No.2 45でFizzBuzzと表示させる

    これもNo.1と同様に、45と入れたらFizzBuzzと返すようにするだけですね。

    まずテストコードを先に。

    実行、そしてエラー。ですが、一方で「入れた数字はそのまま返す」という要件のテストができていることを横目に感じつつ。

    では本プログラムの方を修正してみます。No.1と同様に、45をIF文で。

    else if がちょっと増えて、めんどくさいプログラムになってきたなー、と感じます。リファクタリングしたい欲がこうやって増えていくんでしょうか。
    バーはめでたくグリーンに。

    そりゃそうだ。
    まぁ、けど、これでNo.2は終了ですね。

    No.3 15でFizzBuzzと表示させる

    これもまた同様ですね。まず失敗コード、で本プログラムを修正という流れかと思うんですが、さすがにめんどくさくなってきました。ので、ここで、本プログラムの方にリファクタリングをしていきたいと思います。やり方としては、

    1. 現状:30でFizzBuzz、45でFizzBuzzとなっている
    2. リファクタリングの内容:15の倍数を取る場合は、FizzBuzzと表示させる

    こうすることで、本プログラム自体がすっきりするはずです。

    試しに15でFizzBuzzと出力するのを書いてみました。else if が2つ続いてて、しかもreturn がFizzBuzzと同様となっていて、効率的ではないように見えますね。

    まず、テストコードのほうは愚直にやっていく、と宣言した手前、こっちは整理せずに追加すべきだろうと考え、15でFizzBuzzを追加しました。

    そして、本プログラムのほう。
    こちらは、「15で割り切れる場合はFizzBuzzと表示させて」というプログラムにしてみました。

    テストを実行させてみます。見事、緑のバーになりました。

    これで、FizzBuzzと表示させるところは完了したように思います。

  • FizzBuzz問題をテスト設計してみる

    FizzBuzz問題をテスト設計してみる

    FizzBuzz問題とは

    FizzBuzz問題は、以下のようなリストになる。めっちゃシンプル。

    • 数字を1から100まで数える。
    • 数字が3の倍数に当たる時は、数字ではなくFizzと返す。
    • 数字が5の倍数に当たる時は、数字ではなくBuzzと返す。
    • 数字が15の倍数に当たる時は、数字ではなくFizzBuzzと返す。
    • 0以下、101以上はエラーを返す。

    テストケースを考えてみる

    数字をテスト条件として与え、期待結果を得るというブラックボックステストを考える時、最小テストケースになるのはどんなパターンになるか。
    私は以下のように考えてみた。が、テストエンジニアとして気になるのは、追加したい箇所として100、-1、Aなど。
    100は正常系、-1やAは例外系として扱われるだろう。

    与えたいテスト条件期待結果
    0エラー
    11
    3Fizz
    5Buzz
    15FizzBuzz
    101エラー
    テスト条件と、期待結果の対照表

    上記の例でいくと、テストケースは6つとなる。
    期待結果で同じ値を取るものとして、エラーが2つ挙げられる。
    これは見方によっては、どちらか一つでも良いかもしれない。
    けれど、境界値を考えた場合、両端に取るべきなので、私は2つにした。
    また、上述したけれど、-1やAなどを追加してみても良いかもしれない。
    それらを追加すると合計で8つになるか。テスト実行時間がそんなにかからないのであれば、テストケースとして加えてみても良いような気がする。

  • テスト駆動開発 4日目

    テスト駆動開発 4日目

    前回のところで、次のステップを書いたところ、予定通りにAttribute errorが出されました。

    Attribute Error で怒られた

    ちょっと待て

    違う、私がやりたかったのはケント・ベックさんのテスト駆動開発を写経したかったのではなく、Pythonでテスト駆動開発を体験したかったんでした。
    なぜケント・ベックさんのテスト駆動開発を参照したのかというと、テスト駆動開発へのとっかかりを思い出したかったからです。

    気を取り直す

    さて、それでは何の題材に選べば良いのか?とかるーくググったところ、fizzbuzz問題というのがありました。
    というか、とても良い写経の題材がありました。リンクはこちら。

    fizzbuzz問題ってなに?みたいなのはこのリンク先をご参照いただくとして、私の、このブログではテスト駆動開発を進めていきたいとおもいます。

    何は無くともToDoリスト

    最初は、ToDoリストを作るところから。ここから写経になります。

    1. 数を文字列にして返す
      1. 1の時は、1と表示する
      2. 2の時は、2と表示する
    2. 3の倍数はFizzと返す
    3. 5の倍数はBuzzと返す
    4. 3と5の倍数はFizzBuzzと返す

    そしてコード。ここも分からないことだらけですが、いったん写経してみます。ホント、Qiitaで書いてくださった方、感謝です

    import pytest
    
    class TestStringConvert:
        # 前準備
        @pytest.fixture
        def target(self):
            from fizz_buzz import string_convert
            return string_convert
        
        # 検証
        def test_return_value(self, target):
            assert target(1) == '1'

    ドキドキで実行してみると、出たよー見つからないやつー環境変数に追加しないといけないやつー。もう見慣れました。

    pytestはどこだよ!って怒られている

    もう疲れた、、今日はここをキャンプ地とさせていただきます。