C#上級

上級 C#で学ぶテスト駆動開発|ケーススタディ編

導入

テスト駆動開発(TDD)は、ソフトウェア開発のプロセスにおいて、コードを書く前にテストを作成する手法です。このアプローチは、特に複雑なビジネスロジックを扱うプロジェクトで効果を発揮します。本記事では、架空のプロジェクトを通じて、C#を用いたテスト駆動開発の実践的な適用方法を考察します。

教科書レベルの解説(テスト駆動開発)

重要な概念の整理

テスト駆動開発は、以下のサイクルを基本としています。まず、テストを作成し、その後に必要なコードを実装します。これにより、開発者は常にテストを意識し、機能の実装が期待通りに動作することを確認しながら進めることができます。

コード例(C#)


using System;
using System.Collections.Generic;

public class Order
{
    public List Items { get; private set; } = new List();

    public void AddItem(Item item)
    {
        if (item == null)
        {
            throw new ArgumentNullException(nameof(item), "Item cannot be null");
        }
        Items.Add(item);
    }

    public decimal GetTotal()
    {
        decimal total = 0;
        foreach (var item in Items)
        {
            total += item.Price;
        }
        return total;
    }
}

public class Item
{
    public string Name { get; }
    public decimal Price { get; }

    public Item(string name, decimal price)
    {
        Name = name;
        Price = price;
    }
}

コードの行ごとの解説

  1. using System; – C#の基本的な名前空間を使用します。
  2. using System.Collections.Generic; – ジェネリックコレクションを使用するための名前空間です。
  3. public class Order – 注文を表すクラスを定義します。
  4. public List Items { get; private set; } – 注文内のアイテムを保持するリストです。
  5. public void AddItem(Item item) – アイテムを追加するメソッドです。
  6. if (item == null) – アイテムがnullでないかを確認します。
  7. throw new ArgumentNullException – nullの場合、例外をスローします。
  8. Items.Add(item) – アイテムをリストに追加します。
  9. public decimal GetTotal() – 注文の合計金額を計算するメソッドです。
  10. foreach (var item in Items) – 各アイテムに対して合計を計算します。
  11. return total; – 合計金額を返します。

ケーススタディ編

架空のプロジェクトとして、オンラインストアの注文管理システムを考えます。このシステムでは、顧客が商品を選択し、カートに追加する機能が求められます。テスト駆動開発の観点から、最初に「アイテムをカートに追加する」機能のテストを作成します。

最初のテストでは、nullのアイテムを追加した場合に例外が発生することを確認します。次に、実際にアイテムを追加し、合計金額が正しく計算されるかをテストします。このプロセスを通じて、開発者は機能の実装が期待通りに動作することを常に確認しながら進めることができます。

落とし穴として、複数のアイテムを同時に追加する場合のテストを忘れがちです。この場合、合計金額が正しく計算されない可能性があります。このようなケースを考慮し、テストを充実させることが求められます。

まとめ

  • テスト駆動開発は、機能を実装する前にテストを作成する手法であり、特に複雑なビジネスロジックに有効です。
  • 実際のプロジェクトにおいては、テストケースを充実させることが落とし穴を避けるために重要です。
  • C#での実装を通じて、他のプログラミング言語でも同様の設計思想が適用できることを理解しました。