Categories: Cシャープ

C#でテストを行う方法とは?基本からユニットテストの書き方まで解説

C#で開発を進めるうえで、「テスト」は品質を保つために欠かせない工程です。特に、プログラムの一部を単体で検証できるユニットテストは、バグの早期発見やリファクタリングの安心感につながります。

本記事では、C#でのテストの基本的な考え方から、Visual Studioでのテストプロジェクトの作成、人気のテストフレームワーク「xUnit」「NUnit」などを用いたテストの書き方まで、実例を交えながらわかりやすく解説していきます。

これからテストに取り組みたい初心者の方や、なんとなく避けてきた方も、この機会に「C#テスト」の基本をしっかり身につけていきましょう。


テストとは?なぜ必要なのか

「テスト」とは、ソフトウェアが正しく動作することを確認するプロセスです。C#に限らず、プログラミング全般において重要な工程です。

テストの目的には以下があります。

  • バグの早期発見
  • 仕様通りの動作確認
  • 保守性の向上(変更しても壊れにくくなる)
  • チームでの信頼性の確保

特にC#のようなオブジェクト指向言語では、クラスやメソッドの単位で小さくテストを積み重ねる「ユニットテスト」が有効です。


ユニットテストとは?

ユニットテストとは、アプリケーションの最小単位である「メソッド」や「クラス」の挙動を確認するテストです。

たとえば、以下のようなメソッドがあったとします。

public class Calculator
{
public int Add(int a, int b)
{
return a + b;
}
}

この Add メソッドが正しく動くかを確認するのがユニットテストです。


Visual Studioでテストプロジェクトを作成する手順

Visual Studioでは、テストプロジェクトを簡単に追加できます。

手順:

  1. ソリューションエクスプローラーで「ソリューション」を右クリック
  2. 「追加」→「新しいプロジェクト」を選択
  3. 「単体テストプロジェクト(.NET Core または .NET)」を選択
  4. テストプロジェクト名を入力(例:MyApp.Tests
  5. 作成ボタンをクリック

すると xUnitMSTest などのテンプレートが用意された状態で、テストコードを書く準備ができます。


MSTestでの基本的なテストの書き方

Visual Studioに標準で付属している MSTest は学習コストが低く、初心者におすすめです。

サンプルコード:

using Microsoft.VisualStudio.TestTools.UnitTesting;
using MyApp;

namespace MyApp.Tests
{
[TestClass]
public class CalculatorTests
{
[TestMethod]
public void Add_ReturnsCorrectSum()
{
var calc = new Calculator();
int result = calc.Add(2, 3);
Assert.AreEqual(5, result);
}
}
}
  • [TestClass]:テストクラスに付与
  • [TestMethod]:テスト対象のメソッドに付与
  • Assert.AreEqual(expected, actual):結果の一致を検証

xUnitでのテスト実装方法

近年、人気が高まっているのが xUnit です。依存性注入やテストの柔軟性に優れています。

サンプルコード:

using Xunit;
using MyApp;

namespace MyApp.Tests
{
public class CalculatorTests
{
[Fact]
public void Add_ShouldReturnCorrectSum()
{
var calc = new Calculator();
int result = calc.Add(2, 3);
Assert.Equal(5, result);
}
}
}
  • [Fact]:引数なしのテストメソッド
  • Assert.Equal(expected, actual):結果の一致を検証

xUnit を使うには、NuGet パッケージで xunitxunit.runner.visualstudio を追加する必要があります。


NUnitによるテスト方法

NUnit もまた定番のフレームワークです。独自のアサーションや機能も豊富です。

using NUnit.Framework;
using MyApp;

namespace MyApp.Tests
{
[TestFixture]
public class CalculatorTests
{
[Test]
public void Add_ShouldReturnSum()
{
var calc = new Calculator();
var result = calc.Add(10, 5);
Assert.AreEqual(15, result);
}
}
}
  • [TestFixture]:テストクラスに指定
  • [Test]:テストメソッド
  • Assert.AreEqual() で検証

NUnitはxUnit同様、NuGetからインストールして使用します。


テストのベストプラクティス

テストコードを書くうえでのポイントを紹介します。

1. AAAパターンを守る

  • Arrange(準備)
  • Act(実行)
  • Assert(検証)

これを意識すると、読みやすく保守しやすいコードになります。

// Arrange
var calc = new Calculator();

// Act
var result = calc.Add(3, 4);

// Assert
Assert.AreEqual(7, result);

2. 一つのテストで一つのことだけを確認する

一つのメソッドで複数の期待結果を検証しないようにしましょう。

3. テストは定期的に実行する

テストは一度書いたら終わりではなく、継続的に実行し、CIツール(GitHub ActionsやAzure Pipelinesなど)と連携して自動化することが理想です。


モック(Mock)を使ったテスト

依存関係のあるクラスを使うときは、モックを使ってテストをシンプルにできます。

Moq というライブラリを使えば、以下のようにインターフェースを模倣できます。

var mock = new Mock<IUserRepository>();
mock.Setup(repo => repo.GetUserName(1)).Returns("Taro");

var service = new UserService(mock.Object);
Assert.Equal("Taro", service.GetUserName(1));

モックを使うことで、本番データベースなどに依存せず、単体でのテストが可能になります。


まとめ

C#でのテストは、Visual Studioを使えば比較的簡単に始められます。最初はMSTestでの基本をおさえ、慣れてきたらxUnitやNUnitを活用して、より柔軟なテスト環境を整えていくと良いでしょう。

テストを「後回し」にするのではなく、「開発とセット」で取り組むことで、開発効率や品質は格段に向上します。

upandup

Web制作の記事を中心に、暮らし、ビジネスに役立つ情報を発信します。 アフィリエイトにも参加しています。よろしくお願いいたします。