カテゴリ: C# 更新日: 2026/04/22

C#のテストコード入門!テストメソッドの命名規約と書き方のコツ

C#のテストメソッドの命名規約とベストプラクティス
C#のテストメソッドの命名規約とベストプラクティス

先生と生徒の会話形式で理解しよう

生徒

「C#でプログラムを書いた後、正しく動くか一通りの動作を確認するのが大変なんです。もっと楽な方法はありますか?」

先生

「それはユニットテストという自動テストの仕組みを使うのが一番ですね。プログラムが自動でプログラムをチェックしてくれるんですよ。」

生徒

「自動でチェック!それは便利そうですね。でも、テストの書き方や名前に決まりはあるんでしょうか?」

先生

「はい、テストメソッドの命名規約やベストプラクティスという良い書き方の習慣があります。それらを学ぶことで、誰が見ても分かりやすいテストが書けるようになりますよ!」

1. ユニットテストとは何か?

1. ユニットテストとは何か?
1. ユニットテストとは何か?

プログラミングの世界では、自分が書いたコードが期待通りに動くかどうかを確認する作業をテストと呼びます。特に、関数やメソッドといったプログラムの最小単位ごとに動作を確認することをユニットテスト(単体テスト)と言います。

パソコンを初めて触る方にとっては、わざわざテスト用のプログラムを書くのは二度手間に感じるかもしれません。しかし、大規模なソフトウェア開発では、一部分を修正した時に他の場所が壊れていないかを一瞬で確認するために、この自動テストが欠かせません。テストを自動化することで、手作業による確認ミスを防ぎ、開発のスピードを劇的に上げることができます。

2. テストメソッドの命名規約が重要な理由

2. テストメソッドの命名規約が重要な理由
2. テストメソッドの命名規約が重要な理由

テストプログラムを書く際、そのテストが「何を」「どんな状況で」「どうなることを期待して」実行しているのかを一目で理解できるように名前を付ける必要があります。これを命名規約と呼びます。プログラミングにおける規約とは、チームや個人で守るべきルールのことです。

もし名前が「Test1」や「CheckResult」のように適当だと、後でテストが失敗した時に、何が原因でエラーになったのかを探すのがとても大変になります。分かりやすい名前を付けておくことで、エラー画面を見ただけで「ああ、あの機能がこういう状況で失敗したんだな」とすぐに判断できるようになります。

3. 定番の命名スタイル:UnitOfWork_StateUnderTest_ExpectedBehavior

3. 定番の命名スタイル:UnitOfWork_StateUnderTest_ExpectedBehavior
3. 定番の命名スタイル:UnitOfWork_StateUnderTest_ExpectedBehavior

C#のテストメソッド名で最もよく使われる形式の一つに、アンダースコアで三つの要素を繋ぐ方法があります。具体的には以下の構成になります。

  • UnitOfWork(何を):テスト対象のメソッド名や機能名。
  • StateUnderTest(どんな状況で):入力値や前提条件。
  • ExpectedBehavior(どうなるべきか):期待される結果。

例えば、「計算機クラスの足し算メソッド」を「数値が1と2の時」にテストして「結果が3になる」ことを確認する場合、メソッド名は以下のようになります。


[TestMethod]
public void Add_WhenCalledWithOneAndTwo_ShouldReturnThree()
{
    // ここにテストの内容を書く
}

このように、名前だけでテストの内容が全て説明されている状態が理想的です。

4. テストコードの基本構成:AAAパターン

4. テストコードの基本構成:AAAパターン
4. テストコードの基本構成:AAAパターン

テストコードを書くときには、構成を整理するためのAAA(トリプルエー)パターンというものがあります。これは、テストの中身を三つの段階に分けて記述する書き方です。

  • Arrange(準備):テストに必要なデータやオブジェクトを用意します。
  • Act(実行):実際にテストしたい機能を動かします。
  • Assert(検証):実行した結果が、予想通りの答えになっているかを確認します。

実際のコード例を見てみましょう。まずは足し算を行うシンプルな計算機のテストです。


[TestMethod]
public void Add_InputTwoNumbers_ReturnsSum()
{
    // Arrange(準備)
    var calculator = new Calculator();
    int a = 10;
    int b = 20;

    // Act(実行)
    int result = calculator.Add(a, b);

    // Assert(検証)
    Assert.AreEqual(30, result);
}

このように分けて書くことで、誰が読んでも「どこで準備して、どこで実行しているか」が明確になります。

5. 分かりやすい名前を付けるための日本語の活用

5. 分かりやすい名前を付けるための日本語の活用
5. 分かりやすい名前を付けるための日本語の活用

実は、日本の開発現場ではテストメソッド名に日本語を使用することもあります。英語が得意でないメンバーが多い場合や、仕様書としての役割を重視したい場合に有効です。プログラム本体は英語で書き、テストコードだけは分かりやすさ優先で日本語にするという選択肢もあります。


[TestMethod]
public void 足し算メソッド_正の数同士を入力したとき_合計値が返ること()
{
    // テストの内容
}

これなら、プログラミング初心者の方でも何を確認しているのかがすぐに分かりますね。ただし、プロジェクトのルールによって英語のみと決まっている場合もあるので、状況に合わせて使い分けましょう。

6. テストのベストプラクティス:1つのテストで1つの検証

6. テストのベストプラクティス:1つのテストで1つの検証
6. テストのベストプラクティス:1つのテストで1つの検証

テストを書く上での重要なコツ(ベストプラクティス)の一つは、「一つのテストメソッドで一つのことだけを確認する」ことです。欲張って、一つのメソッドの中で足し算、引き算、掛け算を全部チェックしようとしてはいけません。

