C# テスト駆動開発の実践方法:テストプロジェクトを追加する方法 #5

当連載ではテスト駆動開発を実施するために必要な基礎知識や実践方法を解説している連載です。これまでの4回の間にテスト駆動開発を行うための導入的な部分ができたと思っています。まだ読んでない人は以下をチェックしておきましょう。

さて、今回以降はもう少し技術的な部分にフォーカスを当てていきたいと思っています。実際にプログラムを組んだり、実際にテストを行ったりしたいと考えています。その中でも今回は一番初めとなる、テスト駆動開発の準備をする方法を解説します。

テストプロジェクトを追加する

テスト駆動開発などを行う場合は、通常のプロダクトコードから離れた場所に別のプロジェクトを追加して、テスト用プログラムからプロダクトプロジェクトを参照してテストを実施していくのが一般的です。

今回のメインテーマは、テストコードを配置するためのテストプロジェクトを追加してから、「C# テスト駆動開発の実践方法:テスト駆動開発の基本サイクル #3」でも解説した「レッド」の状態までを解説していきます。テスト駆動開発を実施するための準備ということになります。

今回は「Visual Studio 2019」を使用して、.Net Frameworkのコンソールアプリケーションを使用していきたいと思います。.Net FrameworkはWindowsしか動作しませんので、その他のOSでの実践を考える人は.Net Core用のコンソールアプリケーションを選択してください。

1.コンソールアプリを準備する

まずはじめにコンソールアプリケーションを準備しましょう。今回はアプリケーションの名前を「App01」としています。過去の連載でもそうでしたが、連載内で作成するコンソールアプリケーションは連番で作成していきます。

コンソールアプリケーションを作成すると上記のようになっていると思います。画像のように「テストエクスプローラー」が表示されていない場合は、メニューバーの「表示」から「テストエクスプローラー」を選択してください。

ここまで準備ができたら、次はテスト用プロジェクトを追加していきます。

2.テストプロジェクトを追加する

コンソールアプリケーションの準備ができたら、テスト用のプロジェクトを追加していきます。ソリューションエクスプローラーの「ソリューション」を右クリックして「追加」から「新しいプロジェクト」を選択しましょう。

すると以下のように追加するプロジェクトの種類を選択できますので、一覧の中から「単体テストプロジェクト(.Net Framework)」を選択します。

.Net Coreを使用している人は.Net Core用の単体テストプロジェクトを選択して「次へ」ボタンを押下してください。次の画面ではソリューション名を入力できますので、それっぽい名称を入力したら「作成」ボタンを押下します。

するとソリューションエクスプローラーにテスト用プロジェクトが準備されます。以下のようになっていたらテスト用プロジェクトの準備が完了です。

テストエクスプローラーのペインを掘っていくとテストの一覧が表示されます。現在は1ファイルしか存在せず、UnitTest1クラスのTestMethod1メソッドしかありません。

テストメソッドを追加していくとそれに応じてメソッドが追加されていきます。

3.参照を設定する

テストプロジェクトの準備が整ったら、次はテスト用プロジェクトからプロダクト用のプロジェクトが参照できるようにしていきます。TestProjectのペインを開くと「参照」という項目があるので、そこで右クリックをして「参照の追加」を選択します。

するとプロジェクトの一覧が表示されるので「App01」にチェックを入れます。そしたら「OK」ボタンを押下します。今はApp01プロジェクトしかありませんので迷いませんが、複数のプロジェクトが存在する場合はテストしたいプロジェクトを選択してください。

テストプロジェクトに参照が正しく追加されると、先ほどの「参照」を開いたところにApp01が追加されていると思います。

上記のようになってたらテストプロジェクトへの参照の設定は完了です。最後に簡単なテストを実施して「レッド」の状態を確認して見たいと思います。

4.テストを実施する

それでは簡単にテストを実施してみます。プロダクト用プロジェクトであるApp01に対して新規ファイル「Sample.cs」を作成して以下を記載します。

namespace App01
{
    public class Sample
    {
        public bool ReturnTrue()
        {
            return true;
        }
    }
}

余り大したクラスではありません。ReturnTrueメソッドを一つ持ち、単純にtrueを返しているpublicメソッドを書いただけです。それではテストプロジェクトに戻ります。

テストプロジェクトの「UnitTest01.cs」を選択してください。中にデフォルトで作成された「TestMethod1」メソッドがあると思います。個々のメソッド内にテストを書きます。メソッドを以下のようにしてみましょう。

[TestMethod]
public void TestMethod1()
{
    var sample = new App01.Sample();
    Assert.IsFalse(sample.ReturnTrue());
}

このように記載したらテストを実行します。テストを実行する場合は2つの方法があります。1つ目は、実行したいメソッドの行内で右クリックをして「テストの実行」を選択してテストを実行する方法です。

もう一つの方法はテストエクスプローラーから実行したいテストを選択して、右クリックを押下して「実行」を選択してテストを実行するという方法です。私は1つのテストを実施する場合はメソッド内の右クリックで実行することが多いです。なお、複数のテストを一括して実行させる場合はテストエクスプローラーからしかできませんので注意が必要です。

どちらの方法でも良いので、先ほど更新したTestMethod1のテストを実行させてみてください。すると以下のように「レッド」の状態になると思います。ここまで再現することができれば問題はありません。

今回はテストを準備するところまでを解説しました。テストクラスやテストメソッド、またテストの判定方法については今後に解説していきます。最後にApp01内のSample.csとTestProject内のUnitTest1.csの中身全体を記載しておきますので確認してみてください。

namespace App01
{
    public class Sample
    {
        public bool ReturnTrue()
        {
            return true;
        }
    }
}
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;

namespace TestProject
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            var sample = new App01.Sample();
            Assert.IsFalse(sample.ReturnTrue());
        }
    }
}