单元测试中的逻辑

时间:2012-03-20 13:46:42

标签: c# .net unit-testing tdd

我有这样的单元测试:

    [Test]
    public void DataIn_NoOfRowsReached_CreatesSequentialData()
    {
        //Assert
        MyLogic logic = SetupLogic();
        logic.NoOfRows = 3;

        logic.DataIn(1, "1,4,7");
        logic.DataIn(2, "2,5,8");
        logic.DataIn(3, "3,6,9");

        CollectionAssert.AreEqual(new[] { "1", "2", "3", "4", "5", "6", "7", "8", "9" }, logic.ExpectedValues);
    }

每个DataIn调用都会根据ID(第一个参数)将传入的数据添加到单独的列表中。当NoOfRows数等于DataIn输入Id时,它将数据合并为顺序数据。然后我测试一下这个。

我现在想要使用测试用例,但是如果不在测试方法中添加if语句和各种可选参数,我就看不到任何简单的方法。我真的不想复制各种场景的测试。

NoOfRows最大值为6。

3 个答案:

答案 0 :(得分:2)

我相信这就是你要找的东西。利用params keyword允许传入任意数量的字符串。

[Test]
public void DataIn_NoOfRowsReached_CreatesSequentialData()
{
    MyGenericTest("1,4,7", "2,5,8", "3,6,9");
}

private void MyGenericTest(params string[] inputs)
{
    //Assert
    MyLogic logic = SetupLogic();
    logic.NoOfRows = inputs.Length;

    List<string> allNumbers = new List<string>();
    for(int i = 0; i < inputs.Length; i++)
    {
       logic.DataIn(i + 1, inputs[i]);
       allNumbers.AddRange(inputs[i].Split(',');
    }

    allNumbers.Sort();
    CollectionAssert.AreEqual(allNumbers.Distinct(), logic.ExpectedValues);
}

这只是字符串排序...如果您的数字大于9,则需要add your own compare function to the Sort() method

答案 1 :(得分:1)

如果您正在使用NUnit并希望使用不同的输入运行多个测试用例,则可以使用Values属性http://nunit.com/index.php?p=values&r=2.6

您的单元测试可能如下所示:

[Test]
public void DataIn_NoOfRowsReached_CreatesSequentialData([Values(new[] { "1,4,7", "2,5,8", "3,6,9" }, ...)] string[] vals)
{
    //Assert
    MyLogic logic = SetupLogic();
    logic.NoOfRows = vals.Length;

    for (var i = 0; i < vals.Length; ++i)
      logic.DataIn(i + 1, vals[i]);

    CollectionAssert.AreEqual(new[] { "1", "2", "3", "4", "5", "6", "7", "8", "9" }, logic.ExpectedValues);
}

答案 2 :(得分:0)

如果你想编写一些“智能”测试,你可能可以用你输入的数字作为输入创建预期的数组并对它们进行排序,你可以跟踪你输入的数字作为每一行的一部分(使用一些数字)创建字符串)。除此之外,我没有看到太多改善。