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では、テストプロジェクトを簡単に追加できます。
手順:
- ソリューションエクスプローラーで「ソリューション」を右クリック
- 「追加」→「新しいプロジェクト」を選択
- 「単体テストプロジェクト(.NET Core または .NET)」を選択
- テストプロジェクト名を入力(例:
MyApp.Tests
) - 作成ボタンをクリック
すると xUnit
や MSTest
などのテンプレートが用意された状態で、テストコードを書く準備ができます。
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
パッケージで xunit
と xunit.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を活用して、より柔軟なテスト環境を整えていくと良いでしょう。
テストを「後回し」にするのではなく、「開発とセット」で取り組むことで、開発効率や品質は格段に向上します。