3

私はそれに多くの条件を持つメソッドを持っています:

public bool IsLegalSomething(Order order)
{
    var item0 = order.Items.SingleOrDefault(x => x.ItemCode == "ItemCode0");
    var item1 = order.Items.SingleOrDefault(x => x.ItemCode == "ItemCode1");
    ...
    var itemN = order.Items.SingleOrDefault(x => x.ItemCode == "ItemCodeN");

    return ((item0.Status == Status.Open) && (item1.Status == Status.Closed)
         && ...
         && (itemN.Status == Status.Canceled));
}

この機能を単体テストしたいのですが、条件が多すぎて組み合わせごとに考えると単体テストの数が狂ってしまいます。その return ステートメントには 16 の条件があり、各条件は true/false であるため、2^16 の異なる組み合わせをチェックする必要があります。すべての条件が確実に利用されるようにするために、ここで 2^16 の異なる単体テストを作成する必要がありますか? これは簡単な例です。一部の機能には、法的要件により複雑な条件があります。

return (condition0 && condition1 && (condition2 || condition3)
     && (condition4 || (condition5 && condition6)) ...)

私の関数のいくつかの計算によると、条件が生成できるさまざまな組み合わせの数は数百万です! データ駆動型単体テスト (DDUT) とパラメーター化単体テスト (PUT) を調べましたが、単体テストが「空白を埋める」スタイルになっているだけです。さまざまな組み合わせと期待される結果をすべて提供する必要があります。例えば:

// Parameterized Unit Test
[TestCase(..., Result = true)]  // Combination 0
[TestCase(..., Result = true)]  // Combination 1
[TestCase(..., Result = false)] // Combination 2
public bool GivenInput_IsLegalSomething_ReturnsValidResult(...) { }

MSTest を使用してデータソース (csv など) を取得しても、同じ問題が発生します。さまざまな結果をもたらす組み合わせが多すぎます。私が知らない代替手段はありますか?

4

2 に答える 2