C#

【C#】自動でコーディング!?テスト駆動開発でバグがないプログラムを書く方法!

こんにちは、今回はテスト駆動開発についてレクチャーします。
私がC#で実際に現場に出てプログラミングをした時はバグ混在の嵐でした。

システム開発をしてて、ここだけちゃんと動いているか試験したい!
いろんなバリエーションでちゃんと動作するか試したいけど、試験データが…と四苦八苦していました。

そのころは、ウォッチで値を変更したりイミディエイトウィンドウで直接値を代入したりなど頑張っていました。
実はこれら単体テストはvisual studioの単体テストを利用すればあらゆるバリエーションの試験自動で行えます。

正直、1年目の頃に知りたかったし、教えて欲しかった…

と思うくらい、現場でプログラミングを学ぶことは期待しない方がいいです。

基本的にSESや派遣といった客先常駐の仕事は、マジで忙しいので、大体の現場は”プログラミング”を教えてくれません
また、その現場に完全依存するので、ためになる知識を教わるというよりかは「トラブルシューティング」が身に付くということの方が多いです。

そんなわけで、この記事を読んで少しでも「ヤバい…頑張ろう。。。」と思った方はぜひ勉強をスタートしてみてください!
信頼できるエキスパートを見つけることが”成長”への第一歩になります。

もちろん、会社の先輩や上司、学校の先生で良いと思います。

このブログで勉強する!エリ狐師匠!と思って貰えたら好きがこぼれ落ちます←

なぜテスト駆動開発をした方がいいのか

ちょっと脱線しちゃいましたが…そもそもなぜ「テスト駆動開発」をした方がいいのでしょうか。

テスト駆動開発とは、テストコードを書き、それに応じたプログラムを作成していくという開発手法になります。
テスト駆動開発をするとMVCやMVVMというとそれぞれ役割を分ける意味が理解できます。

またテスト駆動はテストコードに応じてコードが半自動生成されながらコーディングしていくので、非常にバグの混入率が低くなります。

テストコードの書き方


それでは、いつもの通り実装より解説していきます。
今回は前回のレクチャーで使用した「PROTEIN」プロジェクトを利用します。

PROTEINプロジェクトが分からない方は…
【プログラミング】悪いコードの特徴について解説する【C#】
※ぶっちゃけ、ほかのプロジェクトでもOKです


ソリューション「PROTEIN」を右クリックし、追加、「新しいプロジェクト」を選択します。

次にプロジェクトの選択画面にて「単体テスト」を選択し作成します。

このようにUnitTest1が表示されればOKです。
では、テストコードを書いていきましょう!

せっかくなので、PROTEINプロジェクトに「Calc」というクラスを用意してテスト駆動開発してみます。

このクラスに単体テストプロジェクトより「Add」というメソッドをテスト駆動で追加していきます。
まずは、UnitTestProject1でCalcクラスを参照しましょう。

「参照」を右クリックし、参照の追加よりPROTEINプロジェクトを参照してください。

このようにまずは書いてみてください。
[TestMethod]は各テストの属性です。
これを消してしまうとテストケースの判定がなくなるので注意してください。(テストだと判定されなくなる

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace UnitTestProject1
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void 足し算()
        {
            float ans = Calc.Add(1, 2);
            Assert.AreEqual(3, ans);
        }
    }
}

このように入力が完了したら、エラーを解消していきます。

上図のように「using」が不足しているので、追加してください。
すると、「Add」がCalcクラスにないから生成するか問われますので、選択して自動生成してください。

これらをすることで、Calcクラスを見てみると「Add」メソッドが追加されています。

赤波線が表示されている個所をクリックして、[ctrl] + [.(ドット)]を押すと解消方法の候補が表示されます!

テストを実行してみよう!

ここまでできたら、テストエクスプローラーより「足し算テスト」を実行しましょう。
もしテストエクスプローラーが表示されていない方は「ctrl + E」または表示から選択してください。

テスト実行をすると…

このように案の定、エラーとなりました。
これは、CalcクラスのAddメソッドの中身を実装していないからです。

しかし、Addメソッドの例外が発生したということは、「足し算」テストが動作していることが分かります。
つまり、これを正常に変えるころで、Addメソッドが正常に動作するプログラムが書けるということになるのです。

テスト駆動開発をする上で手順は…

  1. ユニットテストを作成する
  2. Unitテストに追加・変更するモジュールのテストコードを書く
  3. 赤波線のコードエラーを自動生成で解消する
  4. 試験ができるか一度試験エラーを確認する
  5. 試験を正常化させていく

この順番で開発していきます。

エラーを解消していく

今回は「足し算」ですので、Addメソッドに足し算のプログラムを書いていきます。

namespace PROTEIN
{
    public static class Calc
    {
        public static float Add(int v1, int v2)
        {
            return v1 + v2;
        }
    }
}

このように記述をしたら、再度テストを実行してみましょう!

無事にテスト結果が正常になりました。
つまり、Addメソッドは引数1と引数2を足して結果を返すモジュールが作成されたことがわかります。

今回は簡単なメソッドを例にしましたが、このようにテスト駆動開発をすることでテストファーストなバグのないプログラムを書くことができます。

まとめ

今回はテストコードの書き方とテスト駆動開発とはどのようなものなのかを簡単に解説していきました。
コードを自動生成することでスペルミス誤ったコーディングをすることがかなり低くなり、バグの混入率が下げられます。

しかし、テスト駆動開発はテストがしにくいものもあります。
例えば、データベースや画面といった外部に連携しているものや、データのインプット・アウトプットされるところです。

でも、これらテストがしにくいところもテスト駆動でコーディングする方法があるので、次回以降にまとめていきます!