「テスト駆動開発?」「テストコード?」まったくわからない方にも画像を使いながら丁寧に解説します。このテスト駆動開発を学べば,C#でよりよいアーキテクチャーでのコーディングが可能になり,保守性の高いコードが書けるようになります。
テストコードとは?
テストコードとは,「ユニットテスト」と呼ばれるもので,プログラミングが正しいかどうかを検証するコードの事です。C#の開発環境では最近のVisual Studio2015などでは
標準で使用できます。
プログラムに対してテストコードを記述しておけば,自動的にテストされ,OKかNGかを毎回教えてくれます。
何かの修正や機能追加でプログラムコードを変更したときに,不具合が混入すればすぐに発見することができます。
近年ではテストコードを記述するのは当然であり,テストコードのないプログラムは怖くて触れないコードという扱いになっています。
昔はVBなどで作成していたころは,そんなことは気にせずに,どんどんプログラミングしていましたが,今のスタンダードはできるだけテストコードでカバーされている
プログラムを書くことがよい事とされています。
では実際にテストコードを書いてみましょう。
Visual Studio2017を使用しますが,ユニットテストが書ければバージョンは何でも構いません。
単体テストプロジェクトの作成
「単体テストプロジェクト」を追加します。
ソリューション名は「TDD」,名前は「TDDTest.Tests」としています。
フォルダはお好きなところを選んでください。
次のようなコードが自動生成されます。
using System; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace TDDTest.Tests { [TestClass] public class UnitTest1 { [TestMethod] public void TestMethod1() { } } }
ここにテストコードを書いていくのですが,テストする対象が必要です。
今作成したプロジェクトはテスト用のプロジェクトで実際のアプリケーションを動作させるプログラムか記述しません。実際のアプリケーションのプログラミングをするプロジェクトを作成しましょう。
Windowsフォームプロジェクトの作成
今回はわかりやすくWindowsフォームで解説します。それではWindowsフォームプロジェクトを作成しましょう。
名前は「TDD.Winform」とします。
フォームが作成されますが今は使いません。
Winformプロジェクトを右クリックして「追加」から「新しいフォルダー」を選びます。
作成されたフォルダーの名前を「Objects」とします。
この作成されたObjectsフォルダーに「追加」から「クラス」を選んで
「Calculation」というクラスを作成します。
作成されたクラスに次のようなADDメソッドを追記します。
namespace TDD.Winform.Objects { public class Calculation { public int Add(int a,int b) { return a + b; } } }
Addメソッドは引数のaとbの足し算をしてその値を返却します。今からテストコードでこのコードが正しく動作しているかをテストしていきます。
参照の追加
Testsプロジェクトの参照を右クリックして「参照の追加」を選択します。
TDD.Winformにチェックをいれて「OK」を押下。
これでTestsプロジェクトからWinformプロジェクトが参照できるようになりました。
テストコードの記述
それではテストコードを書いていきましょう。
とりあえずデフォルトで作成されているテストファイル「UnitTest1.cs」に書きましょう。
using System; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace TDDTest.Tests { [TestClass] public class UnitTest1 { [TestMethod] public void TestMethod1() { var calculation = new TDD.Winform.Objects.Calculation(); int result = calculation.Add(3, 5); Assert.AreEqual(8, result); } } }
これでCalculationクラスのAddメソッドに対してテストコードが書けました。
「3プラス5は8になっているはず!」というテストコードになっています。
次の3行のうち,1行目と2行目は普通のクラスの使い方と同じです。
var calculation = new TDD.Winform.Objects.Calculation(); int result = calculation.Add(3, 5); Assert.AreEqual(8, result);
テストコード特有のものは3行目の「Assert.AreEqual(8, result);」の部分です。
「Assert.AreEqual」は第1引数と第2引数がイコールかどうかをチェックし,テストエクスプローラーに成功か失敗かを示してくれます。
それではテストを実行してみましょう。
テストエクスプローラーの表示
ツールメニューの「テスト」から「ウィンドウ」を選択し「テストエクスプローラー」を表示します。
表示出来たら「すべて実行」をクリックします。
緑色のレ点マークが出れば成功です。これでAddメソッドは正しく動作していることが保証されました。念のためNGになるかも見ておきましょう。
あえてテストを失敗させる
テストコードが誤っていればコードが正しくてもNGになります。
using System; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace TDDTest.Tests { [TestClass] public class UnitTest1 { [TestMethod] public void TestMethod1() { var calculation = new TDD.Winform.Objects.Calculation(); int result = calculation.Add(3, 5); Assert.AreEqual(7, result); } } }
例えば「Assert.AreEqual(7, result);」など誤ったテストコードを書いている場合はNGになります。もう一度「すべて実行」をクリックします。
赤い×マークになり失敗となっていますね。
下の方には失敗した原因も記されています。
今回はテストコードをあえて間違えて書きましたが,通常はAddメソッド側に不具合がありNGになるケースと,今回のようにテストコードを書き間違えているケースの2種類あります。
また,TestMethod1()の上に[TestMethod]という記述がありますが,これは非常に大事です。これを書き忘れるとテストされません。試しに一度削除してテストを実行してみましょう。
テストエクスプローラーに何も出てこなくなりました。
今回はテストが1件しかないのでおかしいことに気づけますが,数百件などテスト結果が出ているときは気づかない恐れがあります。