『テスト駆動開発』第1部をC#で写経してみる(第1章)

はじめに

和田卓人さん訳の『テスト駆動開発』を以前に読了していたが、ふと思い立ったので復習がてら第1部の内容をC#で写経してみることにした。第1部は債権ポートフォリオ管理システムを多国通貨対応させる、というシナリオで話が進む。なお、写経に際して前提条件や細かい説明は省くので、詳細は実際に『テスト駆動開発』を読んで確認してみてほしい。

また、第1部は全部で17章あるので、実際にコードを書きながらチマチマ進めていきたい。

写経環境

言語

いわずもがなC#

IDE

Visual Studio 2017 Professional

テスティングフレームワーク

MSTest v2

第1章 仮実装 (Multi-Currency Money)

いきなりテストコードを書いてみる。

namespace TddStudyTest
{
    [TestClass]
    public class MoneyTest
    {
        [TestMethod]
        public void TestMultiplication()
        {
            Dollar five = new Dollar(5);
            five.times(2);
            Assert.AreEqual(10, five.amount);
        }
    }
}

この時点ではコンパイルエラーが発生する。Dollarクラスなど存在しないので当然だ。

そこでDollarクラスを作成し、times メソッドと amount フィールドを追加する。

namespace TddStudy.Money
{
    public class Dollar
    {
        public int amount;

        public Dollar(int amount)
        {
        }

        public void times(int multiplier)
        {
        }
    }
}

コンパイルエラーは取れたが、この状態でテストを実行させるとエラーになるので、最小限の対応を行ってみる。

namespace TddStudy.Money
{
    public class Dollar
    {
        public int amount = 10;

        public Dollar(int amount)
        {
        }

        public void times(int multiplier)
        {
        }
    }
}

10を2と5に分解し、テストコードと値を重複させてみる。

namespace TddStudy.Money
{
    public class Dollar
    {
        public int amount;

        public Dollar(int amount)
        {
        }

        public void times(int multiplier)
        {
            this.amount = 5 * 2;
        }
    }
}

仕上げにコンストラクタ内で amout の代入を行い、 times メソッド内で amout フィールドを参照するようにする。

namespace TddStudy.Money
{
    public class Dollar
    {
        public int amount;

        public Dollar(int amount)
        {
            this.amount = amount;
        }

        public void times(int multiplier)
        {
            this.amount *= multiplier;
        }
    }
}

これで一旦テストがパスできる状態になった。めでたしめでたし…ではないので、第2章に続く。

雑感

テスト対象クラスが存在しない状態からテストコードを書くことが非常に新鮮な体験だった。
小刻みな修正を行って一歩ずつ歩みを進めつつ、テストをパスしてグリーンバーを眺める安心感は何物にも代えがたいが、仮初めのグリーンバーなことも多々ある点に要注意。

カテゴリーTDD

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です