3

コレクションから合計を計算する簡単な方法があります。

public void MethodToTest(Collection<int> collection)
{
    int sum = 0;
    foreach (int value in collection)
    {
        sum += value;
    }
}

目標は、コマンド ラインで実行される opencoverage ツールを使用して、ブランチ カバレッジで 100% を取得することです。メソッド MethodToTest を呼び出す単体テストも取得しました。

[TestMethod]
public void TestMethodToTest()
{
    BomProviderMock mock = new BomProviderMock();
    BomManager bomManager = new BomManager(mock);

    List<int> list = new List<int>();
    for (int i = 0; i <= Int16.MaxValue; i++)
    {
        list.Add(i);
    }
    // Firts attempt with a non empty collection
    bomManager.MethodToTest(new Collection<int>(list));

    // Second attempt with an empty collection
    bomManager.MethodToTest(new Collection<int>());
}

ツール opencover を使用した後、メソッド MethodToTest は 80% の分岐カバレッジを獲得しました。私の質問は、foreach ループがブランチ カバレッジに影響を与えるかどうかです。もしそうなら、この単純なコードで 100% を得るにはどうすればよいでしょうか?

4

2 に答える 2

2

foreach ループの代わりにいくつかの linq を使用して、質問を少し更新しました。乱数(ただし、同じサイズのリスト)を使用するため、コンパイラーは「それをかき出して」計算する必要はありません。

メソッドで合計を使用するか、それを返すことをお勧めします。結果が変わる可能性があります。

最後になりましたが、100% に執着しないでください。現実の大きなプロジェクトでは決して起こりません。ブレーキをかける可能性のあるものを必ずテストし、テストを念頭に置いてソフトウェアを構築してください。そうすれば、簡単に実行できます。

void Main()
{
    Random r = new Random();
    List<int> list = Enumerable.Range(1,Int16.MaxValue)
                               .Select (e => r.Next(0,Int16.MaxValue))
                               .ToList();

    // Firts attempt with a non empty collection
    MethodToTest(new Collection<int>(list));

    // Second attempt with an empty collection
    MethodToTest(new Collection<int>());
}

// Define other methods and classes here
public void MethodToTest(Collection<int> collection)
{
    var sum = collection.Sum (i => i);
    // do something with it. If you're just voiding it and it doesn't get 
    // used, it might be removed by compiler.
}
于 2014-09-30T22:00:09.430 に答える