单元测试功能

时间:2011-07-15 04:14:08

标签: c# visual-studio unit-testing

在编写单元测试时,我遇到了一个非常有趣的问题。

我可以在测试代码中使用该功能时测试一个功能吗?

例如,

如果我有一个List<int>类,其中有一个名为Add()的函数。

我想测试一个目标列表对象,其中包含两个int:1和2。 现在我添加第三个数字:3,并希望断言数字已成功添加。所以我写道:

public void TestMethod()
{
     //initialize
     List<int> list = new List<int>();
     list.Add(1);
     list.Add(2);

     //do operation
     list.Add(3);
     Assert.IsTrue(list.Contains(3));
}

但是,上面的测试用例,试图测试目标函数:Add(),已经使用Add()进行初始化。我认为这种核心关系可能会在某些条件下导致某些问题,一般来说......

有没有测试理论说我们不能这样做?

谢谢!

4 个答案:

答案 0 :(得分:4)

功能可能需要多个测试。在这种情况下,您将拥有一个仅测试一个Add()的函数,然后测试您上面的函数。只要两者都通过,您就可以(合理地)确信您的结果是可靠的。但是,如果第一次测试失败,则应该忽略第二次测试的结果。

但理想情况下,您可以访问正在测试的内部状态,因此可以提供一种不同方式来设置不涉及调用被测函数的初始条件。

答案 1 :(得分:2)

在这种情况下,最好让测试更全面。我可能会这样做:

public void TestMethod()
{
    //initialize
    List<int> list = new List<int>();
    list.Add(1);
    list.Add(2);

    // Test setup
    Assert.IsTrue(List.Count == 2);
    Assert.IsTrue(List[0] == 1);
    Assert.IsTrue(List[1] == 2);

    //do operation
    list.Add(3);
    Assert.IsTrue(List.Count == 3);
    Assert.IsTrue(List[0] == 1);
    Assert.IsTrue(List[1] == 2);
    Assert.IsTrue(List[2] == 3);
}

答案 2 :(得分:0)

没有什么可以阻止你这样做,但是在这个特定的例子中我没有看到这样做的价值。

还有其他可能有效的情况,例如:您想要测试特定行为的位置:

1)根据传递的参数值,第3次调用将影响对象位的状态与以前的不同。

2)第三次使用相同的方法时,您会遇到一些特殊行为,例如3次无效登录尝试。

答案 3 :(得分:0)

我认为编写类似于示例中的测试方法并不罕见。重要的是我们看待它的方式。

如果我们对TestMethod()的意图是测试Add(),我们不应该使用Add()在测试中建立前提条件

如果我们对TestMethod()的意图是测试Add()和Contain()的交互/序列,那就应该没问题。