Menu
Coddy logo textTech

ユニットテスト (NUnit/xUnit)

CoddyのC#ジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 67/70。

challenge icon

チャレンジ

簡単

ユニットテストを追加して、Library Systemプロジェクトを完成させましょう!テストは、コードが正しく動作し、変更を加えても動作し続けることを保証するために不可欠です。ライブラリシステムのコア機能を検証する専用のテストファイルを作成します。

既存のプロジェクト構造を引き続き使用し、新しいテストファイルを追加します。

  • Book.cs: IdTitleAuthorIsAvailable、および Borrow()Return() メソッドを持つBookクラスを保持します。
  • User.cs: 貸出追跡、MaxBooks 定数、CanBorrow()、および貸出中の本を管理するメソッドを持つUserクラスを保持します。
  • Library.cs: 貸出ロジック、検索メソッド、および GetAllBooks()GetAllUsers() メソッドを持つLibraryクラスを保持します。
  • LibraryTests.cs: これは新しいテストファイルです!ライブラリシステムが正しく動作することを検証するテストクラスを作成します。さまざまなシナリオをチェックし、各テストが成功したか失敗したかを報告するテストメソッドを記述します。
  • Program.cs: テストを実行し、結果を表示するエントリポイントです。

テストクラスには、以下のシナリオをテストするメソッドを含める必要があります。

  • TestBookBorrow - 利用可能な本の貸出が成功し、その利用可能性が変更されることを検証します
  • TestBookBorrowUnavailable - すでに貸出中の本の貸出が適切に失敗することを検証します
  • TestUserBorrowingLimit - ユーザーが3冊を超えて本を借りられないことを検証します
  • TestBookReturn - 貸出中の本の返却が正しく機能することを検証します
  • TestSearchByAuthor - 著者による検索が正しい本を返すことを検証します

各テストメソッドは、テストが成功したかどうかを示すブール値を返す必要があります。すべてのテストを実行し、結果を出力するシンプルなテストランナーを作成します。

以下の入力を受け取ります:

  • 実行するテストシナリオの数(1〜5、上記のテストに対応)

実行される各テストについて、次の形式で結果を出力します:

{TestName}: {PASS|FAIL}

すべてのテストが完了したら、サマリーを出力します:

--- Test Summary ---
Passed: {count}
Failed: {count}
Total: {count}

例えば、入力が以下のようであれば:

3

出力は以下のようになります:

TestBookBorrow: PASS
TestBookBorrowUnavailable: PASS
TestUserBorrowingLimit: PASS
--- Test Summary ---
Passed: 3
Failed: 0
Total: 3

5つのテストすべてを実行する場合の別の例:

5

出力は以下のようになります:

TestBookBorrow: PASS
TestBookBorrowUnavailable: PASS
TestUserBorrowingLimit: PASS
TestBookReturn: PASS
TestSearchByAuthor: PASS
--- Test Summary ---
Passed: 5
Failed: 0
Total: 5

テストの独立性を確保するために、各テストでBook、User、Libraryの新しいインスタンスを作成する必要があります。これにより、あるテストの状態が別のテストに影響を与えないようになります。各テストを、システムの特定の動作を自己完結的に検証するものとして考えてください!

自分で試してみよう

using System;
using Library.Tests;

class Program
{
    public static void Main(string[] args)
    {
        // TODO: BorrowingServiceTests のインスタンスを作成する
        
        // TODO: 各テストメソッドを実行し、各結果の前にテスト名を出力する
        // 例:
        // Console.WriteLine("BorrowBook_WhenBookAvailable_ReturnsTrue");
        // tests.BorrowBook_WhenBookAvailable_ReturnsTrue();
        
    }
}

オブジェクト指向プログラミングのすべてのレッスン