なぜなら、もし途中でエラーが発生した場合、残りの検証が実行されなくなってしまい、どこまでが正しく動いているのかが分からなくなるからです。細かく分けておくことで、どの機能が壊れているのかをピンポイントで特定できます。

7. 文字列処理のテスト例

7. 文字列処理のテスト例
7. 文字列処理のテスト例

次に、文字を扱う処理のテストを見てみましょう。例えば、名前に「さん」を付けて挨拶を返す機能のテストです。ここでは、名前が空っぽだった場合にどうなるかも想定します。


[TestMethod]
public void Greet_WhenNameIsProvided_ReturnsGreetingWithSuffix()
{
    // Arrange
    var greeter = new Greeter();
    string name = "田中";

    // Act
    string result = greeter.Greet(name);

    // Assert
    Assert.AreEqual("こんにちは、田中さん", result);
}

[TestMethod]
public void Greet_WhenNameIsEmpty_ThrowsArgumentException()
{
    // Arrange
    var greeter = new Greeter();

    // Act & Assert
    // 名前が空の時はエラー(例外)が出ることを確認する
    Assert.ThrowsException<ArgumentException>(() => greeter.Greet(""));
}

このように、正しいデータを入れた場合だけでなく、間違ったデータを入れた時に正しくエラー(例外)を発生させるかを確認することも非常に重要です。

8. テスト結果の読み方とデバッグ

8. テスト結果の読み方とデバッグ
8. テスト結果の読み方とデバッグ

テストを実行すると、多くの場合ツール上で成功は「緑」、失敗は「赤」で表示されます。失敗したときはデバッグの出番です。デバッグとは、プログラムの間違い(バグ)を探して直す作業のことです。

テストが失敗した際、出力ウィンドウには「期待した値は10でしたが、実際には20でした」といったメッセージが表示されます。このメッセージを頼りに、計算式が間違っていないか、データの渡し方がおかしくないかを修正していきます。自動テストがあれば、修正した後に再度ボタンを押すだけで、直ったかどうかを即座に確認できます。

9. 論理値を確認するテスト

9. 論理値を確認するテスト
9. 論理値を確認するテスト

C#では、はい(True)かいいえ(False)で答えを出す処理も多いです。例えば、入力された年齢が成人かどうかを判定する機能をテストしてみましょう。ここでは「18歳以上ならTrue」というルールをテストします。


[TestMethod]
public void IsAdult_AgeIsEighteen_ReturnsTrue()
{
    // Arrange
    var checker = new AgeChecker();
    int age = 18;

    // Act
    bool result = checker.IsAdult(age);

    // Assert
    // 結果がTrueであることを確認する専用の命令
    Assert.IsTrue(result);
}

[TestMethod]
public void IsAdult_AgeIsSeventeen_ReturnsFalse()
{
    // Arrange
    var checker = new AgeChecker();
    int age = 17;

    // Act
    bool result = checker.IsAdult(age);

    // Assert
    // 結果がFalseであることを確認する専用の命令
    Assert.IsFalse(result);
}

境界線となる値(この場合は17歳と18歳)をしっかりとテストするのが、バグを防ぐためのプロのテクニックです。

10. テストしやすいコードを書く意識

10. テストしやすいコードを書く意識
10. テストしやすいコードを書く意識

最後に、最も大切なポイントをお伝えします。それは「テストを書くために、テストしやすいプログラムを書く」ということです。専門用語では「テスト容易性」と呼びます。

一つのメソッドに何百行も処理を書いたり、外部のファイルやデータベースに複雑に依存したプログラムを書いてしまうと、テストを行うための準備(Arrange)が非常に困難になります。小さく分割された、独立性の高いプログラムを書くことで、テストも書きやすくなり、結果として全体の品質が向上します。初心者のうちは、まずは小さな機能からテストを書く習慣をつけてみてください。

カテゴリの一覧へ
新着記事
New1
C#
C#のメソッドのオーバーロードとは?同名メソッドを複数定義する方法
New2
C#
C#の出力と入力の基本をマスター!初心者でもわかるConsole.WriteLine()とConsole.ReadLine()の使い方
New3
C#
C# GUIアプリでファイルダイアログを使う方法!WinFormsとWPFの基本操作を完全解説
New4
Azure
Azure SQL Databaseの認証設定を徹底解説!Entra ID(旧Azure AD)統合でセキュアなデータベース管理を実現する方法
人気記事
No.1
Java&Spring記事人気No1
C#
C#の日付型(DateTime)と基本的な使い方を解説|初心者向け入門ガイド
No.2
Java&Spring記事人気No2
C#
C#のpartialクラスとは?初心者でも理解できるクラス分割の基本
No.3
Java&Spring記事人気No3
C#
C#でswitch式を使う方法!C# 8.0以降の新機能を解説
No.4
Java&Spring記事人気No4
C#
C# WinForms入門!初心者でも簡単にWindowsアプリを作る方法
No.5
Java&Spring記事人気No5
C#
C#の文字列を数値に変換する方法(int.Parse・TryParse)をわかりやすく解説!
No.6
Java&Spring記事人気No6
C#
C#のログ出力入門!SerilogとNLogの使い方を徹底解説
No.7
Java&Spring記事人気No7
Azure
Azure Bastionの使い方を徹底解説!踏み台サーバー不要で安全にRDP/SSH接続
No.8
Java&Spring記事人気No8
C#
C#のWPFとは?XAMLでGUI開発を基礎から完全解説!初心者向けの入門ガイド